2017-02-11 20 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 грамматика и АСТ

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, который является идентификатором с последующим INT, не PUSH:

poly 
: 
    term(TLK^ term)* 
; 

Для согласования входа вы дали, вы вероятно, это необходимо:

poly 
: 
    (TLK^ term)* 
;