使用antlr4 sip uri解析器

时间:2016-07-09 19:08:23

标签: parsing antlr antlr4

您好我正在尝试使用antlr4解析一个Uri。 目前我已经剥离了复杂性以保持问题简单

Antlr4语法

sipUri          : SIP_SCHEME coreUri EOF ;
coreUri         : USER_INFO? hostPort ;
hostPort        : 'abc.com' ;

SIP_SCHEME           : 'sip:';
USER_INFO            : USER PASSWORD? '@' ;
fragment USER        : ALPHA_NUM+ ;
fragment PASSWORD    : ':' ALPHA_NUM+ ;
fragment ALPHA_NUM   :  ALPHA | DIGIT ;
fragment ALPHA       : ('a'..'z' | 'A'..'Z') ;
fragment DIGIT       : ('0'..'9') ;

字符串输入1: sip:user:pwd@abc.com

output of Input 1

String Input2: sip:user@abc.com

output of Input 2

在第二个输入中," sip"被解析为USER和" user"被解析为PASSWORD,因为" sip"根据语法有资格成为用户/密码。

希望我描述了我的问题。 在这种情况下,现在不知道该怎么办?

1 个答案:

答案 0 :(得分:0)

我不知道结果是什么原因,但它可能与词法分析器的工作方式有关。

但是,通过将内容移动到解析器,您可以避免此特定问题:

sipUri          : SIP_SCHEME coreUri EOF ;
coreUri         : userInfo? hostPort ;
hostPort        : 'abc.com' ;
userInfo        : USER PASSWORD? '@';

SIP_SCHEME           : 'sip:';
USER                 : ALPHA_NUM+ ;
PASSWORD             : ':' ALPHA_NUM+ ;

那就是说,我认为最好不要尝试将词义(用户,密码)分配给词法分析器,而是将该逻辑移到应用程序中。但问题是,正如您可能知道的那样,允许的字符集在用户,密码,主机名和URI参数之间有所不同,而且我不知道处理该问题的最佳方法。