在 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;}
;
切换到 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;}
;