Thread Erlaubte "Klammerzeichen" bei Regexen und anderen quote-like-Operatoren (6 answers)
Opened by GwenDragon at 2021-01-07 16:23

haj
 2021-01-07 19:35
#193094 #193094
User since
2015-01-07
521 Artikel
BenutzerIn

user image
Du meinst die regulären Ausdrücke in Perl? Die sind beschrieben in perlop, "Quote and Quote-like operators".

Dass man dafür eine BNF erstellen kann, bezweifle ich stark... da gibt es einige sehr unangenehme Sonderfälle.
Zunächst kann man praktisch jedes Zeichen als Begrenzer definieren. Zwei Beispiele:
Code (perl): (dl )
1
2
3
4
'foo' =~ m#(oo)#;  # legal
'foo' =~ m X(oo)X; # legal
'foo' =~ mX(oo)X;  # Syntaxfehler
'foo' =~ m #(oo)#; # Syntaxfehler

Bei // als Begrenzung stolpern fast alle Highlighter über die Schwierigkeit, eine Division von einer Regex zu unterscheiden.
Code (perl): (dl )
1
2
3
4
$a + /oo/; # Regex, ausgeschrieben $_ =~ /oo/
$a ++ / oo;  # Division
sin  / 25 ; # / ; die "this dies!";
time / 25 ; # / ; die "this doesn't die";

Die letzten beiden Beispiele kommen aus dem vielzitierten Artikel von Randal Schwartz auf Perlmonks. Noch prinzipieller hat Jeffrey Kegler in einer Artikelreihe nachgewiesen, dass man Perl nicht statisch parsen kann. Man muss den Code ausführen, um die syntaktische Korrektheit festzustellen. In Kurzform: Only perl can parse Perl.

Man kann sich dem Syntax-Highlighting in Perl nur annähern, indem man bestimmte syntaktisch korrekte Konstruktionen nicht unterstützt. Beispiel: Ich kenne keinen Syntax-Highlighter, der folgenden legalen Code richtig darstellt:
Code (perl): (dl )
1
2
3
4
5
6
use 5.010;
sub geht's {
    say "es geht!"
}

geht's;
UDIAGS. Denn sowas sollte man außer zu Gaudi-Zwecken wie dem don't-Block nicht schreiben.

Wenn's sinnvolle oder häufig auftretende Konstruktionen gibt, die ein bestimmter Highlighter falsch macht, dann kannst Du drauf hoffen, dass jemand eine Korrektur findet (ohne an anderer Stelle etwas kaputtzumachen).
Aber zur Gänze Perl in JavaScript richtig parsen - das geht wohl kaum.

View full thread Erlaubte "Klammerzeichen" bei Regexen und anderen quote-like-Operatoren