Java mit CUP Parser generieren

DarthSpot

Lt. Commander
Registriert
Mai 2008
Beiträge
1.112
Hallo,

Ich arbeite im Moment an einem Parser für eine Scriptsprache und stecke beim Umgang mit CUP (bin Neuling ^^) in der Klemme.

Geht um folgendes.

Ich habe Beispielsweise in der Syntax ein Konstrukt wie dieses hier (ein if):
if ::= IF expression THEN block {ELSEIF expression THEN block } [ELSE block] END
{} heißt beliebig oft wiederholbar, [] ist optional (0 oder 1 mal).

Nun erlaubt Cup aber solche Klammern in der Syntax nicht. Ich habe das ganze also ein wenig umgebaut zu

if ::= IF expression THEN block elseif else END;
elseif ::= ELSEIF expression THEN block elseif | empty;
else ::= ELSE block | empty;
empty ::= ;
Das Problem ist das empty, da es hierfür keinen wirklichen Ausdruck gibt, und CUP tonnenweise Konflikte erkennt, weil das leere Wort ja quasi überall steht.

Weiß jemand wie man sowas löst?

MfG
DarthSpot
 
Ich kann dir da zwar nicht helfen, aber du solltest mal einen Blick auf Xtext werden. Denn wenn du mit Xtext formal deine Sprache spezifizierst bekommst du auch gleich noch ein Eclipse-Plugin dazu ;)
 
Vielleicht klappt es so in der Art:
Code:
elseif ::= ELSEIF expression THEN block elseif
         | ELSEIF expression THEN block

if ::= IF expression THEN block elseif ELSE block END
     | IF expression THEN block ELSE block END
     | IF expression THEN block elseif END
     | IF expression THEN block END
 
hab dir mal ne grammatik zusammengebastelt, die funktionieren KÖNNTE.
allerdings kenne ich mich mit CUP nicht so gut aus und weiß nicht, welche anforderungen CUP an eine grammatik stellt.
nimm dir die grammatik aber nicht als beispielt, das ist mehr zusammengeschustert und sieht auch nicht toll aus:

if ::= ifheader END
if ::= ifheader elseopt END
ifheader ::= IF expression THEN block
elseopt ::= elsif
elseopt ::= else
elseopt ::= elsif elseopt
else ::= ELSE block
elsif ::= ELSEIF expression THEN block


das ganze nochmal verkürzt (falls CUP das versteht):

if ::= ifheader END | ifheader elseopt END
ifheader ::= IF expression THEN block
elseopt ::= elsif | else | elsif elsopt
else ::= ELSE block
elsif ::= ELSEIF expression THEN block
 
Ich kenne CUP jetzt nicht, aber in meinem eigenen Parser sieht meine Grammatik so aus:
if -> if conditition block (elseif condition block)* else block

condition erweitert sich halt zu allem was in einem if( ... ) stehen kann
block ist halt: { something here }
 
Zurück
Oben