ANTLRWorks: не могу заставить операторов работать - PullRequest
1 голос
/ 08 июля 2011

Я пытался выучить ANTLR в течение некоторого времени и, наконец, получил в руки справочник The Definitive ANTLR. Ну, я попробовал следующее в ANTLRWorks 1.4

grammar Test;

INT :   '0'..'9'+
    ;

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

expression
    :   INT ('+'^ INT)*;

Когда я передаю 2 + 4 и обрабатываю выражение, я не получаю дерево с + в качестве корня и 2 и 4 в качестве дочерних узлов. Скорее, я получаю выражение как корень, а 2, + и 4 как дочерние узлы на одном уровне.

Не могу понять, что я делаю неправильно. Нужна помощь отчаянно.

Кстати, как я могу получить эти графические описания?

1 Ответ

1 голос
/ 11 июля 2011

Да, вы получаете выражение, потому что это выражение, которое возвращает ваше единственное правило expression.

Я только что добавил виртуальный токен PLUS в ваш пример вместе с выражением перезаписи, которое показывает ожидаемый вами результат. Но похоже, что вы уже нашли решение: о)

grammar Test;

options {
    output=AST;
    ASTLabelType = CommonTree;
}
tokens {PLUS;}

@members {
   public static void main(String [] args) {
          try {
           TestLexer lexer =
               new TestLexer(new ANTLRStringStream("2+2"));
            CommonTokenStream tokens = new CommonTokenStream(lexer);
            TestParser parser = new TestParser(tokens);
            TestParser.expression_return p_result = parser.expression();

            CommonTree ast = p_result.tree;
            if( ast == null ) {
               System.out.println("resultant tree: is NULL");
            } else {
               System.out.println("resultant tree: " + ast.toStringTree());
            }
         } catch(Exception e) {
            e.printStackTrace();
         }
      }
}

expression
    :   INT ('+' INT)* -> ^(PLUS INT+);

INT :   '0'..'9'+
    ;

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;
...