ウなどの実現プログラミング言語の文法?
-
22-08-2019 - |
質問
ってみるとウていただきたいと思いますかのように書くコンパイラとしての学習では、多くの自然免疫することが可能に容易に適用コンパイラです(特に、再帰的アコンパイラ).
どんなかなか得私の頭の周りにはどのように表現される言語の文法にウ-アン。私の初めてだと思っていたものを使用再帰的データ型の定義が見えないことに気づいた方法を使っていい試合をキーワードの言語(ば)です。
分の考えや提案を大きく評価され、
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
あなたのパーサはその後、すなわちなど、例えば、翻訳することx
にVar "x"
を世話をする、とtrue
にLit True
:ます。
parse "if x then false else true"
== If (Var "x") (Lit False) (Lit True)
あなたはノーマンの答えに記載された技術を使用して、独自のロールすることができますパーサを書く、またはを使用するためのハッピーのようなパーセクするまたは使用パーサジェネレータます。
他のヒント
相互再帰的な代数データ型を使用してプログラムを表現し、使用するプログラムを解析します。 解析コンビネータ. 。味は何百万もあります。に 3 つの役立つチュートリアル ペーパーがあります。 私のクラスのスケジュール 2009 年 3 月 23 日月曜日。彼らです
- グラハム・ハットンとエリック・マイヤー、 機能性パール:Haskell でのモナディック解析 (1998)
- グラハム・ハットン 解析用の高階関数 (1992)
- ジェローン・フォッカー 関数パーサー (1995)
ハットンとマイヤーの論文は最も短くて単純ですが、アマチュアにはわかりにくいモナドが使用されています。ただし、非常に優れた式の文法とパーサーを備えています。まだモナドを理解していない場合は、Fokker のチュートリアルが最適です。
私は、これはあなたがコンパイラを書き込もうとする、またはあなたが前にコンパイラを書いたとハスケルへの具体的なアドバイスを探している場合している最初の時間であるかどうか、あなたの質問のトーンから伝えることはできません。すでにコンパイラの第一人者であれば、どのような少しアドバイス私が提供しているが助けに行くのではありません。 :)
プログラミング言語の文法は、一般 BNFフォーム、で表されますソースコードを解析するのYaccやバイソンなどのツールで使用することができます。これはそれを行うにはハスケル・イアンの方法として数えるかどうかは知りませんが、それは私が聞いた唯一の方法です。おそらく、BNF文法からHaskellのコードを生成するツールを掘ることができ、あなたの周りのいくつかの掘削を持ちます。私が行うことができると主張するこのツールを見つけそのます。
迅速なGoogle検索が上がっ 、そして他の人がそこにおそらく存在し、場合にあなたがCやJava用のBNF文法が人気があるようです(多分あなたはHaskellでHaskellのコンパイラを書きたいのですが?)Haskellのコンパイラを書きたい。
あなたはコンパイラの設計に関する本を探している場合は、最後に、古典的なテキストは、「ですドラゴンブック "を。