【发布时间】:2019-08-02 07:56:01
【问题描述】:
我正在尝试为 Racket 中的 sed 语言编写词法分析器(例如“s/find/replace/”)。我遇到的一个问题是处理许多令牌没有确定的形式并且可以更改的事实。例如,我可以将上面的示例写为“ssfindsreplaces”,其中使用字母“s”而不是“/”。
我已经开始编写一个词法分析器,例如,
(define sed-lexer
(lexer-srcloc
["\n" (token 'NEWLINE lexeme)]
["/" (token 'DIVIDER lexeme]
[(:or "s" "y" "d" "p") (token 'CMD lexeme)]
[(:* (complement "/") (token 'LITERAL lexeme)]))
但这在多个层面上都失败了:
- 该命令只能出现在开头(在此简化示例中)。读取命令后,我想在换行之前忽略命令大小写。
- DIVIDER 标记不能始终设置为斜线。
我可以想象这个问题的解决方案可能是向这个词法分析器添加状态。例如,词法分析器从“开始”状态开始寻找命令,然后进入“分隔符1”状态,寻找分隔符字符。 http://pygments.org/docs/lexerdevelopment/ 这里似乎存在这样的功能。考虑到 Racket 生态系统中的工具,解决此问题的最佳方法是什么?
【问题讨论】:
-
您使用的是哪个词法分析器? github.com/racket/racket/wiki/…
-
我试图让它与“br-parser-tools/lex”的词法分析器一起工作,但我愿意寻求其他解决方案。