簡體   English   中英

如何用ANTLR4解析XSD Regex的語法?

[英]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 詞法分析器嘗試匹配盡可能多的字符,如果出現平局,它將選擇首先定義的規則。

您可以引入同時匹配NormalCharQuantExactnormalChar規則,並在您的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM