ANTLR接受任何先前未匹配的规则

时间:2011-10-28 05:36:33

标签: parsing antlr

如何创建一个接受先前规则不接受的解析器规则?

我在做的是尝试用ANTLR重写c ++ src文件。我的语法只需要理解C ++的一个子集而忽略其余部分。忽略其余部分,我的意思是我仍然必须按原样输出输入行。我不能简单地放弃输入。例如,我可能需要找到#if,#ifdef,#ifnf,#else,#elif,#endif,但是将任何其他有效的C ++语法发送回输出。

我的部分解决方案如下:

inputLines :  ( preprocessorLineSet  |  oneNormalInputLine ) ;
preprocessorLineSet  : ....;// pattern to match #if #else etc
oneNormalInputLine : (any_token_except_crlf)* CRLF {System.out.println($text)}; 
// a catch-all rule for anything including #if #else #endif, it must send any unrecognised input back to the ouput

我假设解析器会按照语法中列出的顺序尝试替代方法。因此,我的 preprocessorLineSet 规则列在 inputLines 规则中的 oneNormalInputLine 之前。但是,似乎ANTLR仍然喜欢 oneNormalInputLine ,即使输入是#if模式,我认为应该与之前的规则相匹配。

我的假设是否正确?这是实现这种忽略静止逻辑的正确方法吗?

1 个答案:

答案 0 :(得分:1)

  

JavaMan写道:

     

我假设解析器会按照语法中列出的顺序尝试替代方法。所以我的preprocessorLineSet规则在inputLines规则中的oneNormalInputLine之前列出。

正确,规则从左到右(preprocessorLineSet之前oneNormalInputLine)进行尝试。

  

JavaMan写道:

     

但是,看起来ANTLR仍然更喜欢oneNormalInputLine,即使输入是#if模式,我认为它应该与之前的规则相匹配。

您是否需要从#if中排除#elifany_token_except_crlf等内容?你能发布一个包含显示意外行为的驱动程序类的工作示例吗?

相关问题