Ich habe eine .g4-Grammatik für vba/vb6 ein Lexer/Parser, wo der Lexer Zeilenfortsetzungs-Token überspringen - nicht überspringen sie bricht den Parser und ist keine Option. Hier ist die Lexer Regel in Frage:Unerledigter Code bricht meine Grammatik
LINE_CONTINUATION : ' ' '_' '\r'? '\n' -> skip;
Das Problem dieser verursacht wird, das heißt, wenn eine fortgesetzte Linie beginnt in Spalte 1, der Parser sprengt:
Sub Test() Debug.Print "Some text " & _ vbNewLine & "Some more text" End Sub
Ich dachte: „Hey ich weiß! Ich werde nur die Zeichenfolge, die ich ANTLR füttere, vorprozessieren, um vor dem Unterstrich einen zusätzlichen Leerraum einzufügen und die Grammatik zu ändern, um sie zu akzeptieren! "
Also änderte ich die Regel wie folgt aus:
LINE_CONTINUATION : WS? WS '_' NEWLINE -> skip;
NEWLINE : WS? ('\r'? '\n') WS?;
WS : [ \t]+;
... und der Test vba Code gab mir über diesen Parser-Fehler:
extraneous input 'vbNewLine' expecting WS
Denn jetzt meine einzige Lösung zu sagen, ist mein Benutzer ihren Code richtig einzurücken. Kann ich diese Grammatikregel irgendwie korrigieren?
(Full VBA.g4 grammar file on GitHub)
Warum verschmelzen Sie LINE_CONTINUATION in WS? –
@IraBaxter 'WS' wird in vielen anderen Orten verwendet. Was meinen Sie? –
Grundsätzlich möchten Sie, dass die Zeilenfortsetzung wie Leerzeichen behandelt wird. OK, dann fügen Sie dem WS-Token die lexikalische Definition der Zeilenfortsetzung hinzu. –