2012-02-06 1 views
0

スキャンして解析した後。私は有効なトークンのシーケンスが残っています。私はパーサに捕らえられていないルールを持っています。たとえば、 "クラスは抽象的でも最終的でもありません"。このようなルールが多いので、どのようにしてこれらのケースを効率的に排除できますか?解析後の雑草

私はあなたがあなたのパーサーの仕組みを説明していない

+0

これは面白いかもしれません:http://openjdk.java.net/projects/compiler-grammar/ –

+0

通常、構文解析後、一連のトークンではなく構文木があります。コンパイルの次の段階は、通常、これらの不変条件をチェックする意味解析の一種であり、通常はかなり複雑です。 – templatetypedef

答えて

2

有効な構造に関するルールは、通常「静的セマンティクス」と呼ばれます。このようなルールを処理するには、通常必要があります。

  • プログラムの抽象構文木、およびそれらが参照するエンティティ(例えば、他のプログラム、クラス、など)
  • シンボルテーブル、その仲間の各識別子は、その識別子に関連する宣言し、その宣言に関連付けられた鍵情報を用いて、典型的には「タイプ」
  • テキストの各化合物の断片の種類を計算する能力(例えば、式)
呼ば

この情報を使用して、すべての静的セマンティクス例えば、「クラスは最終的なものでも抽象的なものでもあり得ません」とは、クラスのシンボルが最終的なプロパティと抽象的なプロパティに関連付けられていること、パーサ/シンボルが宣言に遭遇したときにその関連付けを行い、両方が同時に存在しないことを確認するためにチェックする。 (この他の方法を実装することもできますが、実際の効果は同じです)。

あなたの言語で間違っている場合、これらの機械をすべて使わずに、お互いに「近く」チェックすることは可能です。私はJavaの専門家ではありませんが、 "抽象"と "最終"を同じクラスのデクレーションで宣言しなければならない場合、キーワード "クラス"の近くのキーワードを許可しないようにすることができます。ハックであり、あらゆる状況において信頼できるものではありません。

あなたは、「あなたのコンパイラ」と「私にはルールがある」と言うことで(完全な)Javaコンパイラを書いていることを暗示しています。あなたは上記のすべてを構築するか、あるいは誰かの他の完成版をすべて受け入れる必要があります。 Javaのような現代のランゲージは非常に複雑な文法、スコープ規則、型システムを持っているため、これらの要素のすべてを構築することは、それらに精通した人にとっては容易ではないことがわかります。

あなたはこれらの必要性に慣れていないようで、まだASTを構築しようとしていないとしても、短期間で結果を出すことを望んでいないと思います。あなたの目標を見直すことをお勧めします。あなたが学生なら、あなたは始める前にもっと多くの背景が必要です。

0

C++で私のJavaコンパイラを書いていますが、私はあなたがソースコードを解析して、あなたがabstract syntax treeのいくつかのフォームを構築していると仮定します。ツリー内にノードを作成するときに、このフレームワークにルールを簡単に挿入することができます。

たとえば、Javaの「クラス」ノードにはC++クラスがあり、解析中にこのノードを構築すると、関連するルールをチェックしてルール違反が発生した場合に例外をスローできます。

+0

私はLR(1)文法を持っていますが、私はASTを構築しません。トークンの有効なシーケンスはすべてです。 –

+2

@Mike G:その後、コードを "解析"せずに、字句解析のみを行いました。レキシングと解析のためのリソース(チュートリアルを含む)についてはhttp://dinosaur.compilertools.net/をご覧ください。 – casablanca

関連する問題