質問

ってみるとウていただきたいと思いますかのように書くコンパイラとしての学習では、多くの自然免疫することが可能に容易に適用コンパイラです(特に、再帰的アコンパイラ).

どんなかなか得私の頭の周りにはどのように表現される言語の文法にウ-アン。私の初めてだと思っていたものを使用再帰的データ型の定義が見えないことに気づいた方法を使っていい試合をキーワードの言語(ば)です。

分の考えや提案を大きく評価され、

Pete

役に立ちましたか?

解決

再帰的なデータ型は、このための罰金です。たとえば、言語が与えられます:

expr ::= var
      |  "true"
      |  "false"
      |  "if" expr "then" expr "else" expr
      |  "(" expr ")"

この言語での例式は以下のようになります:

if true then x else (if false then y else true)

あなたのHaskellのデータ型は次のようになります

data Expr = Var String
          | Lit Bool
          | If Expr Expr Expr

あなたのパーサはその後、すなわちなど、例えば、翻訳することxVar "x"を世話をする、とtrueLit True:ます。

parse "if x then false else true" 
  ==  If (Var "x") (Lit False) (Lit True)

あなたはノーマンの答えに記載された技術を使用して、独自のロールすることができますパーサを書く、またはを使用するためのハッピーのようなパーセクするまたは使用パーサジェネレータます。

他のヒント

相互再帰的な代数データ型を使用してプログラムを表現し、使用するプログラムを解析します。 解析コンビネータ. 。味は何百万もあります。に 3 つの役立つチュートリアル ペーパーがあります。 私のクラスのスケジュール 2009 年 3 月 23 日月曜日。彼らです

ハットンとマイヤーの論文は最も短くて単純ですが、アマチュアにはわかりにくいモナドが使用されています。ただし、非常に優れた式の文法とパーサーを備えています。まだモナドを理解していない場合は、Fokker のチュートリアルが最適です。

その楽しみがさらに広がるでしょうか現実世界の事業がどのようないのですか?

一週間前 言語-Python プロジェクト 発表ウ-カフェmailinglist.この Python パーサが実施したウを使用し、 嬉しい パーサジェネレータと アレックス レクサージェネレータ。

もちろんありま Pugs, は、実施の Perl6 にウ(第の実施Perl6に準拠している重要なサブセットのPerl6仕様).

私は、これはあなたがコンパイラを書き込もうとする、またはあなたが前にコンパイラを書いたとハスケルへの具体的なアドバイスを探している場合している最初の時間であるかどうか、あなたの質問のトーンから伝えることはできません。すでにコンパイラの第一人者であれば、どのような少しアドバイス私が提供しているが助けに行くのではありません。 :)

プログラミング言語の文法は、一般 BNFフォーム、で表されますソースコードを解析するのYaccやバイソンなどのツールで使用することができます。これはそれを行うにはハスケル・イアンの方法として数えるかどうかは知りませんが、それは私が聞いた唯一の方法です。おそらく、BNF文法からHaskellのコードを生成するツールを掘ることができ、あなたの周りのいくつかの掘削を持ちます。私が行うことができると主張するこのツールを見つけそのます。

迅速なGoogle検索が上がっ 、そして他の人がそこにおそらく存在し、場合にあなたがCやJava用のBNF文法が人気があるようです(多分あなたはHaskellでHaskellのコンパイラを書きたいのですが?)Haskellのコンパイラを書きたい。

あなたはコンパイラの設計に関する本を探している場合は、

最後に、古典的なテキストは、「ですドラゴンブック "を。

残念ながら ANTLR のためのHaskellの文法はありませんが、おそらくあなたは、上記の引用、リンクを使用することができます1を作成します。 ANTLRは偉大なJavaベースのパーサジェネレータです。

スティーブ・イェジはおよそ素敵ブログを持っていますあなたはより多くの動機が必要な場合は、コンパイラを書きます。それは面白いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top