Recursion ANTLR中的初学者递归,没有调用堆栈?

Recursion ANTLR中的初学者递归,没有调用堆栈?,recursion,antlr,antlrworks,Recursion,Antlr,Antlrworks,ANTLR中是否存在递归,即存在调用堆栈?例如: parenset : LPAREN parenset* RPAREN ; LPAREN: '('; RPAREN: ')'; 只需验证左括号的数量是否与右括号的数量相同。但是在ANTLRWorks 1.4.3中,当我在解释器中键入“(())”时,我得到 我的其他右翼在哪里?!我做错什么了吗?谢谢 不要使用AntlWorks的解释器:这是出了名的bug 如果我在ANTLRWorks中使用调试器(与解释器不同!),语法如下:

ANTLR中是否存在递归,即存在调用堆栈?例如:

parenset
:   LPAREN
    parenset*
    RPAREN
;

LPAREN: '(';
RPAREN: ')';
只需验证左括号的数量是否与右括号的数量相同。但是在ANTLRWorks 1.4.3中,当我在解释器中键入“(())”时,我得到


我的其他右翼在哪里?!我做错什么了吗?谢谢

不要使用AntlWorks的解释器:这是出了名的bug

如果我在ANTLRWorks中使用调试器(与解释器不同!),语法如下:

grammar T;

parenset
  :  LPAREN parenset* RPAREN
  ;

LPAREN : '(';
RPAREN : ')';
并提供输入
(())
我得到以下解析树:

所以,要回答你的问题:

我的其他右翼在哪里?!我做错什么了吗


不,你没有做错任何事:AntlWorks的翻译正在为你把事情搞砸。每当语法包含谓词或递归规则调用时,最好使用调试器或编写自己的测试类。

如果没有“调用堆栈”,那么我如何确保左paren的数量与右paren的数量相同?您能给出整个
.g
文件语法测试;选项{language='CSharp2';output=AST;}缺少的只是语法名称和选项您可以在
parenset*
处省略
*
字符。如果允许
(())
,则
*
不能替换为
。但是我想
()()
也应该被允许。然后
parenset:LPAREN-parenset?是帕伦西吗应该是正确的。(未经测试。)