在有一个调用堆栈的意义上,ANTLR中是否存在递归?例如:ANTLR初学者递归,没有调用堆栈?
parenset
: LPAREN
parenset*
RPAREN
;
LPAREN: '(';
RPAREN: ')';
应该只验证左侧括号的数目与右侧相同。然而,在ANTLRWorks 1.4.3,在翻译时,我输入 '((()))',我得到
哪里是我的其他权利的括号?我做错了什么吗?谢谢!
在有一个调用堆栈的意义上,ANTLR中是否存在递归?例如:ANTLR初学者递归,没有调用堆栈?
parenset
: LPAREN
parenset*
RPAREN
;
LPAREN: '(';
RPAREN: ')';
应该只验证左侧括号的数目与右侧相同。然而,在ANTLRWorks 1.4.3,在翻译时,我输入 '((()))',我得到
哪里是我的其他权利的括号?我做错了什么吗?谢谢!
不要使用ANTLRWorks的翻译:它是臭名昭着的越野车。
如果我用的语法ANTLRWorks调试器(不一样的解释!):
grammar T;
parenset
: LPAREN parenset* RPAREN
;
LPAREN : '(';
RPAREN : ')';
,并提供输入((()))
我碰到下面的解析树:
因此,要回答你的问题:
在哪里我的其他右派parens ?!我做错了什么吗?
不,你没有做错任何事情:ANTLRWorks的翻译员正在为你搞砸。每当语法包含谓词或递归规则调用时,最好使用调试器或编写自己的测试类。
如果允许'(()())',*不能被替换但是我猜''()()'也应该被允许,然后'parenset:LPAREN parenset?RPAREN parenset?;'应该是正确的(未测试) – kay
@kay,你是对的。有时候我是个傻瓜!:) –
如果没有“调用堆栈”,那么我将如何确保有多少剩余的左对象,因为这样对? – Tizz
你能否给出整个'.g'文件 –
语法测试; 选项 {language ='CSharp2'; 输出= AST; } – Tizz