切换到ANTLR4不是一种可能的解决方案。
我正在使用ANTLR3为自定义语言编写编译器,并且它不会在诸如void main(){}}}}}}}}
之类的输入上抛出错误。我把问题简化为语法,简单如下:
grammar parens;
start : '(' ')'
;
WS : ( '\t' | ' ' | ('\r' | '\n') )+ { $channel = HIDDEN;}
;
我希望这个语法匹配输入字符串“()”(与任意空格),但它似乎匹配正则表达式()+含义()或())或()))等我感觉像我误解了低水平的CFG或ANTLR对我造成了这个问题。
答案 0 :(得分:1)
经过多次灵魂搜索,我(读:一位同事)找到了解决方案。通过在尝试匹配大括号的生产结束时添加EOF,它现在只接受一个大括号。在我的大代码中,这看起来像:
program : function+ EOF
在玩具示例中,它看起来像:
grammar parens;
start : '(' ')' EOF
;
WS : ( '\t' | ' ' | ('\r' | '\n') )+ { $channel = HIDDEN;}
;