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: et les règles d'analyseur suivantes: p> et ces jetons Lexer: ALPHANUM : ('a'..'z' | '0'..'9')+;
COLOR : '#' ('0'..'9' | 'a'..'f')+;
4 Réponses :
Essayez de déplacer le # dans votre fichier lexer de la couleur à sa propre chose, comme tel: 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)*;
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.
à Idito ce que Walt a dit, Annexe G. Grammaire de CSS 2.1 dit à lex Le lexer définit le jeton suivant ... p> ... et la grammaire comprend les règles suivantes ... p> Cela signifie qu'un analyseur basé sur la grammaire permettrait à un hexcolor non hexagonal. P> Je détectionnerais un hexcolor non-hexagonal plus tard, en code qui analyse / interprète l'arborescence de la syntaxe + analysée lexed +. p> p> hachage code>, puis (en fonction de sa position par rapport à d'autres jetons) pour analyser un
hachage code> soit comme un
simple_selector code> ou comme < code> heexcolor code>.
Oui, je connais cette annexe. C'est ce que j'utilise comme une de mes sources pour la grammaire que je bâche. Ne résout pas le problème pour moi cependant :(
@Erik: Avez-vous consulté la grammaire CSS disponible à antlr.org/gramar/ListOr./a >
Oui, j'ai pris un oeil à la grammaire CSS 3, il montre la même erreur.
"Ne résout pas le problème pour moi cependant" - quel problème? Si vous implémentez la grammaire comme spécifié dans la spécification, cela fonctionne. Votre problème est peut-être que vous essayez de réécrire la grammaire spécifiée pour le rendre plus strict que dans la spécification, peut-être (je ne sais pas pourquoi) pour déplacer la vérification des erreurs dans l'analyseur.
Peut-être que j'ai mal interprété, ou je fais quelque chose de mal avec Antlr. Je vais regarder à nouveau dans la question et revenir à cette question à cette époque. Probablement demain ou le lendemain.
Plutôt que d'Antlr (que je n'ai pas essayé), j'ai fait la machine à lisière de la machine de grammaire spécifiée à l'aide de l'analyseur à l'or, mais de toute façon qui fonctionnait.
Pour prendre une décision à partir de plusieurs alternatives, ANTLR a deux options,
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 ;
Je viens de venir ici par Googling et a trouvé une bonne ressource, une véritable implication. Pour ceux qui viennent et recherchent un grammer complet CSS Antlr, jetez un coup d'œil à Ceci un fichier de grammaire> Cela peut vous donner une idée ou vous pouvez l'utiliser directement. p>