2016-01-05 12 views
7

Ho una grammatica .g4 per / un lexer/parser, in cui il lexer sta saltando i token di continuazione della riga - non saltarli interrompe il parser e non è un'opzione. Ecco la regola lexer in questione:Il codice non indentato interrompe la grammatica

LINE_CONTINUATION : ' ' '_' '\r'? '\n' -> skip; 

Il problema questo sta causando, è che ogni volta che una linea continua inizia a colonna 1, il parser esplode:

Sub Test() 
Debug.Print "Some text " & _ 
vbNewLine & "Some more text"  
End Sub 

ho pensato "Ehi lo so! Mi limiterò a pre-elaborare la stringa che sto alimentando ANTLR per inserire uno spazio bianco extra prima del carattere di sottolineatura e modificare la grammatica per accettarla! "

così ho cambiato la regola in questo modo:

LINE_CONTINUATION : WS? WS '_' NEWLINE -> skip; 
NEWLINE : WS? ('\r'? '\n') WS?; 
WS : [ \t]+; 

... e il codice di prova sopra mi ha dato questo errore del parser:

extraneous input 'vbNewLine' expecting WS

Per ora la mia unica soluzione è quella di raccontare la mia gli utenti per indentare correttamente il loro codice. C'è un modo per sistemare quella regola di grammatica?

(Full VBA.g4 grammar file on GitHub)

+0

Perché non unire LINE_CONTINUATION in WS? –

+0

@IraBaxter 'WS' è usato in molti altri posti. Cosa intendi? –

+1

Fondamentalmente vuoi che la continuazione della linea sia trattata come uno spazio. OK, quindi aggiungi la definizione lessicale della continuazione della riga al token WS. –

risposta

4

Che, fondamentalmente, vogliono riga di continuazione di essere trattati come spazi bianchi.

OK, quindi aggiungere la definizione lessicale di continuazione della riga al token WS. Quindi WS riprenderà la continuazione della linea e non avrai bisogno di LINECONTINUATION ovunque.

//LINE_CONTINUATION : ' ' '_' '\r'? '\n' -> skip; 
NEWLINE : WS? ('\r'? '\n') WS?; 
WS : ([ \t]+)|(' ' '_' '\r'? '\n'); 
+0

Sarò dannato. Ha funzionato! –

+0

Ha parlato troppo velocemente. Ha funzionato .... * per il caso specifico nell'OP * - così ho provato a cambiare la regola 'WS' in' WS: [\ t] + ('_' '\ r'? '\ N') ?; ', e ora funziona e supporta cose strane come' Opzione Base 1' che viene divisa in 'Opzione _ \ r \ nBase _ \ r \ n1', che è fantastica - ma si rompe ogni volta che una linea continua ha una rientranza e io indosso capisco perché, dal momento che la definizione come ho capito dovrebbe * anche * abbinare uno o più spazi/tab ... ha un indizio? –

+1

Penso che avrei definito le cose in modo diverso: HWS = [\ t \] +; ENDLINE = \ r? \ N; NEWLINE = HWS? linea di fondo; WS = HWS (ENDLINE HWS?)? ; Quest'ultima punta la tua "linea continua ha indentazione". Il resto è solo factoring per renderlo più facile da capire. (HWS == "spazio bianco orizzontale"). –

Problemi correlati