我使用柠檬作为解析器生成器,其错误处理与yacc和野牛的相同,如果您不知道柠檬。在解析(柠檬)中恢复错误标记
柠檬有一个选项可以在一组规则中定义错误标记以捕获分析错误。生成的解析器的默认行为是销毁导致错误的令牌;有什么方法可以重写这种行为,以便我可以保持令牌?
下面就来展示一下发生的事情为例:基本上我追加令牌每个规则一起改革输入字符串,这里是一个例子语法:
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"
因为文本“用户名”是由解析器中的部分(A):: =错误(B)规则,但我确实想要:
"Username Joseph1234"
作为输出。
如果你能解决野牛或此问题的另一个解析器发生器我会接受,作为一个答案:)
如果有人感兴趣,我最终转换到RE2C [[link](http://re2c.org/)]。用RE2C宏获取行为要容易得多。我编写了宏,以便任何不匹配的子字符串都是简单的输出,而任何匹配的子字符串都是由RE2C修改的。 – 2015-05-05 17:29:15