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 に答える