Неиндентированный код нарушает мою грамматику
У меня есть .грамматика 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
На данный момент мое единственное решение-это сказать моим пользователям, чтобы они правильно отступали в своем коде. Есть ли способ исправить это грамматическое правило?
1 ответ:
Вы в основном хотите, чтобы продолжение строки рассматривалось как пробел.
ОК, затем добавьте лексическое определение продолжения строки к маркеру WS. Тогда WS возьмет продолжение линии,и вам не нужно будет никуда продолжать линию.
//LINE_CONTINUATION : ' ' '_' '\r'? '\n' -> skip; NEWLINE : WS? ('\r'? '\n') WS?; WS : ([ \t]+)|(' ' '_' '\r'? '\n');