ANTLR AST建筑问题

时间:2010-11-25 14:57:40

标签: antlr abstract-syntax-tree antlrworks

我无法获得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中所指的那样)。但是当它出现在一些带引号的文本中时,它应该像其他单词一样被捕获......

1 个答案:

答案 0 :(得分:1)

将此作为atom应该可以解决问题:

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