2012-03-02 33 views
2

誰かが私をここに助けることができる、私はこれで立ち往生しています:書き換えルール*

primaryExprList ('|'^ primaryExprList)* 

は、私はそれが代わりにしたいです「|」 BOOLEANOR

Vojislavストイコビッチさんにコメントを使用するには:| B |私はそれを試してみましたが、私が使用している場合、それは文句を言わない、正しく動作

をそれが

このような
BOOLEANOR 
     |  \ 
BOOLEANOR  c 
|  | 
a  b 

であるべきで、あなたのsoultionは次のようにはCこれは:

 BOOLEANOR 
/  |  \ 
    a  b  c 

です。これは、凝固剤ではありません。

答えて

3

本当に必要はありません。あなたはBOOLEANORトークン(字句解析ルール)を定義する場合:

parse  : primaryExprList ('|'^ primaryExprList)*; 
// or:  primaryExprList (BOOLEANOR^ primaryExprList)* 

BOOLEANOR : '|'; 

は、ルートのタイプは BOOLEANORことで、その内側のテキストが "|"です。

しかし、あなたの質問に答える(または解決策を提案)するために、実際にルートを変更する方法は、このような書き換えルールを使用することです:

入力を解析します
grammar T; 

options { 
    output=AST; 
} 

tokens { 
    OTHER; 
} 

parse 
: expr EOF! 
; 

expr 
: (e1=primaryExprList -> $e1) ('|' e2=primaryExprList -> ^(OTHER $expr $e2))* 
; 

// other rules 

:「A | | b。次のASTへのC」:

enter image description here

0

これは役に立ちますか?

primaryExprList ('|' primaryExprList)* -> ^(BOOLEANOR primaryExprList+) 

あなたの質問を誤解しましたか?

+0

再び私の質問をチェックし、uのためのコメントがあります。私は評判の制限のために回答を投稿できませんでした。コメントではツリーを書くことはできませんでした – sm13294

+0

編集した質問に対してBartの答えがうまくいくはずです。 –