亲爱的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解析这个语法吗?如果是,怎么做?
发布于 2014-06-13 18:01:06
我知道,Lexer也可以将QuantExact视为第一个符号,但是由于解析器只是在寻找NormalChar,所以我没想到会出现这个错误。
lexer不“侦听”解析器:无论解析器是否试图匹配NormalChar
,字符12
总是与QuantExact
匹配。lexer试图匹配尽可能多的字符,在出现领带的情况下,它首先选择定义的规则。
您可以引入一个normalChar
规则,它与NormalChar
和QuantExact
匹配,并在您的atom
中使用该规则。
atom : normalChar | '(' regExp ')' ;
normalChar : NormalChar | QuantExact ;
另一种选择是让lexer只创建单个char令牌,并让解析器将这些标记粘合在一起(非常像钉住)。就像这样:
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 : [?*+] ;
https://stackoverflow.com/questions/24207867
复制相似问题