2016-07-09 27 views
0

Hallo, ich versuche, einen Schluck Uri mit Antlr4 zu analysieren. Zur Zeit ich die Komplexität haben zu halten, die Frage einfachSip-Uri-Parser mit Antlr4

Antlr4 Grammar

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') ; 

String Input 1 abzustreifen: sip: user: [email protected]

output of Input 1

String-Eingang2: sip: [email protected]

output of Input 2

Im zweiten Eingang, „SIP“ wurde als USER und „user“ geparst wurden als Passwort analysiert, da „SIP“ qualifiziert gemäß Grammatik ein Benutzer/Passwort sein.

Ich hoffe, ich habe mein Problem beschrieben. Sie wissen jetzt nicht, wie Sie vorgehen sollen?

Antwort

0

Ich weiß nicht, warum das Ergebnis ist, was es ist, aber es hat wahrscheinlich damit zu tun, wie der Lexer funktioniert.

jedoch von Material an den Parser verschieben, können Sie dieses besondere Problem vermeiden:

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

SIP_SCHEME   : 'sip:'; 
USER     : ALPHA_NUM+ ; 
PASSWORD    : ':' ALPHA_NUM+ ; 

Das heißt, ich denke, dass es besser ist, nicht zu versuchen, semantische Bedeutung zuweisen (Benutzer, Kennwort) zu den Lexer-Token , aber diese Logik in die Anwendung zu verschieben. Das Problem ist jedoch, wie Sie wahrscheinlich wissen, dass die erlaubten Zeichensätze zwischen Benutzer-, Passwort-, Hostnamen- und URI-Parametern unterschiedlich sind, und ich weiß nicht, wie ich das am besten handhaben soll.

+0

Ich hatte dies früher herausgefunden, aber ich kann nicht BenutzerInfo als Parser-Regel machen, da es mehr Komplexität hinzugefügt, wenn ich die Grammatik für Sip-Uri zu Uri Params, Header usw. hinzufügen –

+0

Ich denke, es wird, wenn Sie nicht bewegen die ganze Struktur an den Parser, und dann werden Sie in den Zeichensatz Probleme laufen ... Sie ** könnte natürlich schummeln und machen Sie SIP_SCHEME ein Fragment und fügen Sie es zu USER_INFO – mabe