我使用 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"
作为输出。
如果您可以在野牛或其他解析器生成器中解决此问题,我会接受它作为答案:)