Sind Scalas / Haskells Parser-Kombinatoren ausreichend?

8

Ich frage mich, ob Scalas / Haskells Parser-Kombinatoren ausreichen, um eine Programmiersprache zu analysieren. Genauer gesagt die Sprache MiniJava. Ich lese gerade Compiler-Konstruktion und jflex und Java Cup ist ziemlich schmerzhaft, damit zu arbeiten, also frage ich mich, ob ich stattdessen Parser-Kombinatoren verwenden könnte / sollte. Die MiniJava-Syntax ist sehr klein. MiniJavas BNF: Ссылка

    
Daniel W 28.01.2009, 22:51
quelle

6 Antworten

4

Scalas Parser ist ein Backtracking-Parser, also kann er mit so ziemlich jedem BNF oder EBNF umgehen. Es bedeutet aber auch, dass es Kantenfälle gibt, bei denen die Eingabe mühsam langsam gelesen werden kann.

Wenn die Grammatik in eine LL (1) Grammatik geändert werden kann, können Sie die ~! Bediener, um das Zurückverfolgen auf ein Minimum zu beschränken.

Die Grammatik kann wahrscheinlich in LL (1) umgewandelt werden, aber wie geschrieben, ist es nicht. Sehen Sie zum Beispiel, dass Ausdruck und Anweisung erste / erste Konflikte haben (schauen Sie dies am Ende des verlinkten Artikels nach).

Wie auch immer, für ein akademisches Projekt reicht es. Für echte Compiler Zeug, benötigen Sie schnellere Parser.

    
Daniel C. Sobral 08.07.2009, 21:58
quelle
11

Ich habe Scala nie benutzt, aber die Existenz eines definitiven BNF macht das einfach.

Trivial übersetzt in Haskells Text.ParserCombinators.Parsec :

%Vor%

usw. Die PArrows Übersetzung ist auch ziemlich trivial. Sie werden wahrscheinlich eine klarere Lexing-Phase vor dem Parser finden, aber Sie können auch ohne.

    
ephemient 29.01.2009 02:06
quelle
6

Ich benutze Scalas Parser-Kombinatoren, um PL / SQL-Code zu analysieren, es funktioniert wie ein Zauber.

    
Germán 29.01.2009 20:52
quelle
5

Zumindest hat Parsec einen integrierten Lexer für Java-ähnliche Sprachen:

%Vor%

Sie müssen die reservierten Wörter selbst definieren.

    
mattiast 29.01.2009 08:50
quelle
2

Programmierung in Scala (S. 647) sagt:

  

Es [Scalas Parser-Kombinator-Framework] ist viel einfacher zu verstehen und anzupassen als ein Parser-Generator, und der Unterschied in der Geschwindigkeit würde in der Praxis oft keine Rolle spielen, es sei denn, Sie möchten sehr große Eingaben analysieren.

Da ich Quellcode nicht als sehr große Eingabe klassifizieren würde (im Idealfall), sollte es ausreichen.

    
Fabian Steeg 28.01.2009 23:07
quelle
0

Ich habe mich nicht mit den Scala- oder Haskell-Parser-Kombinator-Bibliotheken beschäftigt, aber es sieht so aus, als ob die Grammatik in Ordnung sein sollte.

    
Jay Kominek 28.01.2009 23:05
quelle