2016-02-17 5 views
1

Следующего правила грамматики направлено на признание таких выражений «AB» в грамматике, который генерирует AST для оценки линейного уравнения:ANTLR: как правило перезаписи, чтобы установить lexema в виде текста в АСТЕ узел

tokens { 
    PLUS = '+' ; 
    MINUS = '-' ; 
    DIV = '/' ; 
    EQUAL = '=' ; 
    MULT = '*' ; 
} 

minusExpr: (a=multExpr -> $a) (MINUS b=multExpr -> ^(PLUS $a ^(MINUS $b)))*; 

Грамматика работает правильно. Единственная проблема, с которой я столкнулся, заключается в том, что в выходе AST текст токена установлен на «PLUS» вместо «+».

Например, для уравнения: х-1 = 11

он генерирует следующее дерево (грамматика имеет другие правила, которые я не копировать здесь):

(= (плюс х (- 1)) 11)

Вместо дерева:

(= (+ х (- 1)) 11)

Я хотел бы знать, как переписать правила так, чтобы узел AST метка установлена ​​t o "+" вместо "PLUS". Благодаря!

ответ

0

Текст '+' - это только вход, который преобразуется лексером в токены (в этом случае с тиковым типом PLUS). Вы не можете переписать это, поскольку лексер всегда будет преобразовывать ваш вход в токены (потому что парсер работает только с токенами).

Однако каждый маркер имеет текст, который был создан из внутреннего хранилища. Поэтому, когда вы идете по дереву, вы можете получить исходный текст каждого токена в любое время, вызвав getText() в классе CommonToken или BaseTree.