Ho una grammatica .g4 per vba/vb6 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 vba 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)
Perché non unire LINE_CONTINUATION in WS? –
@IraBaxter 'WS' è usato in molti altri posti. Cosa intendi? –
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. –