未缩进的代码打破了我的语法

时间:2016-01-05 21:56:08

标签: parsing grammar antlr4

我有 / 词法分析器/解析器的.g4语法,其中词法分析器正在跳过行连续标记 - 不跳过它们会破坏解析器并且不是一个选项。这是有问题的词法分析器规则:

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]+;

...上面的测试代码给了我这个解析器错误:

  

无关的输入' vbNewLine'期待WS

现在我唯一的解决方案是告诉我的用户正确缩进他们的代码。有什么方法可以解决这个语法规则吗?

<子> (Full VBA.g4 grammar file on GitHub)

1 个答案:

答案 0 :(得分:4)

您基本上希望将行继续视为空格。

好的,然后将行继续的词法定义添加到WS令牌。然后WS将选择行继续,你不需要任何地方的LINECONTINUATION。

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