0

我已经设置了一个 flex/bison 系统,它可以通过 yyparse 运行和解析,并且能够在 repl 类型的系统中使用。当用户进入某个状态(例如:定义一个方法),并且出现系统税错误时,我正在寻找一种方法来处理这个问题,该野牛可以像用户从未进入过线。

例如:

1> class foo { <enter>
2>  a = 1;  <enter>
3>  asfasdfa <enter>

在这种情况下,解析器应该返回到读取最后一行之前的状态。现在,它将触发语法错误并倒回整个堆栈。

我知道野牛 yyparse() 函数有一些用于状态跟踪的本地堆栈状态值(yyvsp、yyssp 和 yylsp),但似乎没有办法在 YYERROR 等标准功能之外修改这些值。

我的问题是:在野牛中是否可以远程执行这些保存/恢复状态,如果没有,处理此类错误的最佳方法是什么。

4

2 回答 2

2

bison 没有保存和恢复解析器状态的工具。您可能可以通过对野牛骨架进行逆向工程来创建一个,但这将是很多工作,而且它也会非常脆弱,因为野牛的运行时可能会在没有通知的情况下发生变化。(公平地说,您不会被迫更新 bison,但您可能希望能够灵活地这样做。)

但是,解析非常快。在 REPL 环境中,您不会注意到解析时间。因此,没有什么可以阻止您从头开始重新解析输入,直到错误之前的行。

但是,有一个问题:bison 解析器在读取下一个标记之前不一定会检测到语法错误(尽管有时会检测到,这取决于错误的确切性质)。所以你不能确定最后一行读取的是实际包含语法错误的行。

于 2013-05-18T04:44:36.103 回答
1

您应该看看 Bison 中的推送解析器,它们可能会为您提供您正在寻找的控件。

http://www.gnu.org/software/bison/manual/html_node/Push-Decl.html

于 2013-05-20T12:46:13.207 回答