我在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是:解码str时:例如: “SIP / 2.0 200 OK。\ r \ nVia:SIP / 2.0 / TCP 192.168.26.116:46448;alias;branch=z9hG4bK.TteIOuQeu;rport\r\n” 它可以打印第一行的状态代码和原因权利。那就是200而且没问题。
但是如果我在Via之前的第一个\ r \ n之前添加一些空格, “SIP / 2.0 200 OK。\ r \ nVia:SIP / 2.0 / TCP 192.168.26.116:46448;alias;branch=z9hG4bK.TteIOuQeu;rport\r\n”
结果是如此错误。 打印出来的原因将变为“OK.ia:SIP / 2.0 / TCP 192.168.26.116:46448aliasbranchz9hG4bK.TteIOuQeurport”
我得到一个警告:“第2行:0要求(...)+循环与字符'V'上的任何内容都不匹配”
有人可以告诉我为什么,我不太擅长英语和Antlr。 提前谢谢!