1 个不稳定版本
0.0.0-dev1 | 2020年8月23日 |
---|
#1896 in 文本处理
150KB
3.5K SLoC
背景
本项目旨在使用解析器组合器创建一个完整的 Ruby 语言词法分析器。
MRI 的区别
- 控制字符可以递归转义
"\C-\C-\\n" # => "\n"
实现注意事项
表达式/语句/分组
- 在此实现中,表达式和语句之间没有语义上的区别
Token::Block
包含一系列语句(每个项目都被视为一个语句)Token::Expression
包含构成单个语句的标记列表- 通过括号的使用,块和表达式标记可以嵌套
(2 + (puts "hi"; 4 - 8;;)) * 5 #hi #=> -10
部分输入的词法分析
可以将 Input
类型扩展为跟踪一个表示词法分析器输入是否完整或部分(如 IRB 的 REPL)的布尔字段。在部分模式下,可能未完成的组合器(如开字符串、数组等)可以返回一个 Token::IncompleteInput
,以在它们的标记流末尾表示该标记尚未在用户输入的末尾完成。
我还没有确定是否应该使用开始/结束标记来处理复杂对象,但它们在处理部分输入时可能很有用。
待办事项
- https://doc.ruby-lang.org.cn/core-2.7.0/doc/syntax/literals_rdoc.html
- 有理数/复数数值字面量(r, i, ri)
- 这里文档 (<<, <<-, <<~, UNQUOTED, 'QUOTE', "DBL QUOTE",
CMD QUOTE
) - 数组
- 哈希表
- 范围
- 正则表达式
- 进程
- 百分号字符串
依赖项
~2MB
~41K SLoC