【问题标题】:sip uri parser using antlr4使用 antlr4 的 sip uri 解析器
【发布时间】:2016-11-12 03:03:40
【问题描述】:

您好,我正在尝试使用 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。

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

【问题讨论】:

    标签: parsing antlr antlr4


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我之前已经想通了,但我不能将 userInfo 作为解析器规则,因为当我将 sip uri 的语法扩展为包含 uri 参数、标头等时,它增加了更多复杂性。
    • 我猜除非你将所有结构都移到解析器中,否则你会遇到字符集问题......你当然可以作弊并制作 SIP_SCHEME一个片段并将其添加到 USER_INFO
    猜你喜欢
    • 2016-03-18
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 2014-02-23
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多