在ANTLR3中,为什么生产;开始:';(';';)'&引用;匹配字符串";())“什么;?

在ANTLR3中,为什么生产;开始:';(';';)'&引用;匹配字符串";())“什么;?,antlr,context-free-grammar,antlr3,Antlr,Context Free Grammar,Antlr3,切换到ANTLR4不是一个可行的解决方案 我正在使用ANTLR3为自定义语言编写编译器,它不会在输入上抛出错误,例如void main(){}。我已将问题简化为语法,如下所示: grammar parens; start : '(' ')' ; WS : ( '\t' | ' ' | ('\r' | '\n') )+ { $channel = HIDDEN;} ; 我希望该语法与输入字符串“()”(带有任意空格)匹配,但它似乎与正则表达式()匹

切换到ANTLR4不是一个可行的解决方案

我正在使用ANTLR3为自定义语言编写编译器,它不会在输入上抛出错误,例如
void main(){}
。我已将问题简化为语法,如下所示:

grammar parens;

start   : '(' ')'
        ;

WS      : ( '\t' | ' ' | ('\r' | '\n') )+ { $channel = HIDDEN;}
        ;

我希望该语法与输入字符串“()”(带有任意空格)匹配,但它似乎与正则表达式()匹配()+意思()或())或())等。我觉得我误解了CFGs或ANTLR,这在低层次上给我造成了这个问题。

在进行了大量深入研究后,我(阅读:一位同事)找到了解决方案。通过在尝试匹配大括号的生产结束时添加EOF,它现在只接受一个大括号。在我的大型代码中,如下所示:

program : function+ EOF
grammar parens;

start   : '(' ')' EOF
        ;

WS      : ( '\t' | ' ' | ('\r' | '\n') )+ { $channel = HIDDEN;}
        ;
在玩具示例中,它看起来像:

program : function+ EOF
grammar parens;

start   : '(' ')' EOF
        ;

WS      : ( '\t' | ' ' | ('\r' | '\n') )+ { $channel = HIDDEN;}
        ;

禁用其内置的恢复机制,并尝试使用非贪婪匹配。我根本不是ANTLR专家,我只是将其用于一个类项目。我找到了一个不依赖于这两个特性的解决方案,但您能否简单地解释一下这两个特性是如何工作的,或者我在哪里可以找到它们是如何工作的?我想试试看它们是否也能起作用。