2008-11-01 7 views
15

Ich unterrichte (mit anderen) einen relativ einführenden Kurs in Informatik für IT-Fachleute ohne Hintergrund in CS. Seit ich die Kursmaterialien zu Automaten und Grammatiken entwickelt habe, bin ich auch verantwortlich für die Vermittlung von Compilern und Compilerkonstruktionen.Welcher Parser-Generator soll meine Schüler unterrichten?

Vor Jahren, als ich Compilation in der Schule studierte, kamen alle unsere Beispiele von Lex und Yacc. Sind diese noch weit verbreitet? Gibt es etwas, das häufiger für Java verwendet wird? Die Studenten beherrschen C und Java, haben aber nie Parser-Generatoren benutzt.

Irgendwelche Tipps, was würde zu lehren

+1

Viel Glück in Ihren Lehren! –

+0

Dies wäre am Thema bei http://cseducators.stackexchange.com (obwohl es immer noch in der privaten Beta ist, ist es am einfachsten, hier https://area51.stackexchange.com/proposals/92460/computer-science- Erzieher) –

Antwort

29

Antlr ist weit verbreitet, gut dokumentiert und frei geschätzt. Es wird von Ant unterstützt und kann Java auf viele andere Sprachen ausrichten.

+0

Das stimmt. Wenn sie bereits Java kennen, ist Antlr der richtige Weg. – tunaranch

1

Ich erinnere mich, CUP zu verwenden und es zu mögen. Werfen Sie einen Blick auf die CUP Parser Generator for Java.

CUP wird an der Technischen Universität München gepflegt. Ich glaube, es ist der Hauptzweck, Studenten zu unterrichten.

Es hat auch ein kostenloses Lizenzmodell.

... Die Erlaubnis, zu kopieren, zu modifizieren, und diese Software verbreiten und seine Dokumentation für jeden Zweck und ohne Gebühr wird hiermit erteilt, vorausgesetzt, dass die oben stehende Copyright Hinweis in allen Kopien erscheinen und dass sowohl der Urheberrechtsvermerk und dieser Genehmigungshinweis und Garantie Haftungsausschluss bei der Unterstützung Dokumentation erscheinen ...

+0

Wenn Sie CS unterrichten, könnten Sie an dem neuen [CS Educator's Stack Exchange] (http://cseducators.stackexchange.com) interessiert sein (obwohl es sich noch in der privaten Beta befindet, ist es am einfachsten, [hier] einzugeben (https: //area51.stackexchange.com/proposals/92460/computer-science-educators)) –

5

Lex und Yacc ist noch im Einsatz . Eine der neuesten Sprachen, F #, hat eigene Versionen (fslex, fsyacc - siehe here für ein Beispiel). Ich denke, dass es immer noch relevant ist, sie zu unterrichten.

1

Sie könnten den Generatorteil überspringen und sich die Scalas-Parser-Kombinatoren ansehen.

3

PEG-Parser-Systeme wie RATS sind einfacher als die Lex/Yacc-Combo. Dies mag für Ihre Klasse ein Vorteil sein oder auch nicht: Ist es Ihr Ziel, über reguläre Ausdrücke und endliche Automaten, LR-Grammatiken und Push-Down-Automaten usw. zu unterrichten? Oder wollen Sie die einfachsten praktischen Compiler-Frontend-Tools?

(Da ich programmiere nicht in diesen Tagen in Java Ich habe nicht versucht RATS insbesondere.)

0

Ich bin derzeit einen Compiler Kurs unter die Lex und Yacc verwendet. Ich kenne keine anderen Typen da draußen, aber die Theorie, die wir lernen, scheint diesen Tools ziemlich gut zu entsprechen.

10

Es ist schade, dass Ihre Schüler nicht in C++ versiert sind. Sobald ich auf die Spirit Bibliothek mit seinem Konzept eines reichen, EBNF-Stil DSL stieß, habe ich Antlr, Lex und Yacc hinter sich gelassen! Es ist viel flexibler mit der neben dem Code beschriebenen Grammatik.

Brilliante Bibliothek, allerdings mit einer zugegebenermaßen nicht-trivialen Lernkurve.

Aber ohne C++, Antlr ist wahrscheinlich Ihre beste Wette.

+0

Ich benutzte sogar Geist, um Befehlszeilenargumente zu analysieren ... :) – xtofl

