您好我正在尝试使用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
String Input2: sip:user@abc.com
在第二个输入中," sip"被解析为USER和" user"被解析为PASSWORD,因为" sip"根据语法有资格成为用户/密码。
希望我描述了我的问题。 在这种情况下,现在不知道该怎么办?
答案 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参数之间有所不同,而且我不知道处理该问题的最佳方法。