使用 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 参数之间有所不同,我不知道处理这个问题的最佳方法。
您好,我正在尝试使用 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 参数之间有所不同,我不知道处理这个问题的最佳方法。