ANTLR AST строительная проблема - PullRequest
0 голосов
/ 25 ноября 2010

Я не могу получить AST

" risk & factors | concise" | item 503

используя следующую грамматику

grammar BoolExpRep;

options {
  output=AST;
}

tokens {
  MultiWordNode;
}

start
  :  exp EOF!
  ;

exp
  :  atom (expRest^)? 
  |  '('! exp ')'! (expRest^)?
  ;

expRest 
  :  OPER exp -> ^(OPER exp)
  |  '~' WORD exp -> ^('~' WORD exp)
  ;

OPER
  :  '&' | '|' | '!' | '&!' | '|!'
  ;

atom
  :  WORD WORD+ -> ^(MultiWordNode WORD+) 
  |  WORD
  |  '"' WORD (OPER? WORD)+ '"' -> ^(MultiWordNode '"' (OPER? WORD)+ '"')
  |  '"' WORD '"' 
  ;

WORD
  :  ('a'..'z' | 'A'..'Z' | '0'..'9' | '.' | '*' | '{' | '}' | '_' | '?' | ':' 
             | ',' | '/' | '\\')+ ('0'..'9')* 
  ;

Я хочу сделать AST, который должен показывать слова и операторы для

" risk & factors | concise "

т.е. мое требование что-то вроде:

" risk & factors | concise "

Вместо этого я получаю:

" & risk & factors & concise "

на самом деле, я имею в виду AST под MultiwordNode (или генерируется на уровне «атома»)

должно работать что-то вроде

        M u l t i W o r d N o d e 
        /   / /  |    \  \      \
       /   / /   |     \  \      \
      " risk & factors | concise  "

(извините за мой плохой рисунок :))

проблема в том, что если оператор встречается без кавычек, это должен быть тип головы его родных братьев (как это указано в AST). но когда это встречается в некотором тексте с кавычками, оно должно быть записано так же, как и другие слова ...

1 Ответ

1 голос
/ 20 декабря 2010

Использование этого в качестве atom должно помочь:

atom
  :  WORD WORD+ -> ^(MultiWordNode WORD+) 
  |  WORD
  |  '"' WORD (OPER WORD)+ '"' -> ^(MultiWordNode '"' WORD (OPER WORD)+ '"')
  |  '"' WORD '"' 
  ;
...