首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用ANTLR4解析XSD语法?

如何用ANTLR4解析XSD语法?
EN

Stack Overflow用户
提问于 2014-06-13 14:35:21
回答 1查看 983关注 0票数 1

亲爱的Antlr4社区,

最近,我开始使用ANTLR4将正则表达式从XSD / xml转换为cvc4。我使用w3c指定的语法,参见http://www.w3.org/TR/xmlschema11-2/#regexs。对于这个问题,我简化了这个语法(通过删除charClass):

代码语言:javascript
运行
复制
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       :     [?*+] ;     

解析似乎很好:

代码语言:javascript
运行
复制
input    a(bd){6,7}c{14,15}

但是,我收到一条错误消息,用于:

代码语言:javascript
运行
复制
input    12{3,4}

错误是:

第1行:0不匹配的输入'12‘期望{,’'(‘’,‘\“,NormalChar}

我知道,Lexer也可以将QuantExact视为第一个符号,但是由于解析器只是在寻找NormalChar,所以我没想到会出现这个错误。

我尝试了一些改变:

1交换QuantExact和NormalChar的定义。但是交换在第一个输入中引入了一个错误:

代码语言:javascript
运行
复制
line 1:6 no viable alternative at input '6'

因为在这种情况下,'6‘只被看作是一个NormalChar而不是一个QuantExact。

2试着为QuantExact (数量的方括号)创建一个上下文,以便词法器只在这个有限的上下文中提供QuantExact符号。但我未能找到用于此的ANTLR4原语。

所以似乎什么都不起作用,因此我的问题是:--我能用ANTLR4解析这个语法吗?如果是,怎么做?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-13 18:01:06

我知道,Lexer也可以将QuantExact视为第一个符号,但是由于解析器只是在寻找NormalChar,所以我没想到会出现这个错误。

lexer不“侦听”解析器:无论解析器是否试图匹配NormalChar,字符12总是与QuantExact匹配。lexer试图匹配尽可能多的字符,在出现领带的情况下,它首先选择定义的规则。

您可以引入一个normalChar规则,它与NormalCharQuantExact匹配,并在您的atom中使用该规则。

代码语言:javascript
运行
复制
atom              :     normalChar | '(' regExp ')' ;
normalChar        :     NormalChar | QuantExact ;

另一种选择是让lexer只创建单个char令牌,并让解析器将这些标记粘合在一起(非常像钉住)。就像这样:

代码语言:javascript
运行
复制
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       :     [?*+] ;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24207867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档