野牛匹配错误的令牌

时间:2012-02-08 13:05:10

标签: parsing bison yacc

虽然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。

我做错了什么?

1 个答案:

答案 0 :(得分:3)

[{}]   return *yytext;
[^{}\n]+ return ANYTHING;
\n     return EOL;

Lex贪婪:如果两个模式与当前输入匹配,则最长匹配获胜。在原始lex片段中,[^\n]+模式会捕获其中包含{}的行。

相关问题