Hallo,
in meiner Compiler Vorlesung wollen wir als Übung einen eigenen Compiler schreiben.
In der ersten Phase soll aus dem Zeichenstrom die ganzen Keywords, Comments, Identifier, Datatypes und so weiter erkennen durch RegEx.
Ich kann alles erkennen außer Stringliterale.
String test = "Test"; //-> Output from RegEx: "Test"
Jflex ist ein Scanner, womit man die RegEx einträgt und spukt dann eine entsprechende Java Datei. Jflex basiert auf Java.
Wenn man jetzt Java-Syntax verwende muss man aufpassen, da sonst die Java-Datei nicht compiliert werden kann.
Der RegEx && muss in JFlex "&&" heißen und nicht &&, wie es bei anderen RegEx der Fall ist. Sonst spukt die Java datei nen Fehler.
Bei Stringliteralen ist das jetzt bisschen schwierig. Entweder "Test" dann lautet der eigentliche RegEx Test. Mache ich ""Test"" funktioniert es auch nicht.
Der Stringliteral darf leer sein, Sonderzeichen und paar Escape Zeichen (\n, \t, \’, \", \\) enthalten.
Kann mir jemand einen Tipp sagen wie ich das hinkriege? Oder jemand schonmal mit Jflex gearbeitet?
Hier mal die gekürzte Variante vom Code.
mfg werdas34
in meiner Compiler Vorlesung wollen wir als Übung einen eigenen Compiler schreiben.
In der ersten Phase soll aus dem Zeichenstrom die ganzen Keywords, Comments, Identifier, Datatypes und so weiter erkennen durch RegEx.
Ich kann alles erkennen außer Stringliterale.
String test = "Test"; //-> Output from RegEx: "Test"
Jflex ist ein Scanner, womit man die RegEx einträgt und spukt dann eine entsprechende Java Datei. Jflex basiert auf Java.
Wenn man jetzt Java-Syntax verwende muss man aufpassen, da sonst die Java-Datei nicht compiliert werden kann.
Der RegEx && muss in JFlex "&&" heißen und nicht &&, wie es bei anderen RegEx der Fall ist. Sonst spukt die Java datei nen Fehler.
Bei Stringliteralen ist das jetzt bisschen schwierig. Entweder "Test" dann lautet der eigentliche RegEx Test. Mache ich ""Test"" funktioniert es auch nicht.
Der Stringliteral darf leer sein, Sonderzeichen und paar Escape Zeichen (\n, \t, \’, \", \\) enthalten.
Kann mir jemand einen Tipp sagen wie ich das hinkriege? Oder jemand schonmal mit Jflex gearbeitet?
Hier mal die gekürzte Variante vom Code.
Code:
%%
%class Scanner
%standalone
%line
%column
//%implements sym
ALPHA = [A-Za-z]
ZERO = 0
DIGIT = [1-9]
ESCAPE = (\n|\t|\’|\"|\\)
SPECIAL_CHARACTER = [&!#]
WHITESPACE = ([ \t\n] | " ")
%{
static int counter = 1;
void prettyPrint(int line, int column, String regex){
System.out.println(counter + ":\t Zeile: " + line + "\t Spalte: " + column + "\t gefundener Ausdruck: " + regex);
counter++;
}
%}
%%
/*Stringliteral*/
"({ZERO} | {DIGIT} | {ALPHA} | {ESCAPE} | {SPECIAL_CHARACTER} | {WHITESPACE})*" {prettyPrint(yyline, yycolumn, yytext() + " - Stringliteral");}
/*Operator*/
"!" {prettyPrint(yyline, yycolumn, yytext() + " - Operator");}
"&&" {prettyPrint(yyline, yycolumn, yytext() + " - Operator");}
"||" {prettyPrint(yyline, yycolumn, yytext() + " - Operator");}
mfg werdas34