代码之家  ›  专栏  ›  技术社区  ›  zach

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

  •  0
  • zach  · 技术社区  · 7 年前

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

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

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

    我希望该语法与输入字符串“()”(带有任意空格)匹配,但它似乎与正则表达式()+含义()或())或())等匹配。我觉得我误解了低级别的CFGs或ANTLR,从而导致了这个问题。

    1 回复  |  直到 7 年前
        1
  •  1
  •   zach    7 年前

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

    program : function+ EOF
    

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

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