2017-01-29 29 views
0

Целью является сопоставление URL-адресов (без протокола), которые могут включать или не включать необязательное имя хоста. НапримерANTLR: обнаружение необязательного токена перед последовательностью любых символов

  • amce.com/a/path
  • /другое/путь/выражение
  • а/путь/не/starting_with/слэш

Все 3 должны соответствовать, но в идеале грамматика позволит восстановить имя хоста - acme.com - в первом выражении.

Так грамматика анализатор будет идеально выглядеть следующим образом:

url: hostname? pathExpr 

Проблема приходит с лексическим Грамматика

Например

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

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

mode PATH_MODE; 
PATH_EXPR: .+; 

работает отлично для первого случая, но будет не соответствуют другим 2.

Как это сделать?

(примечание: в режиме по умолчанию, я попытался выражающим правило ANYPATH, определяющее последовательность символов начинающихся не с помощью HOSTNAME, но не удался)

ответ

0

Я рекомендую не изобретать колесо здесь. Существует existing grammar for URLs, который должен предоставить вам все необходимые сведения.

Update:

Для того, чтобы сделать весь хост/порт часть по желанию можно просто изменить правила URL-адрес, как это:

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

Пробовали ли вы, что уже? Я также вижу, что эта грамматика не очень гибкая. Почти каждая часть перед частью пути является необязательной (например, авторитет, информация для входа, порт и т. Д.).

+0

Спасибо. Я попытался взломать это, но я не могу заставить его соответствовать URI без имен хостов (исключение требований к схемам не было проблемой). –

 Смежные вопросы

  • Нет связанных вопросов^_^