2013-05-10 11 views
7

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ę?

Odpowiedz

7

W ANTLR 4 można użyć do tego tryby lexera.

STRING : [a-z-]+; 
LBRACK : '[' -> pushMode(CharSet); 

mode CharSet; 

DASH : '-'; 
NUMBER : [0-9]+; 
RBRACK : ']' -> popMode; 

Po analizowania [ charakter, lexer będzie działać w trybie CharSet] postać jest osiągnięty i komenda popMode jest wykonywany.

+0

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

+1

Musisz użyć "gramatyki leksykonu" dla twojego lexera i osobnej gramatyki "parsera" (w osobnym pliku) dla twojego parsera. –

+0

Oto link, który może pomóc innym: http://meri-stuff.blogspot.co.za/2011/09/antlr-tutorial-expression-language.html#LexerBasics – Eagle