gpt4 book ai didi

c - 恢复解析中的错误标记(柠檬)

转载 作者:太空狗 更新时间:2023-10-29 15:33:55 26 4
gpt4 key购买 nike

我使用 Lemon 作为解析器生成器,如果您不了解 Lemon,它的错误处理与 yacc 和 bison 的相同。

Lemon 有一个选项可以在一组规则中定义错误标记,以捕获解析错误。生成的解析器的默认行为是销毁导致错误的标记;有什么方法可以覆盖此行为以便我可以保留 token ?

这是一个展示正在发生的事情的例子:基本上我将每个规则的标记附加在一起以改造输入字符串,这是一个示例语法:

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 或其他解析器生成器中解决这个问题,我会接受它作为答案:)

最佳答案

对于 yacc/bison,如果可能的话,解析错误会使工具进入错误恢复模式。它将尝试在通往“干净”状态的途中丢弃 token 。

我找不到 lemon 的引用,所以我无法显示一些 lemon 代码来解决这个问题,但是对于 yacc/bison,可以使用规则 here .

即,您需要调整您的错误规则以声明解析器可以使用 yyerrok 来防止它丢弃标记。接下来,它将尝试重新读取“坏” token ,因此您需要使用 yyclearin 清除它。最后,由于附加到错误代码的规则包含 token 的内容,因此您需要设置一个函数来调整输入堆栈,方法是获取当前 token 内容并创建一个具有相同内容的新(正确) token 。

例如,如果定义为 MyOther MyOther 的语法看到 MyTok MyOther:

stack
MyTok: "the text"
MyOther: "new text"

stack
MyOther: "the text"
MyOther: "new text"

为此,请考虑使用 yybackup .我找不到替代方法,尽管 yybackup 不受欢迎。

关于c - 恢复解析中的错误标记(柠檬),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3285258/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com