[英]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.