在 ANTLR3 中,为什么产生式 "start : '(' ')' ;" 匹配字符串“())”?

In ANTLR3, why does the production "start : '(' ')' ;" match the string "())"?

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

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

grammar parens;

start   : '(' ')'
        ;

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

我希望这个语法匹配输入字符串“()”(带有任意空格)但是它似乎匹配正则表达式 ()+ 意思是 () 或 ()) 或 ())) 等等。我感觉我在低层次上误解了 CFG 或 ANTLR,导致我遇到这个问题。

经过深思熟虑后,我(阅读:一位同事)找到了解决方案。通过在试图匹配大括号的产生式末尾添加一个 EOF,它现在只接受一个大括号。在我的大代码中,它看起来像:

program : function+ EOF

在玩具示例中它看起来像:

grammar parens;

start   : '(' ')' EOF
        ;

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