Непустые замыкания и знак вопроса: в AST помещается только первый элемент? - PullRequest
1 голос
/ 02 июня 2011

Меня преследует странное явление:

Только первое в x в z: x | '<'! y? '>', где y: x (','! x)*, встречается в результирующем AST.Но только если я скомпилирую код, используя Antlr3, развернутый в репозиториях maven.В AntlrWorks я вижу правильное дерево.

Является ли b: a a*; c: d b? d; семантически неправильным?Что я делаю неправильно?Или в Antlr просто ошибка?

Если вам нужен более полный пример (моя проблема возникает в $ v2 попытки _):

variables
    : annotatedVariable
        -> ^(VARIABLES annotatedVariable)
    | v='<' annotatedVariableList? '>'
        -> ^(VARIABLES[$v] annotatedVariableList?)
    ;

annotatedVariableList
    : annotatedVariable (','! annotatedVariable)*
    ;

try_
    : v='try' e1=expression 'of' v1=variables '->' e2=expression
      'catch' v2=variables '->' e3=expression
        -> ^(TRY[$v] $e1 $v1 $e2 $v2 $e3)
    ;

(Полный исходный код и пример вводаfile: https://gist.github.com/1004329. В дереве присутствует только T of catch, но я вижу и T и R в AntlrWorks.)

1 Ответ

1 голос
/ 06 июня 2011

Кей писал:

Только первое в x в z: x |'<'!у?'>', где y: x (','! x) *, встречается в результирующем AST.Но только если я скомпилирую код, используя Antlr3, развернутый в репозиториях maven.С AntlrWorks я вижу правильное дерево.

ANTLRWorks создает дерево разбора, не AST, создаваемый вашими правилами синтаксического анализатора (при условии, что вы говорите о интерпретаторе ANTLRWorks).

Простой тест показывает, что все работает отлично (протестировано с ANTLR v3):

grammar T;

options {
  output=AST;
}

z : x 
  | '<'! y? '>'!
  ;

y : x (','! x)*
    ;

x : X
  ;

X : 'A'..'Z'
  ;

будет анализировать входные данные:

<X,Y,Z>

в следующее AST:

enter image description here

, как вы можете проверить себя:

import org.antlr.runtime.*;
import org.antlr.runtime.tree.*;
import org.antlr.stringtemplate.*;

public class Main {
  public static void main(String[] args) throws Exception {
    TLexer lexer = new TLexer(new ANTLRStringStream("<X,Y,Z>"));
    TParser parser = new TParser(new CommonTokenStream(lexer));
    CommonTree tree = (CommonTree)parser.z().getTree();
    DOTTreeGenerator gen = new DOTTreeGenerator();
    StringTemplate st = gen.toDOT(tree);
    System.out.println(st);
  }
}

Кей написал:

Является б: аа *;с: дб?д;семантически неправильно?

Нет.Но связан ли этот вопрос с вашим правилом z: x | '<'! y? '>'?Извините, но вы немного расплывчаты.

Кей написал:

Что я делаю не так?

Я не знаю.Вы должны будете опубликовать короткий, автономный пример здесь, на SO, так же, как я написал.Извините, я не заинтересован в переходе по внешней ссылке и прохождении сотен строк кода.

...