Sto cercando di analizzare i CSS, o almeno le basi, usando ANTLR. Tuttavia, sto incontrando alcuni problemi con le mie regole di lexer. Il problema sta nell'ambiguità tra i selettori ID e i valori esadecimali dei colori. Utilizzando una grammatica semplificata per chiarezza, si consideri il seguente testo:Analisi CSS con ANTLR - edge case
#bbb {
color: #fff;
}
e le seguenti regole parser:
ruleset : selector '{' property* '}';
selector: '#' ALPHANUM;
property: ALPHANUM ':' value ';' ;
value: COLOR;
e questi gettoni lexer:
ALPHANUM : ('a'..'z' | '0'..'9')+;
COLOR : '#' ('0'..'9' | 'a'..'f')+;
questo non funzionerà, perché #bbb è tokenizzato come token COLOR, anche se dovrebbe essere un selettore. Se cambio il selettore in modo che non inizi con un carattere esadecimale, funziona perfettamente. Non sono sicuro di come risolvere questo. C'è un modo per dire ad ANTLR di trattare un token specifico solo come token COLOR se si trova in una certa posizione? Supponiamo che, se si tratta di una regola di proprietà, posso tranquillamente pensare che si tratti di un token a colori. Se non lo è, trattalo come un selettore.
Qualsiasi aiuto sarebbe apprezzato!
Soluzione: Si scopre che stavo cercando di fare troppo nella grammatica, che dovrei probabilmente affrontare nel codice utilizzando l'AST. Il CSS ha troppi token ambigui per dividere in modo affidabile in diversi token, quindi l'approccio che sto usando ora sta fondamentalmente dando un token ai caratteri speciali come '#', '.', ':' E le parentesi graffe, e facendo post processing nel codice del consumatore. Funziona molto meglio ed è più facile gestire i casi limite.
Questo ancora non funziona. il problema è che bbb (o qualsiasi cosa che inizia con 0..9 | a..f) verrà tokenizzato come HEXSTRING. Ciò impedirà a #bbb di essere abbinato come selettore. –
beh, in realtà ero indietro lì. Credo che dal momento che bbb sia una stringa valida E una stringa esadecimale valida, sarà necessario eseguire il controllo della validità dei dati sul lato software. –
Questo è quello di cui ho paura. Speriamo che ci sia un guru del genere in giro qui su StackOverflow che può dimostrare che hai torto:/ –