私はそのようなものを解析したい:
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);
:}
;
例を簡略化したため、この余分なルールを削除することはできませんが、実際にはかなり複雑です。
この余分なルールを削除すると問題が解決する理由がわかりません...