Проблема множественности грамматики дерева в грамматике дерева - PullRequest
3 голосов
/ 12 сентября 2011

У меня есть простая грамматика

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

tokens {
  DEF;
}

root
  : ID '=' NUM (',' ID '=' NUM)* -> ^(DEF ID NUM)+     
  ;

и соответствующая грамматика дерева:

options {
  tokenVocab=SimpleGrammar;
  ASTLabelType=CommonTree;
}

root
  : ^(DEF ID NUM)+
;

Однако antlr (v3.3) не может скомпилировать эту грамматику дерева, которую я получаю:

syntax error: antlr: unexpected token: +
|---> : ^(DEF ID NUM)+

Также это не работает, если я хочу создать его как ^(ROOT ^(DEF ID NUM)+)

Я хочу дерево, которое соответствует этому (так как parse создает его):

(ROOT (DEF aa 11) (DEF bb 22) (DEF cc 33))

Таким образом, antlr способен генерировать дерево в синтаксическом анализаторе, но не может анализировать его с помощью грамматики дерева?!

Почему это происходит?

1 Ответ

3 голосов
/ 12 сентября 2011

Чтобы получить (ROOT (DEF aa 11) (DEF bb 22) (DEF cc 33)), вы можете определить следующие правила парсера:

tokens {
  ROOT;
  DEF;
}

root
  : def (',' def)* -> ^(ROOT def+)
  ;

def
  :  ID '=' NUM -> ^(DEF ID NUM)
  ;

и тогда ваша древовидная грамматика будет содержать:

root
  :  ^(ROOT def+)
  ;

def
  :  ^(DEF ID NUM)
  ;
...