2017-01-29 2 views
0

Ziel ist es, URLs (ohne das Protokoll) zu finden, die einen optionalen Hostnamen enthalten können oder nicht. Zum BeispielANTLR: erkennt ein optionales Token vor einer Sequenz beliebiger Zeichen

  • amce.com/a/path
  • /andere/path/ausdr
  • a/path/nicht/starting_with/slash

Alle 3 entsprechen sollte aber idealerweise die Grammatik würde erlauben, den Hostnamen - acme.com - im ersten Ausdruck wiederherzustellen.

So würde der Parser Grammatik aussehen ideal:

url: hostname? pathExpr 

Das Problem kommt mit dem Lexer Grammar

Zum Beispiel

fragment ALPHANUM: [a-zA-Z0-9-]; 
fragment NAME: ALPHANUM+; 

HOSTNAME: NAME ('.' NAME)+ -> mode (PATH_MODE); 

mode PATH_MODE; 
PATH_EXPR: .+; 

funktioniert gut für den ersten Fall, aber wird nicht die anderen 2.

Wie mache ich das?

(Hinweis: für den Standard-Modus, Ich habe versucht, die Expression eine Regel ANYPATH eine Folge von Zeichen, die nicht von einem Host-Namen definieren, beginnend aber nicht)

Antwort

0

Ich empfehle nicht das Rad hier neu zu erfinden. Es gibt eine existing grammar for URLs, die Ihnen alle Details geben soll, die Sie wollen.

Update:

Um die gesamte Host/Port-Teil optional machen Sie einfach die URL-Regel wie folgt ändern könnte:

url 
    : authority '://' login? host (':' port)? ('/' path)? ('?' search)? 
    | '/'? path ('?' search)? 
; 

Versuchten Sie das schon? Ich sehe auch, dass diese Grammatik nicht sehr flexibel ist. Fast jeder Teil vor dem Pfad Teil ist optional (wie die Behörde, die Login-Informationen, Port usw.).

+0

Danke. Ich habe versucht, das zu hacken, aber ich kann es nicht bekommen, URIs ohne hostnames zu entsprechen (das Entfernen von Schemenanforderungen war kein Problem). –