2

私はそのようなものを解析したい:

path.to.variable

「path」と「to」は「Instance」という名前のオブジェクトであり、変数はdoubleを参照します。

私は次の文法を持っています:

expr                ::= instancePath:i INSTANCE_SEPARATOR SHORTCUT:s
                    {:
                        RESULT = getDouble(s);
                    :}
                ;



instancePath        ::= instanceSubPath:p
                    {:
                        RESULT = p;
                    :}
                ;


instanceSubPath     ::= instanceSubPath:i1 INSTANCE_SEPARATOR instanceSubPath:i2
                    {:
                        RESULT = i2;
                    :}
                | SHORTCUT:s
                    {:
                        RESULT = pushInstance(s);
                    :}
                ;

この文法では:

  • INSTANCE_SEPARATORは「。」です。char。
  • SHORTCUTは、「path」、「to」、「variable」などの文字のみで名前が付けられています。
  • exprは、名前(ここでは「変数」)をとる関数getDoubleの呼び出しによって取得されたdouble値を返す必要があります。この関数は、現在選択されているインスタンスを使用します。インスタンスには、doubleまたは他のインスタンスを含むハッシュテーブルが含まれています。
  • pushInstanceは、現在のインスタンスを設定する関数です

たとえば、次のようになります。

  • 次のハッシュテーブルを含むインスタンス「パス」:「to」=>インスタンス「to」へのリンク
  • 次のハッシュテーブルを含むインスタンス"to": "variable" => 10
  • パス「path.to.variable」は10を返す必要があります。

文法がnull値を要求するため、これは実行されません。これは、パーサーがこれを行うという事実によるものです:

expr(
  instancePath(
    instanceSubPath(SHORTCUT("path"))
    INSTANCE_SEPARATOR 
    instanceSubPath(SHORTCUT("to")) 
    INSTANCE_SEPARATOR 
    instanceSubPath(SHORTCUT("variable"))
  )
  INSTANCE_SEPARATOR
  !NULL!

)。

する代わりに

expr(
 instancePath(
    instanceSubPath(SHORTCUT("path"))
    INSTANCE_SEPARATOR 
    instanceSubPath(SHORTCUT("to")) 
 )
 INSTANCE_SEPARATOR 
 SHORTCUT("variable")
)

なんで ?優先順位の問題はありますか?

最後に、instancePathルールを削除すると、すべてが実行されます。

expr                ::= instanceSubPath:i INSTANCE_SEPARATOR SHORTCUT:s
                    {:
                        RESULT = getDouble(s);
                    :}
                ;


instanceSubPath     ::= instanceSubPath:i1 INSTANCE_SEPARATOR instanceSubPath:i2
                    {:
                        RESULT = i2;
                    :}
                | SHORTCUT:s
                    {:
                        RESULT = pushInstance(s);
                    :}
                ;

例を簡略化したため、この余分なルールを削除することはできませんが、実際にはかなり複雑です。

この余分なルールを削除すると問題が解決する理由がわかりません...

4

0 に答える 0