2016-07-09 11 views
0

こんにちは私は、antlr4を使用してSIP Uriを解析しようとしています。時間については 、私は簡単な質問を保つために複雑さを取り除く持っているsip uriパーサーantlr4を使用

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:ユーザー:[email protected]

output of Input 1

文字列Input2:sip:[email protected]

第二の入力、「SIP」で

output of Input 2

「SIP」は文法通りのユーザ/パスワードであること資格のでUSERおよび「ユーザ」は、パスワードとして解析されたように解析されました。

私は自分の問題を説明しました。 この状況でどのように進めるのか分かりませんか?

答えて

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パラメータの間で許可される文字セットが異なり、それを処理する最善の方法はわかりません。

+0

私は以前これを理解していましたが、uri params、headersなどを含むようにsip uriの文法を拡張すると複雑さが増したので、userInfoをパーサールールにすることはできません。 –

+0

移動しない限りすべての構造体をパーサーに渡して、キャラクタセットの問題に遭遇します。 **もちろん、チートしてSIP_SCHEMEをフラグメント化してUSER_INFOに追加できます – mabe

関連する問題