【发布时间】:2011-03-18 03:33:44
【问题描述】:
我使用 Lemon 作为解析器生成器,如果您不了解 Lemon,它的错误处理与 yacc 和 bison 相同。
Lemon 可以选择在一组规则中定义错误标记,以捕获解析错误。生成的解析器的默认行为是销毁导致错误的令牌;有没有办法覆盖这种行为,以便我可以保留令牌?
这是一个显示正在发生的事情的示例:基本上,我将每个规则的标记附加在一起以重新调整输入字符串,这是一个示例语法:
input ::= string(A) { printf("%s", A); } // Print the result
string(A) ::= string(B) part(C). { A = append(B, C); }
string(A) ::= part(B). { A = B; }
part(A) ::= NUMBER(B) NAME(C). { A = append(C, B); } // Rearrange the number and name
part(A) ::= error(B). { A = B; } // On error keep the token anyways
输入时:
"Username 1234Joseph"
我得到输出:
"Joseph1234"
因为“用户名”文本在 part(A) ::= error(B) 规则中被解析器丢弃,但我真的很想要:
"Username Joseph1234"
作为输出。
如果你可以在 bison 或其他解析器生成器中解决这个问题,我会接受它作为答案:)
【问题讨论】:
标签: c parsing token yacc lemon