0

我在 linphone sip decode antlr 文件中制作了 .g 文件的简单副本,以使事情变得清晰。我的问题是当我使用这个文件来解码 sip 的第一行时,它有时会失败。该文件如下所示:

    grammar sipmessage;
    options{
        language = Java;
        output = AST;
    }

    @lexer::header{
        package org.meri.antlr_step_by_step.parsers;
        import java.util.HashMap;
    }

    @parser::header{
       package org.meri.antlr_step_by_step.parsers;
       import java.util.HashMap;
    }

    status_line :    
        sip_version 
        sptab status_code {System.out.println($status_code.text);}
        sptab reason_phrase {System.out.println($reason_phrase.text);}
        CRLF
    ;

    sip_version   
        :    word;// 'SIP/' DIGIT '.' DIGIT;


    reason_phrase
       :    ~(CRLF)*;

    status_code     
        :    extension_code;

    word        
        :     
       (alphanum | mark   | '%'  
        | PLUS | '`' |
            LAQUOT | RAQUOT |
            COLON | '\\' | DQUOTE | SLASH | '[' | ']' | '?' | '{' | '}' 
        )+
    ;

    extension_code  :   DIGIT+;
    alphanum :  alpha | DIGIT ; 
    mark    :   '-' | '_' | '.' | '!' | '~' | STAR | '\'' | LPAREN | RPAREN ; 
    alpha   :   HEX_CHAR | COMMON_CHAR;     
    COMMON_CHAR :   'g'..'z' | 'G'..'Z' ;                

    HEX_CHAR:   'a'..'f' |'A'..'F';
    RPAREN  :   ')';
    LPAREN  :   '(';
    STAR    :   '*';
    DIGIT   : '0'..'9' ;
    PLUS: '+';
    COLON   :   ':';
    RAQUOT  :   '>';
    LAQUOT  :   '<';
    DQUOTE  : '"';
    SLASH   :   '/';

    SP  :   ' ';
    CRLF    : '\r\n';
    HTAB    : ' ';
    LWS :   (SP* CRLF)? SP+ ; //linear whitespace
    sptab : (SP|HTAB)+;

MyProblem 是 :when decode str eg: "SIP/2.0 200 OK.\r\nVia: SIP/2.0/TCP 192.168.26.116:46448;alias;branch=z9hG4bK.TteIOuQeu;rport\r\n" 它可以打印第一行的状态代码和推理是正确的。那是 200 和 OK。

但是,如果我在 Via 之前的第一个 \r\n 之前添加一些空格,即“SIP/2.0 200 OK。\r\nVia: SIP/2.0/TCP 192.168.26.116:46448;alias;branch=z9hG4bK.TteIOuQeu;报告\r\n"

结果大错特错。打印出来的原因会变成“OK.ia: SIP/2.0/TCP 192.168.26.116:46448aliasbranchz9hG4bK.TteIOuQeurport”

我收到一个警告:“第 2:0 行需要 (...)+ 循环与字符 'V' 处的任何内容都不匹配”

谁能告诉我为什么,我不太擅长英语和 Antlr。提前致谢!

4

0 回答 0