我有一个用于vba/vb6的.g4语法lexer/parser,其中lexer跳过行延续标记-不跳过它们会破坏解析器,不是一个选项。以下是有问题的lexer规则:
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
目前,我唯一的解决方案是告诉我的用户正确地缩进他们的代码。有什么办法我可以修正那个语法规则吗?
(GitHub上的完整VBA.g4语法文件)
您基本上希望将行的延续处理为空白。
好的,然后将行延续的词法定义添加到WS标记中。然后WS将获取行的延续,并且在任何地方都不需要LINECONCTION。
//LINE_CONTINUATION : ' ' '_' 'r'? 'n' -> skip;
NEWLINE : WS? ('r'? 'n') WS?;
WS : ([ t]+)|(' ' '_' 'r'? 'n');