Frage

Ich habe bei Haskell suchen und ich würde ganz gerne einen Compiler (als Lernübung) darin schreiben, da viele es angeborene Eigenschaften sind leicht an einen Compiler angewandt werden (insbesondere ein rekursive anständigen Compiler) .

Was kann ich nicht ganz meinen Kopf um ist, wie eine Sprache Grammatik in einer Haskell-ian Art und Weise darzustellen. Mein erster Gedanke war rekursive Datentyp-Definitionen zu verwenden, aber ich kann nicht sehen, wie ich sie verwende gegen Schlüsselwörter zum Beispiel in der Sprache ( „if“) entsprechen.

Die Gedanken und Vorschläge sehr geschätzt,

Pete

War es hilfreich?

Lösung

Ein rekursive Datentyp ist für diese Ordnung. Zum Beispiel gegeben, um die Sprache:

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

ein Beispiel Ausdruck in dieser Sprache sei:

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

Ihr Haskell-Datentyp würde wie folgt aussehen:

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

Ihr Parser dann kümmert sich zu übersetzen, zum Beispiel x in Var "x" und true in Lit True usw. D.h.:.

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

Zum Schreiben Parser können Sie Ihre eigene Rolle mit den Techniken in Normans Antwort erwähnt, oder unter Verwendung von Parsec oder Verwendung Parser-Generatoren wie Glückliche .

Andere Tipps

Sie stellen Programme für beide Seiten rekursive algebraische Datentypen verwenden, und Programme analysieren Sie verwenden Parsen combinators . Es gibt eine Million Aromen; finden Sie drei hilfreiche Tutorial Papiere auf dem Zeitplan für meine Klasse Montag, 23. März 2009 Sie sind

Die Hutton und Meijer Papier ist die kürzeste und einfachste, aber es nutzt Monaden, die den Amateur nicht offensichtlich sind. Allerdings haben sie eine sehr schöne Grammatik und Parser für Ausdrücke. Wenn Sie Monaden grok noch nicht, Fokker Tutorial ist das eine.

Vielleicht können Sie einige realen Projekten buchen, um zu sehen, wie sie es tun?

Weniger als eine Woche her, dass die Sprache Python Projekt war angekündigt auf der Haskell-Cafe Mailingliste . Es ist ein Python Parser in Haskell implementiert, die Happy Parser-Generator und Alex Lexer Generator.

Und natürlich gibt es Möpse , eine Implementierung von Perl 6 in Haskell (die ersten Implementierung von Perl 6, die zu einer signifikanten Teilmenge der Spezifikation Perl 6 entspricht).

Ich kann nicht aus dem Ton Ihrer Frage sagen, ob dies das erste Mal ist, sind Sie versuchen, einen Compiler zu schreiben, oder wenn Sie Compiler geschrieben haben, vor und Beratung suchen sie sind spezifisch für Haskell. Wenn Sie bereits ein Compiler-Guru sind, was wenig Rat, den ich zu bieten haben wird helfen nicht. :)

Programmiersprache Grammatiken vertreten sind häufig in BNF Form , die kann durch Tools wie Yacc oder Bison verwendet werden Quellcode zu analysieren. Ich weiß nicht, ob dies gilt als Haskell-ian Weg, es zu tun, aber es ist der einzige Weg, die ich gehört habe. Mit etwas Graben um Sie können sich wahrscheinlich ein Werkzeug graben bis zu Haskell Code aus einer BNF-Grammatik zu erzeugen; Ich fand diesem Tool , die in der Lage sein behauptet, zu tun das.

Eine schnelle Google-Suche aufgedreht diese BNF-Grammatik für Haskell , und es gibt wahrscheinlich noch andere gibt, falls Sie einen Compiler für Haskell schreiben wollen (vielleicht möchten Sie eine Haskell Compiler in Haskell? schreiben) BNF-Grammatiken für C und Java scheinen beliebt zu sein.

Schließlich, wenn Sie sich für ein Buch über Compiler Design suchen, der klassische Text ist “ The Dragon Book ".

Leider gibt es keine Haskell Grammatik für ANTLR , aber vielleicht können Sie den Link oben zitierten verwenden zu schaffen, ein. ANTLR ist ein großer Java-basierte Parser-Generator.

Steve Yegge hat eine schöne über noreferrer"> Blog rel="nofollow Schreiben Compiler, wenn Sie mehr Motivation brauchen. Es ist unterhaltsam.

scroll top