+1

Mag die Bibliothek programm_options nicht, nicht wahr? :) – MattyT

+2

In unserer Universität (ich studiere noch), verwenden wir Boost :: Spririt als Basis für das Unterrichten von Parsing und fortgeschrittenem C++. Es funktioniert wirklich gut für diejenigen, die motiviert sind, zu lernen, aber natürlich scheint viel zu tiefgründig für cruisy Studenten –

14

Ich benutze keine Lexer und Parser-Generatoren. Sie sind einfach genug, um von Hand zu generieren, und sind die einfachsten Teile eines Compilers zu schreiben. Außerdem, wenn Sie sie von Hand bauen, können Sie sie wirklich schnell machen.

+4

Sie haben anscheinend nie komplizierte Parser/Lexer geschrieben ... Sie wollen wirklich nicht diejenigen von Hand pflegen, wenn sie werde kompliziert. – Jorn

+13

Ja, ich habe Parser und Lexer von Hand gemacht, die willkürliches Lookahead und Backtracking machen, und sogar eines für C++! (Das C++ ist ein bisschen schwieriger wegen seiner Interaktionen mit dem Präprozessor, Token, die existieren oder nicht basierend auf Compiler-Switches usw.) –

+3

Mehr Nekromantie ... Ich liebe die Arroganz der Jugend. Jorn, wenn Sie noch eine Aufmerksamkeitsspanne haben ... www.digitalmars.com – JimR

0

Ich erinnere mich Klassen Bison in einem meiner Compiler. Wir haben auch Flex und YACC verwendet.

1

Wenn Sie mit Java arbeiten möchten, sollten JavaCC oder ANTLR ausreichen. Dieser letztere unterstützt auch C und Python. Aber wenn Sie vorhaben, mit C++ zu arbeiten, sollten Sie sich vielleicht Boost :: Spirit anschauen.

1

Ich habe es noch nicht versucht, aber ich fand jparsec vor ein paar Tagen. Es ist kein Parser-Generator, stattdessen wird der Parser in Java von Kombinatoren in einem EBNF-Stil erstellt.

5

Yacc und alle anderen LALR (1) Parser stammen aus einer Zeit, in der die Maschinenressourcen knapp waren und man viel Zeit mit dem Entwickeln der Grammatik verbringen musste, um überhaupt einen Parser auf einem PDP-11 laufen zu lassen mit 64K RAM. Heute macht es keinen Sinn, ein Werkzeug wie Yacc mit einer schrecklichen menschlichen Schnittstelle und einem sehr begrenzten Satz von Grammatiken zu unterrichten.

Ich würde entweder einen der PEG-basierten Parser, wie Ratten !, oder den GLR-Parser Elkhound von George Necula und Scott McPeak (danke Quark) empfehlen. Leider kann ich kein spezielles Tool für Java, sondern Ratten empfehlen! ist gut für C.

ANTLR ist in Ordnung, aber ist zu komplex für meinen Geschmack.

+0

Open-Source-GLR-Parser: Elkhound. http://www.scottmcpeak.com/elkhound. Es wurde sogar verwendet, um einen C++ Parser zu erzeugen. – quark

0

OCaml hat eine fantastische Reihe von Parser-Generatoren. Here sind einige einfache Beispiele.

JavaCC ist auch ziemlich gut.

Ich würde dringend empfehlen, C (und C++) für diesen Zweck zu vermeiden, weil sie in diesem Zusammenhang außerordentlich schmerzhaft sind.

1

Ich mag die GOLD Parsing System sehr, weil es im Grunde generiert die Tabellen benötigt und Sie müssen dann nur eine (generische) Implementierung eines Prozessors, der die Tabelleninformationen verwendet, um die Token zu verarbeiten. Diese Engine (wie sie genannt wird) ist ziemlich einfach zu schreiben und ist im Grunde eine reine Implementierung, die die LALR- und DFA-Tabellen verwendet, um die Eingabe zu verarbeiten, und das Schreiben einer solchen Implementierung kann eine gute Übung sein, um diese zu lehren.

+0

Warum der Downvote? Jemand? – Lucero

Verwandte Themen