虽然PLY有问题,但我尝试在野牛中重写相同的语法片段并遇到类似的问题。这表明我可能做错了什么。
语法片段的符号表示如下所示:
document -> fragment?
fragment -> { \n line* \n fragment? }
line -> [^\n]+ \n
相关的法律排名:
[{}] return *yytext;
[^\n]+ return ANYTHING;
\n return EOL;
相关的野牛系列:
multiline: '{' EOL lines EOL multiline '}'
|
;
lines: lines ANYTHING EOL
|
;
语法是确定性的,因为我知道甚至应该是LALR(1)(尽管没有真正尝试建立画面)。像"{\n\n}"
这样的文档解析好了,但multiline
元素嵌套的文档(例如"{\n\n{\n\n}}"
)没有,词法分析器将最后一个"}}"
视为一个标记{{ 1}}而不是两个"ANYTHING"
s。
我做错了什么?
答案 0 :(得分:3)
[{}] return *yytext;
[^{}\n]+ return ANYTHING;
\n return EOL;
Lex贪婪:如果两个模式与当前输入匹配,则最长匹配获胜。在原始lex片段中,[^\n]+
模式会捕获其中包含{
或}
的行。