如何创建一个接受先前规则不接受的解析器规则?
我在做的是尝试用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模式,我认为应该与之前的规则相匹配。
我的假设是否正确?这是实现这种忽略静止逻辑的正确方法吗?
答案 0 :(得分:1)
JavaMan写道:
我假设解析器会按照语法中列出的顺序尝试替代方法。所以我的preprocessorLineSet规则在inputLines规则中的oneNormalInputLine之前列出。
正确,规则从左到右(preprocessorLineSet
之前oneNormalInputLine
)进行尝试。
JavaMan写道:
但是,看起来ANTLR仍然更喜欢oneNormalInputLine,即使输入是#if模式,我认为它应该与之前的规则相匹配。
您是否需要从#if
中排除#elif
和any_token_except_crlf
等内容?你能发布一个包含显示意外行为的驱动程序类的工作示例吗?