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

How to parse repeated attributes with antlr?

我有以下语法。

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 包含数字。有没有办法让这个工作?

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

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

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

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