ANTLR规则接受之前未匹配的内容

  • 本文关键字:规则 ANTLR parsing antlr
  • 更新时间 :
  • 英文 :


如何创建一个解析器规则来接受之前的规则不接受的内容?

我正在做的是我试图用ANTLR重写c++ src文件。我的语法只需要理解c++的一个子集,而忽略其余部分。通过忽略其余部分,我的意思是我必须仍然输出输入行。我不能简单地去掉输入。例如,我可能需要找到#if, #ifdef, #ifndef, #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规则中的 onnormmalinputline 之前列出。但是,似乎ANTLR仍然更喜欢 onnormmalinputline ,即使输入是#if模式,我认为应该由前面的规则匹配。

我的假设正确吗?这是实现这种忽略其余逻辑的正确方法吗?

JavaMan写道:

我假设解析器将按照语法中列出的顺序尝试其他选项。因此,我的preprocessorLineSet规则在inputLines规则的onnormmalinputline之前列出。

正确,规则从左到右依次尝试(preprocessorLineSetoneNormalInputLine之前)

JavaMan写道:

但是,似乎ANTLR仍然更喜欢onnormmalinputline,即使输入是#if模式,我认为应该与前面的规则匹配。

你不需要从any_token_except_crlf中排除#if#elif这样的东西吗?你能张贴一个工作的例子,包括一个驱动程序类,显示意外的行为?

最新更新