我正在尝试解析具有错误结构的输入文件,因为通常会跳过换行符,但在某些情况下它会用于终止语句,因此,有时它必须匹配。然而在这种情况下,换行似乎一般成为正常的标记,不能跳过。
为了说明我的问题,请考虑以下语法:
text
: (line '\n')+
;
line
: ( ID )+
| '(' ID* ')'
;
ID : [a-zA-Z]+
;
WS : [ \t\n\r]+ -> skip
;
在这个语法中,我想解析如下语句:
a b
c d
(e
f)
然而我收到以下错误:
line 3:2 extraneous input '\n' expecting {')', ID}
因为括号内的换行符未被跳过。语法本身要复杂得多,因此不可能简单地放置"' \ n'?"无处不在的地方。
处理这个问题的最佳方法是什么?
答案 0 :(得分:2)
对于我的两个建议,你需要将空格设置为HIDDEN频道(而不是跳过它)。
要对空白(或换行)进行灵活控制,您可以应用以下解决方案Allow Whitespace sections ANTLR4。您可以在语法中的每个点启用/禁用空格。
另一种方法是将\n
设置为隐藏通道,但不要将其作为标记包含在规则中,而是作为语义谓词。
text
: (line {/*check that the last whitespace contained a newline*/}?)+
;
为了实现,您可以使用BufferedTokenStream#getHiddenTokensToRight
或BufferedTokenStream#getHiddenTokensToLeft
(两者都允许读取隐藏的关闭通道令牌)。