0

我无法获得 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(或在“原子”级别生成)

它应该像

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

(对不起我画的不好:))

问题是,如果运算符不带引号出现,它应该是其兄弟的头部(正如它在 AST 中所指的那样)。但是当它出现在一些带引号的文本中时,它应该像其他词一样被捕获......

4

1 回答 1

1

使用它atom应该可以解决问题:

atom
  :  WORD WORD+ -> ^(MultiWordNode WORD+) 
  |  WORD
  |  '"' WORD (OPER WORD)+ '"' -> ^(MultiWordNode '"' WORD (OPER WORD)+ '"')
  |  '"' WORD '"' 
  ;
于 2010-12-20T15:51:25.127 回答