如何创建一个解析器规则来接受之前的规则不接受的内容?
我正在做的是我试图用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之前列出。
正确,规则从左到右依次尝试(preprocessorLineSet
在oneNormalInputLine
之前)
JavaMan写道:
但是,似乎ANTLR仍然更喜欢onnormmalinputline,即使输入是#if模式,我认为应该与前面的规则匹配。
你不需要从any_token_except_crlf
中排除#if
和#elif
这样的东西吗?你能张贴一个工作的例子,包括一个驱动程序类,显示意外的行为?