Estoy tratando de analizar CSS, o al menos los conceptos básicos, utilizando ANTLR. Sin embargo, estoy teniendo algunos problemas con mis reglas de Lexer. El problema radica en la ambigüedad entre los selectores de ID y los valores de color hexadecimales. El uso de una gramática simplificada para mayor claridad, considere la siguiente entrada:Análisis CSS con ANTLR - casos extremos
#bbb {
color: #fff;
}
y las siguientes reglas del analizador:
ruleset : selector '{' property* '}';
selector: '#' ALPHANUM;
property: ALPHANUM ':' value ';' ;
value: COLOR;
y estas fichas lexer:
ALPHANUM : ('a'..'z' | '0'..'9')+;
COLOR : '#' ('0'..'9' | 'a'..'f')+;
Esto no va a funcionar, porque #bbb se tokeniza como un token de COLOR, aunque se supone que es un selector. Si cambio el selector para que no comience con un carácter hexadecimal, funciona bien. No estoy seguro de cómo resolver esto. ¿Hay alguna manera de decirle a ANTLR que trate una ficha específica solo como una ficha de COLOR si está en una posición determinada? Digamos, si está en una regla de propiedad, puedo suponer con seguridad que es un token de color. Si no es así, trátalo como un selector.
¡Cualquier ayuda sería apreciada!
Solución: Resulta que yo estaba tratando de hacer demasiado en la gramática, lo que probablemente debería tratar en el código utilizando el AST. CSS tiene demasiados toques ambiguos para dividir de manera confiable en tokens diferentes, por lo que el enfoque que estoy usando ahora es básicamente tokenizar los caracteres especiales como '#', '.', ':' Y las llaves, y hacer el procesamiento posterior en el código de consumidor Funciona mucho mejor, y es más fácil lidiar con casos extremos.
Esto todavía no funciona. el problema es que bbb (o cualquier cosa que comience con 0..9 | a..f) se tokenizará como HEXSTRING. Esto evitará que #bbb coincida como un selector. –
bueno, en realidad estaba al revés allí. Creo que dado que bbb es una cadena válida Y una cadena hexadecimal válida, necesitará hacer una verificación de validez de datos del lado del software. –
Eso es lo que temo. Con suerte, hay un gurú antlr corriendo por stackoverflow que puede probar que estás equivocado:/ –