RegEx Stringliteral finden - Jflex

Diskutiere RegEx Stringliteral finden - Jflex im Allgemeine Java-Themen Bereich.
W

werdas34

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.
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
 
W

werdas34

Die Antwort ist für die meisten Fälle ausreichend. Da wir aber extra die Anweisung erhalten haben folgende \n \t \’ \” \\ Escape Symbole zu erlauben, hat man das Problem wenn man ^\". Und ich weiß es jetzt nicht aber es gibt vermutlich mehr als nur diese Escape Symbole. Diese würden alle funktionieren.
Ich stelle mir das ca. so vor(da weiter unten in der Aufgabe steht es sollen nur Zeichen erlaubt werden, die in der Aufgabe erwähnt wurden:


Code:
ALPHA                 = [A-Za-z]
DIGIT                = [0-9]
WHITESPACE            = \s //[\ \t\n]
ESCAPE                 = [\n\t\’\"\\] 
SPECIAL_CHARACTER     = [&!#] // wird später noch aufgestockt
\"({ALPHA} | {DIGIT} | {ESCAPE} | {SPECIAL_CHARACTER} | {WHITESPACE})*\"
Die Eingabe die der RegEx bestehen muss ist folgende:
""
"&!#"
"use \n to denote a newline character"
"include a quote like this \" and a backslash like this \\"
Momentan sieht er alles als einen String an. Wie mache ich das? Ist das mit der Bedingung überhaupt möglich wenn \n zugelassen wird?
 
W

werdas34

Und wie in aller Welt soll das mit mehrzeiligen Kommentaren funktionieren?
/* fgarfd */
/*
sdfg
*/
Code:
^\/\*(.|\s)*?\*\/$
wird auf der Seite (https://regex101.com/r/RkheRs/1) als richtig gemeldet, sobald ich ihn ausführe sieht er nach dem ersten /* alles als einen String an...
 
O

Oneixee5

Das ist doch nicht schwer, deshalb habe ich darauf verzichtet. Aus \n wir \\n, aus \\ wird \\\\ usw.
Für mehrzeilige Text gibt es Regex-Flags, z.B.: s
 
Thema: 

RegEx Stringliteral finden - Jflex

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben