学生の研究プロジェクトをしているときに問題が発生しました。私は電気工学の学生ですが、私のプロジェクトは理論計算機科学とある程度関係があります。タイプ定義と定数について多くのパスカルソースコードファイルを解析し、すべての発生を視覚化する必要があります。タイプ定義はさまざまなファイルに再帰的に分散されます。つまり、ファイルxにはタイプa =バイトがあり、ファイルyにはタイプaを含むレコード(構造体)bがあり、ファイルzにはタイプcもあります。タイプbの配列。これまでの私の考えは、コンパイラーがすべての型定義を解決し、それらを要素型に分解する必要があるため、コンパイラーの構築について学ぶことでした。
ですから、コンパイラの構築については2冊の本(そのうちの1冊はパスカルの発明者によって書かれています)で読んだことがありますが、理論計算機科学の基礎があまりにも不足しているため、途中で1週間だけで作業できました。 。これまでに学んだことは、私の目標を達成するには、レクサーとパーサーで十分なはずだということです。このソフトウェアはプロジェクト全体の中で本当に賢い部分にすぎないので、あまり時間をかけることができないので、flexを試し始め、後でantlrを試しました。
私の望みは、typedefinitionsのみの解析が非常に簡単な作業であり、スキャナーを使用するだけでそれを実行し、パーサーの作業を実行できるようにすることでした。pascalファイルは5つの主要部分で構成され、それぞれがオプションです。 :コメント付きのヘッダー、const-section、type-section、var-section、および(少なくとも場合は)code-section。各セクションには開始識別子がありますが、明確な終了識別子はありません。そこで、type-およびconst-section(TYPE、CONST)の先頭を検索し始め、それ以外はすべて破棄しました。フレックスでは、「開始条件」が可能になるため、これはかなり簡単です。これらは、「INITIAL」、「TYPE-SECTION」、「CONST-SECTION」、「COMMENT」などのさまざまな状態として使用でき、状態ごとに異なるルールがあります。次の構文"="でスキャナーから文字列を取得したかったのです。AuEingangsBool_t {PCMON} = MAX_AuEingangsFeld;
。スキャナーは、正規表現でそのような型定義を抽出することはできません。
次のステップはスキャナーとパーサーで正しく行うことだったので、パーサジェネレーターを検索してantlrを見つけました。とにかくツールをC#で記述しているので、異なるプログラム間で通信する必要がないように、スキャナージェネレーターも使用することにしました。今、私は次の問題に遭遇しました:AFAIK、antlrはflexがサポートするように「開始条件」をサポートしていません。つまり、ファイル全体をスキャンして(大丈夫、コメントはまだ破棄されます)、不要な(そして間違った)トークンをたくさん取得する必要があります。パスカル文法全体にルールを使用しないため、スキャナーはパスカル構文のほとんどのキーワードをユーザーIDとして識別し、パーサーは型定義と定数定義に適合しない一連のトークンすべてについてナグします。
さて、最後に私の質問です。誰かが私に教えてもらえますか?私のプロジェクトのどこにでもつながるアプローチはどれですか?ソースファイルの一部のみをantlrでスキャンする可能性はありますか?それとも、その目的のためにflexをantlrに接続する必要がありますか?constセクションまたはtypeセクションにないすべてのトークンを無視するようにantlrのパーサーに指示できますか?これらのツールは私のタスクには強力すぎますか?代わりに独自のルーチンを作成する必要がありますか?