JS/CC Parser Generator
-
Hallo Zusammen!
Ich möchte hier gerne mein neues Open Source Projekt etwas bekannter machen. Es ist der JS/CC, ein in JavaScript programmierter LALR(1) Parser und Lexer Generator, der Parser in JavaScript und anderen ECMAScript-Derivaten erzeugt.
Das Programm ist sehr speziell und sicherlich nicht für Jedermann geeignet. Die Intention hinter JS/CC war es in erster Linie, einen Parser Generator zu schreiben, der vollständig als JavaScript-Applikation im Webbrowser lauffähig ist, und einen Einblick in die Erzeugung von LALR(1) Parsern gibt. Da JS/CC auch als WSH-Version und JScript.NET executable lauffähig ist, ist auch ein produktiver Einsatz als Parser Generator für weiterführende Projekte denkbar.
JS/CC habe ich unter der Artistic License als Open Source veröffentlicht.
Die offizielle Projekt-Website findet ihr unter http://jscc.jmksf.com/. Das Programm sowie die Dokumentation sind komplett auf Englisch gehalten.Hinweis: Es werden Kenntnisse im Bereich Compilerbau vorausgesetzt, da weder das Programm noch die Doku in die Theorien und Algorithmen des Compilerbaus einführt.
Grüße
~code_pilot
-
schaut brauchbar aus, jedoch sollte das in javascript auch als angenehme dsl lösbar sein
-
ronny schrieb:
...jedoch sollte das in javascript auch als angenehme dsl lösbar sein
Danke, aber was definierst du als "dsl"? ... Domain Specific Language?
-
ja
in javascript hat man schlieslich die möglichkeit das ganze so zu schreiben, das man keinen zwischenprozessor benötigt
-
Hm? Also so ganz verstehe ich dich nicht. Hast du dafür mal ein Beispiel??
-
code_pilot schrieb:
Hm? Also so ganz verstehe ich dich nicht. Hast du dafür mal ein Beispiel??
In C++ gibts dafür eine Library, boost::proto um solche DSEL zu implementieren.
z.B. basiert spirit2 auf proto. Evtl. schaust du dir mal die Spiritartikel im Magazin an, für mehr Infos.
-
Hallo, verstehe.
http://www.boostcon.com/var/sphene/sphwiki/attachment/2007/06/01/Proto2.pdf
Naja ist mir jetzt auch egal, jetzt ist das JS/CC Projekt so wie es ist, und es findet auch einige positive Resonanzen bisher.
Ich muss gestehen mit DSELs habe ich mich bisher noch nie beschäftigt. Das kann vielleicht daran liegen, das ich einer der klassischen Programmierer bin, die sich nicht mit diesem neuen Zeug beschäftigen (hey, immerhin programmier' ich bei mir auf der Arbeit noch echtes K&R C!). Echtes C++ habe ich noch nie wirklich programmiert, will ich mir aber auch unbedingt aneignen, wenn ich ein dazu passendes Projekt finde.
Grüße
~code_pilot
-
man könnte das z.B. so schreiben:
/* * es gilt die annahme, der parser ignoriert whitespace und * übergibt die festen string token nicht an die handler */ var p = Parser(); with(p) { e = rule('expression') with(e) { on(Number, function(nr) { return parseInt(nr) }); on('(', e, ')', function(eres) { return eres; }); on(e, '+', e, function(e1, e2) { return e1 + e2 ; }); on(e, '*', e, function(e1, e2) { return e1 * e2 ; }); on(e, '-', e, function(e1, e2) { return e1 - e2 ; }); on(e, '/', e, function(e1, e2) { return e1 / e2 ; }); } } alert(p.parse('(1+2)*3'); // sollte 9 ergeben
-
Hm jo ist doch dann nichts anderes als ein Parser Generator, der "on the fly" generiert wird. Sowas lässt sich aber AFAIK besser mit PEGs und Packrat-Parsern anstatt mit LALR(1) Parsern realisieren.
Gruß
~code_pilot
-
wenn man die möglichkeit hat, den parser on the fly zu erzeugen, dann sollte man sie imho nutzen
das erleichtert die implementation wesentlich (da man nicht noch einen exra parser braucht, um den eigentlichen parser zu parsen
-
Das ist richtig. Aber im Grunde tut man ja da nichts anderes, als über Funktionsaufrufe (im Fall von C++ natürlich auch über Templates usw., kenne mich damit ja (noch) nicht so mit aus) die Grammatik zu definieren - intern passiert nichts anderes als das, was der Parser Generator (in diesem Fall JS/CC) tut, wenn er die Syntax-Datei parst. Beim exec() oder eval() werden dann evtl. Parser-Tabellen (im Fall von Bottom-Up oder Tabellengesteuerter Top-Down Parser) oder Nichtterminal-Funktionen (im Fall von Rekursiv-Absteigenden Top-Down/Packrat Parsern) erzeugt bzw. gesetzt, um die Grammatik zu parsen.
Könnte man dann theoretisch aus JS/CC auch bauen ;).
Gruß
code_pilot