4

smali では、2 つの整数を取り、1 つの整数を返すメソッドのシグネチャは次のように記述されます。

add(II)I

xtext を使用してこれを解析するために、次のことを試しました。

ID'('Type*')'Type

残念ながら、これは 2 つの間の空白でのみ機能しますI

ここで空白を主張しないようにルールを変更するにはどうすればよいですか?


私が見る限り、これはすでに最終規則を処理するレクサーに問題があるはずです。のような一連の文字が表示されるたびに、III常にすぐに ID としてマークされます。- 位置に依存しません。:(

次のようなものを解析するには:

III(III)I

つまり、III3 つの Integer を取り、別の Integer を返すという名前の関数の場合、レクサーが常に単一の文字のみを出力し、パーサー ルールを使用して再アセンブルするように強制する必要があるようです。

しかし、この場合、ID ルールを作成することができなくなりました...

大事なことを見落としていたようです。


I注: (integer)、D(double)、 (void)などのプリミティブ データ型の他に、および で始まる配列Vとして記述されたクラス型もあります。Ljava/lang/String;[

典型的な main メソッドは次のようになります.method public static main([Ljava/lang/String;)V

4

2 に答える 2

1

レクサーでバックトラッキングを使用するオプションを設定できる拡張AntlrGeneratorFragmentを使用するように、言語を生成する mwe2 ワークフローを構成してみてください。これでうまくいくはずです。ContentAssistParserGeneratorFragmentに必要なコンテンツ アシスト パーサー フラグメントについても同じことを行う必要があります。

背景: レクサーは通常、最長の一致シーケンスを消費します。たとえばIII、ID のように見えるため、3 つの個別のトークンではなく単一の ID として消費されますI。バックトラッキングが有効になっている場合、完全な ID を消費する代わりにこれを分割します。III が常に型のリストではなく実際の ID である場合、これはいくつかの問題を引き起こす可能性がありますが、有効な識別子のデータ型規則を使用することでそれらを回避できます。

于 2013-08-24T14:44:32.197 に答える
1

バックトラッキングでこれを試すこともできますが、私は通常、この手法を避けています。非常に紛らわしいエラー メッセージが表示され、生成されるパーサーが非常に遅くなる可能性があります。

次のアプローチを試してください。

  1. パラメーター文字列 ("III") を ID として解析します
  2. バリデーターを追加して、「I」のみに制限し、適切なエラー メッセージを表示します ( AbstractInjectableValidatorを参照してください。xText は、おそらく「SmaliJavaValidator」と呼ばれる、言語用のバリデーターを生成します)。
  3. タイプ文字列を表す EObject を拡張して、文字列を個々のタイプの説明 (たとえば、単一の「I」) に分割します。

このアプローチでは、xText がその文法を完了するまで型文字列を解析しません。高速な文法と適切なエラー メッセージで、使用可能な結果が得られます。

一般的なアドバイス: 私は通常、文法を非常に寛大にし、後でバリデーターを使用して結果を制限する傾向があります。そのため、文法は高速のままであり、ユーザーはカスタマイズされた適切なテイラード エラー メッセージを取得します。

于 2013-08-27T07:55:40.740 に答える