2017-03-23 3 views
1

Excelの式を解析するには、範囲交差のルールが必要です。たとえば は:演算子が空白(2つの式の間のスペース)の場合、ANTLR3に "exp(PLUS^exp)*"を書くには

= SUM(A1:C4 B2:D3)`  

にExcelで等価である:

= SUM(B2:C3) 

(2つの領域の交点)

ルールがある:

range (range)* 

しかし私ができますで実際のレクサートークンを使ってそれを行う方法しか見つけなかったので、ツリー部分を書く方法を見つけることはできません

range (PLUS^ range)* 

が、他の場所でスペース文字が空白のみであるため、ここでのINTERSECTトークンは、任意のものである:オペレータは、追加のためのように、それは次のようになります。

私は->ツリー構文を使用する必要があると思いますが、シンタックスのrange (PLUS^ range)*と同等のものを書く方法は、ANTLR3ガイドまたはウェブでは見つかりません。ここで は私の現在の試みです:

range (range {hasIntersect=true})* 
-> {hasIntersect}? ^(INTERSECT range*) 
-> range 

私はA1:C4 B2:D3のために動作しますが、それは他の操作の場合と同じようA1:C4 B2:D3 B1:B6のために、それは、2人の子供それぞれに3人の子供の代わりに、2本のINTERSECTの木が1 INTERSECTツリーを生成します。それが効果的に再帰的な構造を構築するよう

そして、私は唯一のコースの2人の子供を持っている木を必要とする...

答えて

1

は、これは少しトリッキーですが、それも一つのルールで行うことができます

my_rule: 
    (
     r1=range 
     -> $r1 
    ) 
    ( (
      r2=range 
      -> ^(INTERSECT $my_rule $r2) 
     ) 
    )* 

ここで重要な部分は、$rule(ルール名と同じ名前)の参照です。これは、これまで書き換えルールによって生成されたASTを含みます。

+0

パーフェクト。すべての単体テストは現在通過しています:) パリのおかげで、ルール属性をツリー属性として使うことはできません。 –

関連する問題