4

Pascal を C に変換するプログラムを書いていますが、助けが必要です。スキャナ ジェネレータ Flex から始めました。いくつかのルールを定義し、多かれ少なかれ正常に動作するスキャナーを作成しました。Pascal 構文をトークンに分割します。今のところ、見つかったものだけを表示しています。しかし、私は次に何をすべきかわかりません。このテーマを扱った記事や本はありますか? 次のステップは何ですか?

4

4 に答える 4

5

なぜそのような Pascal から C へのコンバーターを実行したいのですか?

いくつかの Pascal プログラムを実行したいだけなら、gpcのような既存のコンパイラを使用 (または改良) したり、 p2cなどの Pascal から C へのトランスレータを使用したりする方が簡単です。

手書きの Pascal コードを人間が読める (そして改善可能な) C コードに変換したい場合、その作業ははるかに困難です。特に、インデントやコメントを変換したり、システム名との衝突を避けながら、できるだけ同じ名前を維持したいでしょう!

常に何らかの抽象構文ツリーを解析する必要がありますが、これらのツリーの正確な性質は異なります。おそらく、 flex+bisonまたはANTLRでさえ適切である場合とそうでない場合があります (いつでも手書きのパーサーを作成できます)。また、エラー回復が重要である場合とそうでない場合があります (最初の構文エラーで中止するのは非常に簡単です。不適切に記述された構文的に正しくない Pascal ソースを理解しようとするのは非常に困難です)。

おもちゃの Pascal コンパイラを構築したい場合は、LLVM (またはGCCミドルエンドとバックエンド) の使用を検討してください。

于 2012-04-29T16:56:01.020 に答える
4

「Canonical Representation And Attribute Grammar Inversion を使用したプログラミング言語間の翻訳」とその中の参照をご覧になることをお勧めします 。

于 2012-04-29T16:54:40.973 に答える
1

最も一般的なアプローチは、フロントエンドで解析ツリーを構築し、そのツリーをたどってバックエンドで同等の C を出力することです。これにより、必要な宣言の並べ替えを柔軟に実行できます (IIRC Pascal は宣言前の使用をサポートしていますが、C はサポートしていません)。スキャナーに flex を使用している場合、従来はパーサーに bison を使用するように指示されていましたが、代替手段はあります。調べてみると、bison が期待する形式で自由に利用できる Pascal 構文がおそらく見つかるでしょう。

于 2012-04-29T16:55:53.977 に答える
1

Pascal の文法、C の文法を知っていて、対応する C のルールですべての Pascal のルールを変換できる「何か」(つまり、文法やオートマトン...) を構築 (設計) する必要があります。

トークン化されたストリームを取得したら、LR などのメソッドを使用して、適用された Pascal ルールのシーケンスに対応するセマンティック ツリーを見つけ、対応する C ルールのすべてのルールを変換できます (これは Bison で簡単に実行できます)。

Pascal と C には Context Free 文法がないため、より詳細な制御が必要になることに注意してください。

于 2012-04-29T16:58:56.617 に答える