mam następujące gramatyki dla ANTLR 4:ANTLR 4 Lexer tokeny wewnątrz innych tokenów
grammar Pattern;
//parser rules
parse : string LBRACK CHAR DASH CHAR RBRACK ;
string : (CHAR | DASH)+ ;
//lexer rules
DASH : '-' ;
LBRACK : '[' ;
RBRACK : ']' ;
CHAR : [A-Za-z0-9] ;
I próbuję analizować następujący ciąg
ab-cd[0-9]
Kod analizuje na zewnątrz ab-cd
lewą, która będzie traktowana jako ciąg literowy w mojej aplikacji. Następnie analizuje [0-9]
jako zestaw znaków, który w tym przypadku zostanie przetłumaczony na dowolną cyfrę. Moja gramatyka działa dla mnie, ale nie lubię mieć (CHAR | DASH)+
jako reguły parsera, gdy traktuje się ją po prostu jako token. Wolałbym lexer stworzyć STRING
żeton i dać mi następujące znaki:
"ab-cd" "[" "0" "-" "9" "]"
zamiast tych
"ab" "-" "cd" "[" "0" "-" "9" "]"
Mam spojrzał na innych przykładach, ale nie były w stanie ustalić to . Zwykle inne przykłady mają cytaty wokół takich literałów ciągów lub mają białe znaki, które pomagają w ograniczaniu danych wejściowych. Chciałbym uniknąć obu. Czy można to osiągnąć przy pomocy reguł leksykalnych, czy też muszę postępować z nimi w regułach parsera, tak jak ja to robię?
Dzięki za ten wgląd. Konfiguracja takich subtokenizerów brzmi jak idealne rozwiązanie. Dostaję błąd, chociaż stwierdzam, że "tryby leksykalne są dozwolone tylko w gramatyce leksykalnej". Mogę zadeklarować moją gramatykę jako "gramatyczną leksemów IdPattern;", ale wtedy nie mogę używać reguł parsera. czego mi brakuje? – Charles
Musisz użyć "gramatyki leksykonu" dla twojego lexera i osobnej gramatyki "parsera" (w osobnym pliku) dla twojego parsera. –
Oto link, który może pomóc innym: http://meri-stuff.blogspot.co.za/2011/09/antlr-tutorial-expression-language.html#LexerBasics – Eagle