Parsen von CSS mit ANTLR - Edge Cases

8

Ich versuche, CSS oder zumindest die Grundlagen mit ANTLR zu analysieren. Ich habe ein paar Probleme mit meinen Lexer-Regeln. Das Problem liegt in der Mehrdeutigkeit zwischen ID-Selektoren und hexadezimalen Farbwerten. Verwenden Sie zur Vereinfachung eine vereinfachte Grammatik, und beachten Sie die folgende Eingabe:

%Vor%

und die folgenden Parserregeln:

%Vor%

und diese Lexer-Token:

%Vor%

Dies wird nicht funktionieren, da #bbb als COLOR-Token in Token umgewandelt wird, obwohl es ein Selektor sein soll. Wenn ich den Selektor ändere, um nicht mit einem hexadezimalen Zeichen zu beginnen, funktioniert es gut. Ich bin mir nicht sicher, wie ich das lösen soll. Gibt es eine Möglichkeit, ANTLR mitzuteilen, ein bestimmtes Token nur als COLOR-Token zu behandeln, wenn es an einer bestimmten Position ist? Sagen wir, wenn es in einer Eigenschaftsregel ist, kann ich sicher annehmen, dass es ein Farb-Token ist. Wenn nicht, behandle es als Selektor.

Jede Hilfe wäre willkommen!

Lösung: Es stellte sich heraus, dass ich versuchte, zu viel in der Grammatik zu machen, mit der ich wahrscheinlich im Code umgehen sollte, indem ich den AST benutze. CSS hat zu viele zweideutige Token, um sich zuverlässig in verschiedene Tokens aufzuteilen. Daher verwende ich im Prinzip die Sonderzeichen wie '#', '.', ':' Und die geschweiften Klammern und mache die Nachbearbeitung im Verbrauchercode. Funktioniert viel besser, und es ist einfacher, mit den Randfällen umzugehen.

    
Erik van Brakel 24.08.2009, 23:25
quelle

4 Antworten

8

Versuchen Sie, die # in Ihrer Lexer-Datei von FARBE zu ihrer eigenen Sache zu verschieben:

%Vor%

Dann können Sie es in Ihren Parser-Regeln so machen:

%Vor%

usw.

Damit können Sie grammatikalisch den Unterschied angeben, der grob als kontextuell versus lexikalisch beschrieben werden kann, was grob als Aussehen beschrieben werden kann. Wenn sich die Bedeutung von Bedeutung ändert, hängt davon ab, wo sie sich befindet. Dieser Unterschied sollte in der Grammatik und nicht im Lexer angegeben werden.

Beachten Sie, dass Farbe und Auswahl dieselbe Definition haben. Lexer sind in der Regel eine separate Stufe von dem Modul, das die Eingabezeichenfolge in eine Grammatik übersetzt. Daher ist es ungültig, ein mehrdeutiges Lexikon zu haben (wie bereits erwähnt, könnte bbb hex sein oder eine Kleinbuchstabe sein). Daher muss die Datengültigkeitsprüfung an anderer Stelle durchgeführt werden.

    
Walt W 24.08.2009, 23:32
quelle
2

Zu was Walt gesagt hat, Anhang G. Grammatik von CSS 2.1 sagt zu lex HASH und dann (je nach Position relativ zum anderen Token), um HASH entweder als simple_selector oder als hexcolor zu analysieren.

Der Lexer definiert das folgende Token ...

%Vor%

... und die Grammatik enthält die folgenden Regeln ...

%Vor%

Dies bedeutet, dass ein Parser, der auf der Grammatik basiert, eine Hexadezimale Hexfarbe zulässt.

Ich würde später eine hexadezimale Hexadezimale erkennen, in einem Code, der den lexed + analysierten Syntaxbaum analysiert / interpretiert.

    
ChrisW 24.08.2009 23:40
quelle
0

Um eine Entscheidung aus mehreren Alternativen zu treffen, hat ANTLR zwei Optionen,

  • syntaktische Prädikate
  • semantische Prädikate

Dies ist aus der antilr-Grammatikbibliothek (css2.1 g):

%Vor%

Dies wird für syntaktische Prädikate verwendet.

Link zur Grammatik: Ссылка

    
Firat SARLAR 09.07.2012 22:32
quelle
0

Ich kam gerade hierher, indem ich googelte, und fand eine gute Ressource, eine echte Implementation. Für diejenigen, die nach einem kompletten CSS-Antlr-Programm suchen, schauen Sie sich die Grammatikdatei an. Dies kann Ihnen eine Idee geben oder Sie können sie direkt verwenden.

    
Diyoda_ 10.07.2013 17:47
quelle

Tags und Links