我无法获得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 "
实际上,我指的是MultiwordNode下的AST(或在'atom'级别生成)
它应该像
一样工作 M u l t i W o r d N o d e
/ / / | \ \ \
/ / / | \ \ \
" risk & factors | concise "
(抱歉我糟糕的画画:))
问题是如果操作符没有引号,那么它应该是它的兄弟姐妹的头(就像它在AST中所指的那样)。但是当它出现在一些带引号的文本中时,它应该像其他单词一样被捕获......
答案 0 :(得分:1)
将此作为atom
应该可以解决问题:
atom
: WORD WORD+ -> ^(MultiWordNode WORD+)
| WORD
| '"' WORD (OPER WORD)+ '"' -> ^(MultiWordNode '"' WORD (OPER WORD)+ '"')
| '"' WORD '"'
;