Próbuję parsować CSS, lub przynajmniej podstawy, używając ANTLR. Mam jednak kilka problemów z moimi zasadami dotyczącymi leksykonu. Problem polega na niejednoznaczności między selektorami ID a szesnastkowymi wartościami kolorów. Korzystanie z uproszczoną gramatykę dla jasności, należy rozważyć następujące dane wejściowe:Parsowanie CSS z ANTLR - przypadki krawędzi
#bbb {
color: #fff;
}
oraz następujące zasady parsera:
ruleset : selector '{' property* '}';
selector: '#' ALPHANUM;
property: ALPHANUM ':' value ';' ;
value: COLOR;
i te znaki Lexer:
ALPHANUM : ('a'..'z' | '0'..'9')+;
COLOR : '#' ('0'..'9' | 'a'..'f')+;
to nie będzie działać, ponieważ #bbb jest tokenem jako token COLOR, mimo że powinien to być selektor. Jeśli zmienię selektor, aby nie zaczynał się od znaku szesnastkowego, działa dobrze. Nie jestem pewien, jak rozwiązać ten problem. Czy istnieje sposób, aby powiedzieć ANTLR, aby traktować określony token tylko jako żeton KOLORU, jeśli jest on w określonej pozycji? Powiedzmy, że jeśli jest to zasada własności, mogę bezpiecznie założyć, że to jest token koloru. Jeśli nie, potraktuj to jako selektor.
Każda pomoc zostanie doceniona!
Rozwiązanie: Okazuje się, że próbowałem zrobić zbyt wiele w gramatyce, którą prawdopodobnie powinienem poradzić sobie w kodzie za pomocą AST. CSS ma zbyt wiele niejednoznacznych tokenów, aby niezawodnie podzielić się na różne tokeny, więc podejście, którego teraz używam, to w zasadzie tokenizacja znaków specjalnych takich jak "#", ".", ":" I nawiasy klamrowe oraz przetwarzanie postów w kod konsumenta. Działa znacznie lepiej i łatwiej radzić sobie z przypadkami skrajnymi.
To nadal nie działa. Problem polega na tym, że bbb (lub cokolwiek, co zaczyna się od 0..9 | a..f) zostanie zkastrowane jako HEXSTRING. Zapobiegnie to dopasowaniu #bbb jako selektora. –
cóż, właściwie tam byłem. Wierzę, że skoro bbb jest zarówno poprawnym ciągiem, jak i poprawnym szesnastkiem, konieczne będzie sprawdzenie poprawności danych po stronie oprogramowania. –
Tego się boję. Mam nadzieję, że istnieje tu pewien guru antlr na stackoverflow, który może udowodnić, że się mylisz:/ –