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