2017-02-11 113 views
0
grammar Poly; 
options  
    { 
    output=AST; 
    ASTLabelType=CommonTree; 
    } 
poly 
: 
    term(TLK^ term)* 
; 
term 
: 
    a=ID b=INT -> ^($a $b)* 
; 
INT:'0'..'9'; 
ID:'a'..'z'; 
TLK:('PUSH'|'POP'); 
Semi : ';' {skip();}; 
Space : ' ' {skip();}; 

这是我的语法文件......我的输入是ANTLR的语法和AST

PUSH t 6;POP t 7;PUSH t 8; 

但它给输出

(PUSH (POP (t 6) (t 7)) (t 8)) 

...和离开命令

1:0无关输入'PUSH'预计ID

为什么我的第一个PUSH不包含在树中?

回答

0

假设你在poly规则开始,它的第一个元素的右侧是term,这是一个ID,然后INT,不PUSH

poly 
: 
    term(TLK^ term)* 
; 

要匹配你给的输入,你会可能想要这样:

poly 
: 
    (TLK^ term)* 
;