如何使用ANTLR制作允许多行的解释器?

时间:2013-01-04 07:30:13

标签: antlr

我可能只是以错误的方式考虑这个问题,但以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中有更优雅的方式来支持这个吗? / p>

提前致谢

1 个答案:

答案 0 :(得分:-1)

这只是一套指导方针,但应该提供一般性的想法。

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

start : stmt EOF; // good

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