使用 antlr4 的 sip uri 解析器

sip uri parser using antlr4

您好,我正在尝试使用 antlr4 解析 sip 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

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

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

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

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

但是,通过将内容移至解析器,您可以避免这个特殊问题:

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

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

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