9
votes

Analyse CSS avec des cas d'antlr - bords

J'essaie d'analyser CSS, ou du moins les bases, à l'aide d'AntLR. Je rencontre quelques problèmes avec mes règles Lexer. Le problème réside dans l'ambiguïté entre un sélecteurs d'identifiant et des valeurs de couleur hexadécimale. En utilisant une grammaire simplifiée pour la clarté, considérez l'entrée suivante: xxx pré>

et les règles d'analyseur suivantes: p> xxx pré>

et ces jetons Lexer:

ALPHANUM : ('a'..'z' | '0'..'9')+;
COLOR : '#' ('0'..'9' | 'a'..'f')+;


0 commentaires

4 Réponses :


8
votes

Essayez de déplacer le # dans votre fichier lexer de la couleur à sa propre chose, comme tel: xxx pré>

puis, dans vos règles d'analyseur, vous pouvez le faire comme ceci: P>

color: HASH (LLETTERS | ALPHANUM)+;
selector: HASH (ULETTERS | LLETTERS) (ULETTERS | LLETTERS | NUMBERS)*;


5 commentaires

Cela ne fonctionne toujours pas. Le problème est que BBB (ou tout ce qui commence par 0..9 | A..f) sera bekenized comme hextring. Cela empêchera #BBB d'être assorti comme sélecteur.


Eh bien, j'étais en retard là-bas. Je pense que puisque BBB est à la fois une chaîne valide et une hextring valide, vous devrez effectuer une vérification de la validité des données du logiciel.


C'est ce que j'ai peur de. Espérons qu'il y a un gourou d'Antlr qui courait ici sur Stackoverflow qui peut vous prouver: /


Oui, il pourrait y avoir une meilleure façon. Mais cela devrait fonctionner. . Désolé, je n'ai apparemment pas écrit d'analyseur dans un moment: - [


Il semble que votre exemple n'est pas complet comme si c'était.



2
votes

à Idito ce que Walt a dit, Annexe G. Grammaire de CSS 2.1 dit à lex hachage , puis (en fonction de sa position par rapport à d'autres jetons) pour analyser un hachage soit comme un simple_selector ou comme < code> heexcolor .

Le lexer définit le jeton suivant ... xxx

... et la grammaire comprend les règles suivantes ... xxx

Cela signifie qu'un analyseur basé sur la grammaire permettrait à un hexcolor non hexagonal.

Je détectionnerais un hexcolor non-hexagonal plus tard, en code qui analyse / interprète l'arborescence de la syntaxe + analysée lexed +.



0
votes

Pour prendre une décision à partir de plusieurs alternatives, ANTLR a deux options,

  • Prédicats syntaxiques LI>
  • prédicats sémantiques li> ul>

    Il s'agit d'Antlr Grammar Lib (CSS2.1 G): P>

    simpleSelector
        : elementName 
            ((esPred)=>elementSubsequent)*
    
        | ((esPred)=>elementSubsequent)+
        ;
    
    esPred
        : HASH | DOT | LBRACKET | COLON
        ;
    
    elementSubsequent
        : HASH
        | cssClass
        | attrib
        | pseudo
        ;
    
    cssClass
        : DOT IDENT
        ;
    
    elementName
        : IDENT
        | STAR
        ;
    
    


0 commentaires