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