0

優先順位を強制する次の文法を思いつきました。

A :   L ( '[' A ']' L* )*
L :   M (('+'|'-')M)*
M :   P (('*'|'/')P)*
P :   ID | NUM

ここで、ID は文字、num は整数です。

問題

次の文字列を解析できます。

a[i + 1]

次の文字列を解析できません。

a[i] + 1 or a[a[i]*i]

私の問題は、 A が再帰の問題を引き起こすことです。バックトラックをしたくないので。文法を書き直して、これを修正しなければなりません。私はこのリンクを見てきました。ただし、試みた修正も機能しません。誰か助けてくれませんか?

試みられた解決策:

A : L ( '[' A ']')* | L*`  and let `Z = ( '[' A ']')*

ただし、これは私の文法の定義を変更し、まだ再帰的なままであり、解決できないと思いますa[i] + 1 or a[a[i]*i]

追加情報:

私は実際にこれをantlrで実装しています。これを修正するために構文述語を使用しようとしましたが、役に立ちませんでした。おそらく私はそれらを適切に使用していませんでしたか?

これについては引き続きクラックしますが、考えれば考えるほど混乱します。誰か助けてくれませんか?これは、後戻りのない文法を適切に設定する方法について考えている概念的な問題です。しかし、独自のカスタムツールを適切に作成したい場合は、これを行う必要があります.

4

1 に答える 1

1

本番IDの後ではなく後に来るようにインデックスを移動しても問題はありません。L

A :   L
L :   M ( ('+'|'-') M )*
M :   P ( ('*'|'/') P )*
P :   ID I | NUM
I :   ( '[' A ']' )*

あなたが提供した3つの入力例のすべてを解析します:

  1. a[i + 1]
  2. a[i] + 1
  3. a[a[i]*i]
于 2013-09-21T18:24:43.003 に答える