我在 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。提前致谢!