2011-10-04 60 views
0

在有一个调用堆栈的意义上,ANTLR中是否存在递归?例如:ANTLR初学者递归,没有调用堆栈?

parenset 
: LPAREN 
    parenset* 
    RPAREN 
; 

LPAREN: '('; 
RPAREN: ')'; 

应该只验证左侧括号的数目与右侧相同。然而,在ANTLRWorks 1.4.3,在翻译时,我输入 '((()))',我得到

enter image description here

哪里是我的其他权利的括号?我做错了什么吗?谢谢!

+0

如果没有“调用堆栈”,那么我将如何确保有多少剩余的左对象,因为这样对? – Tizz

+0

你能否给出整个'.g'文件 –

+0

语法测试; 选项 {language ='CSharp2'; 输出= AST; } – Tizz

回答

1

不要使用ANTLRWorks的翻译:它是臭名昭着的越野车。

如果我用的语法ANTLRWorks调试器(不一样的解释!):

grammar T; 

parenset 
    : LPAREN parenset* RPAREN 
    ; 

LPAREN : '('; 
RPAREN : ')'; 

,并提供输入((()))我碰到下面的解析树:

enter image description here

因此,要回答你的问题:

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

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

+1

如果允许'(()())',*不能被替换但是我猜''()()'也应该被允许,然后'parenset:LPAREN parenset?RPAREN parenset?;'应该是正确的(未测试) – kay

+0

@kay,你是对的。有时候我是个傻瓜!:) –