Я не могу получить 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). но когда это встречается в некотором тексте с кавычками, оно должно быть записано так же, как и другие слова ...