2013-02-08 12 views
28

Ho bisogno di aiuto con la mia grammatica ANTLR 4 dopo aver deciso di passare alla v4 dalla v3. Io non sono molto esperto con ANTLR quindi mi dispiace davvero se la mia domanda è muto;)

In v3 ho usato il seguente codice per rilevare commenti in stile Java:

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

In v4 ci sono alcuna regola opzioni specifiche. Anche le azioni (passa al canale nascosto) non sono valide.

Qualcuno potrebbe darmi un suggerimento su come farlo in ANTLR v4?

risposta

33

Il v4 equivalente sarà simile:

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

che metterà tutti i commenti linea singola e multi sul canale HIDDEN. Tuttavia, se non stai facendo nulla con questi HIDDEN -tokens, si potrebbe anche skip questi token, che sarebbe simile a questa:

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

Si noti che a dire il lexer parser o per abbinare ungreedy, si don' t utilizzare options {greedy=false;} più, ma aggiungere uno ?, simile a molte implementazioni di espressioni regolari.

+0

Grazie mille! – user2055330

+0

Ora uso il tuo codice suggerito (prima variante usando il canale) che genera un errore: '-> comando nella regola del lexer 'COMMENT' deve essere l'ultimo elemento del singolo più esterno alt 'Qual è il problema? – user2055330

+0

@ user2055330, prova la mia versione modificata. –