21

C#とJavaの文法はLALR(x)なのかしら?はいの場合、xの値は何ですか?

編集:

本当の答えを受け入れた後、私は次のようにQを変更する方が良いと思います。

Java(バージョン7)またはC#(バージョン4)の現在のリリースを解析できるLALR(x)パーサーはありますか?はいの場合、xの値は何ですか?

4

3 に答える 3

16

一部の文法はそうであるかもしれないし、そうでないかもしれないので、最初に言語の特定の文法を指定せずにこの質問をすることはできません。

おそらく、最近のJava仕様で公開されているJava文法を意味します。Java 7のことですか?

C#に特定の文法を指定できるかどうかはわかりませんが、少なくともMicrosoftの文法、特にC#4.0の文法は指定できません。彼らが文法を発表したとは思わない。

C#がLALR(x)になることはないと思います。これは、識別子のように見える要素がいくつかあるためですが、特定のコンテキストではキーワードになる可能性があります。これには、レクサーが、識別子のようなトークンがキーワードであるか、それとも単なる識別子であるかをパーサーが決定することを期待していることを知る必要があります。したがって、パーサーからレクサーへのフィードバックが必要です。そうでない場合、レクサーは両方のトークンを生成してパーサーに渡し、どちらが必要かを決定する必要があります。LALRパーサーは、フィードバックなしでトークンストリームで定義され、すべての入力トークンには1つの解釈しかありません。

列挙型が独自のキーワードを持つ特殊な型として導入されたとき、JavaもJava1.5以降ではないと思います。これは、Java1.5コンパイラがenumを変数名として使用する既存のJava1.4プログラムを処理するには、enumをキーワードとして処理する必要がある場合と、変数名として処理する必要があるためです。したがって、Java 1.5パーサーにはC#と同じ問題があります。

実際問題として、実際の言語はLALR(1)[初版Javaは例外かもしれません]ではなく、実際のパーサー(esp LALR)を構築する人は、これを回避するために何らかのハックを行う必要があります。(GCCは長い間ひどいシンボルテーブルハックを伴うLALRパーサーでC ++を解析したことで有名なので、変数としての識別子とtypedefインスタンスとしての識別子の違いを知ることができました。再帰的な降下パーサーですが、ひどいハックが残っていると思います)。ですから、あなたの質問に対する答えの価値はわかりません。

言語フロントエンドのファミリーのC#4.0およびJava 7のメンバーは、どちらもGLRパーサーを使用して言語を解析し、フィードバック機能と同じトークンの2つの解釈を処理する機能の両方で拡張されています。GLRはLALR(x)の問題を解決し、フィードバックと複数の解釈により、純粋なGLRの機能の範囲外となる多くの言語も処理できるようになります。

編集:少し考えた後、両方の文法にコンテキスト内のキーワードを処理させるための本当に醜い方法があるかもしれません。例としてJavaの列挙型を使用してみましょう。現実的には文法規則が必要です。

  type = 'enum' '{'  enum_members '}' ;

ただし、識別子として「列挙型」を許可する必要もあります。これを行うには、終端記号識別子を非終端記号に置き換えます 。

  identifier = IDENTIFIER | 'enum' ;

そして、識別子はレクサーによって生成された端末であると主張します。これで、少なくともレクサーは列挙型の処理方法を決定する必要がなくなりました。パーサーはそうします。ただし、LALR(x)になる可能性さえあるためには、指定された文法をこのように形作る必要があります。

私たちのパーサーは、一部のキーワードを識別子として使用できるようにするためにこれを行っていました。前に説明したように解析エンジンを変更しましたが、これはもう行いません。

于 2011-12-05T00:54:20.710 に答える
14

Java文法(バージョン1.0)はLALR(1)であることが知られています。このサイトは文法を提供し、次の通知から始まります

文法は、LALR(1)であることを保証するために機械的にチェックされています。

C#がLALR(1)であるかどうかはわかりませんが、ここで利用できるC#パーサーがbisonあります。これは、おそらくLALR(1)であることを示しています(優先順位の宣言を許可していると仮定します)。

その価値については、通常、LALR(1)が使用される唯一のLALRパーサーです。文法にLALR(2)のようなものを使用する必要がある場合は、通常、明示的な優先順位の曖昧性解消を備えたLALR(1)パーサー、またはGLRパーサーのようなより強力なパーサーを使用することをお勧めします。

お役に立てれば!

于 2011-12-04T21:03:11.547 に答える
5

少なくともJava(バージョン1.0)の場合は次のとおりです。http://java.sun.com/docs/books/jls/first_edition/html/19.doc.html

于 2011-12-04T21:01:26.057 に答える