如何使用antlr解析动态分隔符?

时间:2013-05-06 21:09:49

标签: antlr antlr4

我正在尝试从Cisco IOS配置中解析以下命令:

banner exec <d> <message> <d>

其中<d>是用户选择的分界字符 - 例如井号(#)。 <message>无法在其中使用分隔符。

似乎我需要使用语义谓词。但无法找到一种方法。

1 个答案:

答案 0 :(得分:1)

只要事先知道分隔符,就可以使用这样的东西。您可以修改isDelimiter以支持任何单字符分隔符。

@lexer::members {
    private boolean isDelimiter(int c) { return c == '#'; }
}

Message : Delimiter NotDelimiter* Delimiter;
fragment Delimiter : {isDelimiter(_input.LA(1))}? . ;
fragment NotDelimiter : {!isDelimiter(_input.LA(1))}? . ;