ANTLR4如何根据规则更改隐藏字符?

时间:2015-03-19 16:58:43

标签: java parsing antlr antlr4

我正在尝试解析具有错误结构的输入文件,因为通常会跳过换行符,但在某些情况下它会用于终止语句,因此,有时它必须匹配。然而在这种情况下,换行似乎一般成为正常的标记,不能跳过。

为了说明我的问题,请考虑以下语法:

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'?"无处不在的地方。

处理这个问题的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

对于我的两个建议,你需要将空格设置为HIDDEN频道(而不是跳过它)。

要对空白(或换行)进行灵活控制,您可以应用以下解决方案Allow Whitespace sections ANTLR4。您可以在语法中的每个点启用/禁用空格。

另一种方法是将\n设置为隐藏通道,但不要将其作为标记包含在规则中,而是作为语义谓词。

text
  : (line {/*check that the last whitespace contained a newline*/}?)+
  ;

为了实现,您可以使用BufferedTokenStream#getHiddenTokensToRightBufferedTokenStream#getHiddenTokensToLeft(两者都允许读取隐藏的关闭通道令牌)。