Неиндентированный код нарушает мою грамматику


У меня есть .грамматика g4 для vba/vb6 лексер / парсер, где лексер пропускает токены продолжения строки - не пропуская их, разбивает парсер и не является опцией. Вот правило лексера, о котором идет речь:

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

Проблема, которую это вызывает, заключается в том, что всякий раз, когда продолжение строки начинается в столбце 1, синтаксический анализатор взрывается:

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

Я подумал: "Эй, я знаю! Я просто предварительно обработаю строку, которую я передаю ANTLR, чтобы вставить дополнительный пробел перед подчеркните и измените грамматику, чтобы принять его!"

Поэтому я изменил правило следующим образом:

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

...и тест VBA код выше дал мне эту ошибку синтаксического анализатора:

посторонний вход 'vbNewLine' ожидает WS

На данный момент мое единственное решение-это сказать моим пользователям, чтобы они правильно отступали в своем коде. Есть ли способ исправить это грамматическое правило?

(полная VBA.файл грамматики g4 на GitHub)

1 7

1 ответ:

Вы в основном хотите, чтобы продолжение строки рассматривалось как пробел.

ОК, затем добавьте лексическое определение продолжения строки к маркеру WS. Тогда WS возьмет продолжение линии,и вам не нужно будет никуда продолжать линию.

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