2012-03-02 4 views
3

Для question и грамматики, предложенной @BartKiers (спасибо!), Я добавил options блок, чтобы определить выход бытьСоздание AST из ANTLR грамматики

options{ 
language=Java; 
output=AST; 
ASTLabelType=CommonTree; 
} 

Однако, я не в состоянии фигуры как получить доступ к выходу, т.е. AST. Мне нужно пройти через дерево и обработать каждую операцию, указанную во входе.


Используя ваш пример here, я пытаюсь реализовать правила, возвращающие значения. Тем не менее, я бегу в следующие ошибки:

relational returns [String val]     
     : STRINGVALUE ((operator)^ term)? 
      {val = $STRINGVALUE.text + $operator.text + $term.text; } 
            ; 

term returns [String rhsOperand]      
     : QUOTEDSTRINGVALUE {rhsOperand = $QUOTEDSTRINGVALUE.text;} 
            | NUMBERVALUE    {rhsOperand = $NUMBERVALUE.text; } 
            | '(' condition ')' 
            ; 

Ошибка компиляции:

Checking Grammar RuleGrammarParser.g... 
\output\RuleGrammarParser.java:495: cannot find symbol 
symbol : variable val 
location: class RuleGrammarParser 
      val = (STRINGVALUE7!=null?STRINGVALUE7.getText():null) + (operator8!=null?input.toString(operator8.start,operator8.stop):null) + (term9!=null?input.toString(term9.start,term9.stop):null); 
      ^
\output\RuleGrammarParser.java:612: cannot find symbol 
symbol : variable rhsOperand 
location: class RuleGrammarParser 
        rhsOperand = (QUOTEDSTRINGVALUE10!=null?QUOTEDSTRINGVALUE10.getText():null); 
        ^
\output\RuleGrammarParser.java:632: cannot find symbol 
symbol : variable rhsOperand 
location: class RuleGrammarParser 
        rhsOperand = (NUMBERVALUE11!=null?NUMBERVALUE11.getText():null); 
        ^
3 errors 

Можете ли вы помочь мне понять, почему это не в компилятор?


Добавлена ​​Pastebin: http://pastebin.com/u1Bv3L0A

+0

Добро пожаловать в темноту. –

ответ

4

Просто добавив output=AST в раздел options не создать AST, но плоский, 1 мерный список лексем. Чтобы отметить определенные токены как root (или дети), вам нужно немного поработать.

заказ this answer, который объясняет, как создать правильный AST и доступа Подойдите к дереву анализатор затем производит (CommonTree tree в main методы ответа я упоминал).

Обратите внимание, что вы можете смело удалить language=Java;: по умолчанию целевой язык - Java (при этом его не оставляет никакого вреда).

+0

Это потрясающе! три ура для @BartKiers !! (& that rhymed :)) –

+0

Не могли бы вы помочь мне с моим запросом выше? Я обновил вопрос. –

+0

Барт, нашел исправление. Возможно, вам нужно обновить свой пример, чтобы включить '$' для всех переменных, определенных в правиле. –

Смежные вопросы