未绑定的代码破坏了我的语法



我有一个用于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');

相关内容

  • 没有找到相关文章

最新更新