[英]How to parse grammar of XSD Regex with ANTLR4?
尊敬的Antlr4社区,
我最近开始使用ANTLR4将正则表达式从XSD / xml转换为cvc4。 我使用w3c指定的语法,请参阅http://www.w3.org/TR/xmlschema11-2/#regexs 。 对于这个问题,我已将此语法(通过删除charClass)简化为:
grammar XSDRegExp;
regExp : branch ( '|' branch )* ;
branch : piece* ;
piece : atom quantifier? ;
quantifier : Quantifiers | '{'quantity'}' ;
quantity : quantRange | quantMin | QuantExact ;
quantRange : QuantExact ',' QuantExact ;
quantMin : QuantExact ',' ;
atom : NormalChar | '(' regExp ')' ; // excluded | charClass ;
QuantExact : [0-9]+ ;
NormalChar : ~[.\\?*+{}()|\[\]] ;
Quantifiers : [?*+] ;
解析似乎很好:
input a(bd){6,7}c{14,15}
但是,我收到以下错误消息:
input 12{3,4}
错误是:
第1:0行的输入'12'不匹配,期望{,'(','|',NormalChar}
我知道Lexer也可以将QuantExact视为第一个符号,但是由于解析器仅在寻找NormalChar,所以我没想到会出现此错误。
我尝试了一些更改:
[1]交换QuantExact和NormalChar的定义。 但是交换会在第一个输入中引入一个错误:
line 1:6 no viable alternative at input '6'
因为在那种情况下,“ 6”仅被视为NormalChar,而不是QuantExact。
[2]尝试为QuantExact(数量的大括号)创建上下文,以便词法分析器仅在此受限上下文中提供QuantExact符号。 但是我没有为此找到ANTLR4原语。
因此似乎没有任何效果,因此我的问题是: 我可以使用ANTLR4解析此语法吗? 如果是这样,怎么办?
我知道Lexer也可以将QuantExact视为第一个符号,但是由于解析器仅在寻找NormalChar,所以我没想到会出现此错误。
词法分析器不会“监听”解析器:无论解析器是否尝试匹配NormalChar
,字符12
始终将匹配为QuantExact
。 词法分析器尝试匹配尽可能多的字符,如果出现平局,它将选择首先定义的规则。
您可以引入同时匹配NormalChar
和QuantExact
的normalChar
规则,并在您的atom
使用该规则:
atom : normalChar | '(' regExp ')' ;
normalChar : NormalChar | QuantExact ;
另一个选择是让词法分析器仅创建单个char令牌,然后让解析器将这些令牌粘合在一起(很像PEG )。 像这样:
regExp : branch ( '|' branch )* ;
branch : piece* ;
piece : atom quantifier? ;
quantifier : Quantifiers | '{'quantity'}' ;
quantity : quantRange | quantMin | quantExact ;
quantRange : quantExact ',' quantExact ;
quantMin : quantExact ',' ;
atom : normalChar | '(' regExp ')' ;
normalChar : NormalChar | Digit ;
quantExact : Digit+ ;
Digit : [0-9] ;
NormalChar : ~[.\\?*+{}()|\[\]] ;
Quantifiers : [?*+] ;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.