Unix Flex Regex für mehrzeilige Kommentare

8

Ich mache einen Lexical Analyzer mit Flex unter Unix. Wenn Sie es jemals verwendet haben, bevor Sie wissen, dass Sie hauptsächlich nur die Regex für die Token der Sprache definieren, für die Sie den Lexical Analyzer schreiben. Ich bin fest im letzten Teil. Ich brauche die richtige Regex für mehrzeilige Kommentare, die etwas wie

erlaubt %Vor%

erlaubt aber auch

%Vor%

Kann jemand dabei helfen?

    
LunaCodeGirl 21.01.2011, 06:15
quelle

4 Antworten

14

Sie stimmen C-Stil-Kommentare nicht mit einem einfachen regulären Ausdruck in Flex ab. Sie erfordern eine komplexere Matching-Methode basierend auf Startzuständen. Die Flex FAQ sagt, wie (nun, sie tun es für die /*...*/ form; die Handhabung des anderen Formulars in <INITIAL> sollte einfach sein).

    
Donal Fellows 21.01.2011, 08:59
quelle
7

Wenn Sie jedoch nur mit Regex auskommen müssen, gibt es in der Tat eine nicht allzu komplexe Lösung:

"/ *" ([^ *] | (\ * + [^ * /])) * \ * + \ / Die vollständige Erklärung und Herleitung dieser Regex ist auf hier exzellent ausgearbeitet Zusamenfassend:
  • "/ *" markiert den Beginn des Kommentars
  • ([^ *] | (\ * + [^ * /])) * sagt alle Zeichen, die nicht * sind ([^ *]) oder akzeptiert eine Folge von einem oder mehreren * so lange wie die Sequenz hat kein '*' oder ein '/' (das (* + [^ * /])). Das bedeutet, dass alle ****** ... Sequenzen mit Ausnahme von ***** / akzeptiert werden, da Sie dort keine Sequenz von * finden können, auf die kein * oder ein / folgt.
  • Der ******* / Fall wird dann vom letzten Bit der RegEx verarbeitet, das einer beliebigen Anzahl von * gefolgt von einem / entspricht, um das Ende des Kommentars zu markieren, d. h. \ * + \ /     
  • Abraham Philip 31.08.2015 22:15
    quelle
    -2

    Ich weiß Flex nicht, aber ich kenne Regexs. /\/\*.*?\*\//s sollte mit beiden Typen übereinstimmen (in PCRE), aber wenn Sie sie in Ihrem Analysator unterscheiden müssen, können Sie die Liste der Übereinstimmungen dann iterieren, um zu sehen, ob sie der zweite Typ mit /\*\*\s+\/{4}/

    sind     
    Walf 21.01.2011 08:23
    quelle

    Tags und Links