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

时间:2018-01-13 00:51:30

标签: antlr context-free-grammar antlr3

切换到ANTLR4不是一种可能的解决方案。

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

grammar parens;

start   : '(' ')'
        ;

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

我希望这个语法匹配输入字符串“()”(与任意空格),但它似乎匹配正则表达式()+含义()或())或()))等我感觉像我误解了低水平的CFG或ANTLR对我造成了这个问题。

1 个答案:

答案 0 :(得分:1)

经过多次灵魂搜索,我(读:一位同事)找到了解决方案。通过在尝试匹配大括号的生产结束时添加EOF,它现在只接受一个大括号。在我的大代码中,这看起来像:

program : function+ EOF

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

grammar parens;

start   : '(' ')' EOF
        ;

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