目标是匹配可能包含或不包含可选主机名的URL(不包含协议)。例如
所有3都应匹配,但理想情况下,语法将允许在第一个表达式中恢复主机名 - acme.com。
所以解析器语法理想情况如下:
url: hostname? pathExpr
问题出现在Lexer Grammar
上例如
fragment ALPHANUM: [a-zA-Z0-9-];
fragment NAME: ALPHANUM+;
HOSTNAME: NAME ( '.' NAME)+ -> mode (PATH_MODE);
mode PATH_MODE;
PATH_EXPR: .+;
适用于第一种情况但与其他情况不匹配。
我该怎么做?
(注意:对于默认模式,我尝试表达一个规则ANYPATH,定义一个不是由HOSTNAME开始但是失败的字符序列)
答案 0 :(得分:0)
我建议不要在这里重新发明轮子。有existing grammar for URLs,它可以为您提供所需的所有详细信息。
<强>更新强>
为了使整个主机/端口部分可选,您可以简单地修改网址规则:
url
: authority '://' login? host (':' port)? ('/' path)? ('?' search)?
| '/'? path ('?' search)?
;
你有没试过?我也看到这个语法不是很灵活。路径部分之前的每个部分几乎都是可选的(如权限,登录信息,端口等)。