ANTLR:检测任何字符序列前面的可选标记

时间:2017-01-29 15:11:29

标签: antlr

目标是匹配可能包含或不包含可选主机名的URL(不包含协议)。例如

  • amce.com/a/path
  • /另一/路径/ EXPR
  • 一个/路径/不/ starting_with /斜线

所有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开始但是失败的字符序列)

1 个答案:

答案 0 :(得分:0)

我建议不要在这里重新发明轮子。有existing grammar for URLs,它可以为您提供所需的所有详细信息。

<强>更新

为了使整个主机/端口部分可选,您可以简单地修改网址规则:

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

你有没试过?我也看到这个语法不是很灵活。路径部分之前的每个部分几乎都是可选的(如权限,登录信息,端口等)。