2013-05-06 61 views
1

我试图从的Cisco IOS配置解析以下命令:如何使用antlr解析动态分隔符?

banner exec <d> <message> <d>

其中<d>是用户的选择,英镑符号(#)的分隔字符,例如。 <message>不能在其中使用分隔符。

看来我需要为它使用语义谓词。但无法想出办法。

回答

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))}? . ; 
+0

这是棘手的部分。分隔符未提前知道。它只在实际的文件中已知。 – 2013-05-07 05:02:30

+0

真的很感激这个人的任何帮助。我认为这是一个具有挑战性的问题,许多人可以从中得到答案。 – 2013-05-09 09:14:10

+0

在这里找到一个类似的帖子:http://stackoverflow.com/questions/14286870/antlr3-dynamic-quotes-in-lexer – 2013-05-14 23:42:44