2013-02-08 16 views
28

Potrzebuję pomocy z gramatyką ANTLR 4 po podjęciu decyzji o przejściu na v4 z wersji 3. Nie jestem bardzo doświadczonych z antlr więc jestem bardzo przepraszam, jeśli moje pytanie jest głupie;)

W v3 Użyłem następujący kod do wykrywania komentarzy Java-style:

COMMENT 
    : '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;} 
    | '/*' (options {greedy=false;} : .)* '*/' {$channel=HIDDEN;} 
    ; 

W v4 Brak reguła -specyficzne opcje. Czynności (przejście do ukrytego kanału) są również nieprawidłowe.

Czy ktoś mógłby mi dać wskazówkę, jak to zrobić w ANTLR v4?

Odpowiedz

33

Równowartość v4 wyglądałby następująco:

COMMENT 
    : ('//' ~[\r\n]* '\r'? '\n' 
     | '/*' .*? '*/' 
     ) -> channel(HIDDEN) 
    ; 

który będzie umieścić wszystkie jedno- i wielo liniowy komentarz na kanale HIDDEN. Jednakże, jeśli nie robią nic z tych HIDDEN -tokens, można również skip te żetony, które będzie wyglądać następująco:

COMMENT 
    : ('//' ~[\r\n]* '\r'? '\n' 
     | '/*' .*? '*/' 
     ) -> skip 
    ; 

Należy pamiętać, że aby powiedzieć lexer lub parsera dopasować ungreedy, don” t już używają options {greedy=false;}, ale dołączają ?, podobne do wielu implementacji regex.

+0

Dziękuję bardzo! – user2055330

+0

Korzystam teraz z sugerowanego kodu (pierwszy wariant korzystający z kanału), który zgłasza błąd: '-> polecenie w regule lexera" KOMENTARZ "musi być ostatnim elementem pojedynczego zewnętrznego znaku" Jaki jest problem? – user2055330

+0

@ user2055330, wypróbuj moją zredagowaną wersję. –

Powiązane problemy