我有以下语法。
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*
无效。
更新:它实际上是由词法分析器引起的。如果我合并TAG
和NAME
,那就可以了。
meta : '<' NAME attribute* '>';
NAME : [A-Z0-9_-]+;
但我不希望NAME
包含数字。有没有办法使这项工作?
答案 0 :(得分:1)
您可以使用两个独立的词法分析器规则,然后使用解析器规则分别组合它们
ID: [A-Za-z]+ ;
NUMBER: [0-9]+ ;
tag: ID+ tag? | NUMBER+ tag? ;
name: ID+ name? | ('_' | '-')+ name?
如果您在忽略的元素之间有空格问题,可以使用不同的通道,只在上面的解析器规则中启用它... 它甚至可以将上面的解析器规则定义为词法规则,但我不确定...