2012-08-30 7 views
7

To powinno być dość proste. Pracuję nad gramatyką leksykonu przy użyciu ANTLR i chcę ograniczyć maksymalną długość identyfikatorów zmiennych do 30 znaków. Starałem się to osiągnąć z tej linii (po normalnej regex - z wyjątkiem „” rzecz - składni):Składnia kwantyfikatora zasięgu w ANTLR Regex

ID : ('a'..'z'|'A'..'Z') ('a'..'z'|'A'..'Z'|'0'..'9'|'_'){0,29} {System.out.println("IDENTIFIER FOUND.");} 
    ; 

żadnych błędów w generacji kodu, ale kompilacja nie ze względu na linię w wygenerowanego kodu, który był po prostu :

0,29

Oczywiście antlr bierze fragment tekstu między nawiasami i umieszczenie go w strefie publicznej akceptacji wraz z linii druku. Przeszukałem stronę ANTLR i nie znalazłem przykładu ani odniesienia do równoważnego wyrażenia. Jak powinna wyglądać składnia tego wyrażenia?

Odpowiedz

8

ANTLR nie obsługuje składni kwantyfikatora {m,n}. ANTLR widzi {} twojego kwantyfikatora i nie może odróżnić ich od {} otaczających twoje działania.

Obejścia:

  1. wymuszenia limitu semantycznie. Pozwól mu zebrać nieograniczony identyfikator rozmiaru, a następnie nałóż/skróć go jako część twojego kodu akcji lub później w kompilatorze.
  2. Utwórz reguły kwantyfikacji ręcznie.

To jest przykład z ręcznym reguły, która ogranicza identyfikatory do 8.

SUBID : ('a'..'z'|'A'..'Z'|'0'..'9'|'_') 
     ; 
ID : ('a'..'z'|'A'..'Z') 
    (SUBID (SUBID (SUBID (SUBID (SUBID (SUBID SUBID?)?)?)?)?)?)? 
    ; 

osobiście pójdę z semantycznego roztworze (# 1). W dzisiejszych czasach jest bardzo niewiele powodów, aby ograniczać identyfikatory w języku, a nawet mniej powodów, by powodować błąd składni (wczesne przerwanie kompilacji), gdy taka reguła zostanie naruszona.

+0

Dziękuję za pomoc. – user1634761

+1

Jeśli ANTLR zostały użyte tylko do generowania kompilatorów dla języków programowania, może być mało wykorzystania do kwantyfikatorów. Ale gramatyka (schemat) do sprawdzania poprawności dowolnych uporządkowanych danych z pewnością ich potrzebuje - numery kart kredytowych to 16 cyfr, a nie 13 lub 25. Książka ANTLR4 ma gramatyki JSON i XML, ale bez podstawowych ograniczeń tokenów trudno byłoby użyć Gramatyka ANTLR jako abstrakcyjna (niezależna od kodeków) wersja JSON Schema i XSD. – Dave

+0

"Obecnie niewiele jest powodów, by ograniczać identyfikatory w języku" - nie oznacza to, że nie istnieją żadne języki z ograniczonymi identyfikatorami, ani że ludzie mogą chcieć pisać dla nich parsery. –