如何用antlr解析重复的属性?

时间:2016-12-11 21:46:02

标签: antlr antlr4 ebnf

我有以下语法。

meta : '<' TAG attribute* '>';

attribute : NAME '=' VAL;

TAG : [A-Z0-9]+;

NAME : [A-Z_-]+;

VAL : '"'.*?'"';

我想匹配以下字符串。

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">

但是我收到以下错误。

ParseError extraneous input 'CONTENT' expecting {'>', NAME}  clj-antlr.common/parse-error (common.clj:146)

我可以使用一个属性进行解析。

<META HTTP-EQUIV="Content-Type">

如何解析重复的属性?给attribute*无效。

更新:它实际上是由词法分析器引起的。如果我合并TAGNAME,那就可以了。

meta : '<' NAME attribute* '>';
NAME : [A-Z0-9_-]+;

但我不希望NAME包含数字。有没有办法使这项工作?

1 个答案:

答案 0 :(得分:1)

您可以使用两个独立的词法分析器规则,然后使用解析器规则分别组合它们

ID: [A-Za-z]+ ;
NUMBER: [0-9]+ ;

tag: ID+ tag? | NUMBER+ tag? ;
name: ID+ name?  | ('_' | '-')+ name? 

如果您在忽略的元素之间有空格问题,可以使用不同的通道,只在上面的解析器规则中启用它... 它甚至可以将上面的解析器规则定义为词法规则,但我不确定...