手动保存和恢复解析器状态

时间:2013-05-17 15:23:23

标签: bison read-eval-print-loop

我已经设置了一个可以在yyparse中运行和解析的flex / bison系统,并且可以在repl类型系统中使用。当用户进入某个状态(比如:定义一个方法),并且已经发出systax错误时,我正在寻找一种以这种方式处理这个问题的方法,即bison可以像用户从未进入过完全一致。

例如:

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

然而,解析非常快。在REPL环境中,您没有注意到解析时间。因此,没有什么可以阻止你简单地从开头重新分配输入,直到错误之前的那一行。

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

答案 1 :(得分:0)

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

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