Frage

Ich bin ein JFLEX Lexer für Lua zu schreiben, und ich habe Probleme mit einem regulären Ausdruck der Gestaltung einen bestimmten Teil der Sprachspezifikation entsprechen:

  

Literalzeichenfolgen kann auch ein langes Format durch lange Klammern definiert werden. Wir definieren eine Öffnung Langbügel des Niveaus n als eine quadratische Öffnung Halterung durch eine andere Öffnung eckigen Klammer gefolgt n Gleichheitszeichen gefolgt von. So wird eine Öffnung lange Klammer der Ebene 0 geschrieben als [[eine Öffnung lange Klammer der Ebene 1 wird geschrieben als [= [, und so weiter. Eine Schließ lange Klammer ist in ähnlicher Weise definiert sind; zum Beispiel wird ein Schließbügel lange der Ebene 4 geschrieben, wie] ====]. Eine lange Reihe beginnt mit einer Öffnung langen Halterung jeder Ebene und endet an der ersten Schließ langen Klammer der gleichen Ebene. Literale in diesem klammert Form kann für mehrere Linien laufen, interpretieren keine Escape-Sequenzen und lange Klammern jeder anderen Ebene ignorieren. Sie können alles außer einer schließenden Klammer der richtigen Ebene enthalten.

Auf den Punkt gebracht, ich versuche, einen regulären Ausdruck zu entwerfen, die eine Öffnung lange Klammer, die String-Inhalt dazwischen, und das Schließ lange Klammer wird übereinstimmen. Ein Spiel sollte nur dann erfolgen, wenn die Öffnung lange Klammer und Schließen lange Klammer die gleiche Anzahl von Gleichheitszeichen haben, die null oder mehr sein können.

War es hilfreich?

Lösung

\[(=*)\[.*?\]\1\]

die \ 1 fängt die erste ().

Andere Tipps

Nun, ich habe Angst Tokenisieren mit regulären Ausdrücken ist nicht gut genug für diese Aufgabe. Reguläre Ausdrücke sind einfach nicht stark genug.

Es gibt keine Möglichkeit, die Anzahl der ‚=‘ Marken mit Klar regulären Ausdrücken in JFLEX zu vergleichen. Perl würde einen Hack dafür haben (\ 1 wie oben vorgeschlagen), aber wir reden hier nicht über die Programmierung Perl, aber JFLEX Lexer.

Die Lösung ist mit \ [= * \ [für die linke Klammer Token, \] = * \], um für die richtige Klammer Token, und dann in der darüberliegenden Schicht (Parser) vergleichen, wenn sie in der Länge entsprechen.

Wie auch immer, kann man sich read_long_string () in der lua Quellcode in llex.c und sieht, wie sie es taten, ohne überhaupt mit regulären Ausdrücken.

\[(=*)\[.*?\]\1\]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top