Parsing ANTLR规则接受以前不匹配的内容

Parsing ANTLR规则接受以前不匹配的内容,parsing,antlr,Parsing,Antlr,如何创建一个解析器规则来接受以前的规则不接受的内容 我正在尝试用ANTLR重写C++ Src文件。我的语法只需要理解C++的一个子集,而忽略其他。通过忽略其余部分,我的意思是我仍然必须按原样输出输入行。我不能简单地放弃输入。例如,我可能需要找到一个如果是,{IFDEF,γIFNDEF,α-For,γ-ELIF,YE},但发送任何其他有效的C++语法,回到原来的输出。 我的部分解决方案如下所示: inputLines : ( preprocessorLineSet | oneNormalIn

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

我正在尝试用ANTLR重写C++ Src文件。我的语法只需要理解C++的一个子集,而忽略其他。通过忽略其余部分,我的意思是我仍然必须按原样输出输入行。我不能简单地放弃输入。例如,我可能需要找到一个如果是,{IFDEF,γIFNDEF,α-For,γ-ELIF,YE},但发送任何其他有效的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
我假设解析器将按照语法中列出的顺序尝试替代方法。因此,我的预处理行集规则列在输入行规则中的oneNormalInputLine之前。但是,似乎ANTLR仍然更喜欢oneNormalInputLine,即使输入是#if模式,我认为应该与前面的规则匹配

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

JavaMan写道:

我假设解析器将按照语法中列出的顺序尝试替代方法。因此,在inputLines规则中,我的预处理器LineSet规则列在oneNormalInputLine之前

正确,规则是从左到右尝试的(
preprocessorLineSet
oneNormalInputLine
之前)

JavaMan写道:

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


除了crlf,您不需要从
任何令牌中排除
#if
#elif
之类的内容吗?您能发布一个包含驱动程序类的工作示例来显示意外行为吗?

这正是我想知道的。如何编写一个不包含#if#ifndef等但包含其他所有内容的解析器规则?你能把你的工作语法发布到ANTLR似乎更喜欢
oneNormalInputLine
而不是
preprocessorLineSet
?我想这只是我语法中的一个bug。在进一步的测试中,它会正确地查找第一个备选方案(预处理线性集)。这是一个由我的catch-all规则引起的bug,该规则不排除#if(因此看起来preprocessorLineSet是匹配的,但实际上是oneNormalInputLine匹配的)。我想知道怎么可能写一些规则来排除某个模式?我需要一个具体的例子,否则这将是我的猜测。你能把你的问题扩大一点吗?Thx也许我应该重写一个新问题,因为实际问题与评估备选方案的顺序无关。