1

我可能只是以错误的方式思考这个问题,但是以 ruby​​ 为例,以下工作

ree-1.8.7-2011.03 :004 > a =
ree-1.8.7-2011.03 :005 >   1
 => 1 

但是,以下会引发错误

ree-1.8.7-2011.03 :006 > a sdlkfj
NameError: undefined local variable or method `sdlkfj' for #<Object:0x101986e88>

这当然看起来很明显,但这意味着 ruby​​ 中有一个逻辑在说“这行是一个完整、正确的表达式,一个不完整的(但可能是正确的!)表达式,或者只是一个永远不可能完整的表达式。

一次使用 ANTLR 解析脚本很容易,但我想知道如何最好地支持这样的增量脚本。我想一种方法是制作一种语法,其唯一目的是验证“不完整但可能正确的表达式”,但这似乎会导致一些严重的代码重复……在 ANTLR 中是否有更优雅的方式来支持这一点?

提前致谢

4

1 回答 1

1

这只是一组指导方针,但应该提供一个总体思路。

您需要确保用于解析语句的解析器规则以明确的EOF.

start : stmt EOF; // good

start : stmt;     // bad! might not parse the whole buffer!
  1. 在任何一行输入产生一个完整的执行语句后,清除多行输入“缓冲区”。
  2. 在用户输入一行数据后,将数据添加到缓冲区,然后尝试解析整个缓冲区。
    • 如果输入缓冲区被成功解析,则执行输入(即转到上面的项目#1)。
    • 如果语法错误发生但仅在解析器EOF从令牌流中消耗了符号(在预测或匹配期间)之后,则当前输入不完整。不要执行任何操作并等待用户输入更多文本。
    • 如果在解析器使用符号之前发生语法错误EOF,则输入包含语法错误。报告和/或处理您认为合适的错误(包括可能在不执行任何操作的情况下清除输入缓冲区)。
于 2013-01-04T19:47:28.203 回答