2012-12-08 13 views
5

Ho scritto una grammatica per un linguaggio piccolo che comprende i commenti di una riga in stile C, ad es.Analisi di commenti in single-line in stile C con Antlr

// this is a comment 

Ecco un frammento della grammatica che ho scritto per questa lingua, usando ANTLR v3.0.1

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

    WS  :  (' '|'\r'|'\t'|'\u000C'|'\n')+ {$channel=HIDDEN;}; 

Questo più o meno tipo di opere, tranne che quando il commento è ultima nella sceneggiatura e non c'è si concludano NL/CR, ho ricevuto un messaggio di fastidioso da ANTLR (in fase di esecuzione):

line 1:20 required (...)+ loop did not match anything at character '<EOF>' 

Come posso liberarmi di questo messaggio? Ho provato ad aggiungere il token EOF all'espressione (..)+ ma questo non funziona.

+0

Non ne sono sicuro, ma cosa succede se rendi opzionale la nuova riga, cioè cambi il '+' in a '?'? o forse un '*'? – nijoakim

+0

Che dire di non tralasciare le opzioni golose (sembrano solo per il +), e cambiare il plus in un punto interrogativo. –

risposta

4

Non è necessaria l'opzione greedy=...: in genere è necessario quando si dispone di .* o .+ nella regola. E dal momento che si sta già mettendo caratteri di interruzione di riga sul canale nascosto nel vostro WS regola, è possibile rimuoverlo dal SINGLELINE_COMMENT:

SINGLELINE_COMMENT 
: '//' ~('\r' | '\n')* {$channel=HIDDEN;} 
; 

WS 
: (' '|'\r'|'\t'|'\u000C'|'\n')+ {$channel=HIDDEN;} 
; 
+0

Funziona bene, grazie! – insitu

2

In generale, la soluzione del "no terminare NL" questione comporterebbe un sacco di cambiamenti di grammatica tortuosa per soddisfare questa condizione di bordo. È sempre più semplice aggiungere semplicemente un NL alla fine del flusso di input, il che significa che è possibile garantire un NL di terminazione e non preoccuparsene nella grammatica. UNIX è corretto a questo proposito e Windows non lo è.

Non è la soluzione al problema specifico, ma il modo in cui la regola è stata codificata in origine espone questo problema.