首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >模式匹配语法定义

模式匹配语法定义
EN

Stack Overflow用户
提问于 2016-10-20 23:44:04
回答 3查看 128关注 0票数 0

具有如下语法定义:

代码语言:javascript
运行
复制
syntax ClassDeclaration = classDecl: "class" Identifier ClassBody ;
...
syntax ClassBody = classBody : "{" ClassBodyDeclaration* "}" ;

syntax ClassBodyDeclaration = ClassMemberDeclaration 
                           | InstanceInitializer 
                           | StaticInitializer 
                           | ConstructorDeclaration 
                           ;

... 

通过使用访问器,我可以使用以下命令对类主体进行模式匹配:

代码语言:javascript
运行
复制
visit(unit) {
  case classDecl(name,  ClassBody body): { // a block "A" here }
  ...
}

问:在这种情况下,我如何模式匹配"A“块中" body”变量中的类体声明列表?我尝试过理解,但我发现"body“不是一个可枚举类型。

EN

Stack Overflow用户

发布于 2016-10-20 23:56:21

最简单的方法是为ClassBodyDeclaration*命名,如下所示:

代码语言:javascript
运行
复制
syntax ClassBody = classBody : "{" ClassBodyDeclaration* decls "}";

然后,您可以使用理解来访问每个声明,例如,使用declList = [ d | d <- body.decls ]之类的代码将它们提取到一个列表中。

另一种选择是使用Rascal的具体语法匹配功能,它不需要修改语法。您可以使用以下代码匹配正文中的声明:

代码语言:javascript
运行
复制
list[ClassBodyDeclaration] declList = [ ];

if ((ClassBody)`{ <ClassBodyDeclaration* decls> }` := body) {
    declList = [ d | d <- decls ];
}

最后,正如在另一个响应中提到的,您可以执行Rascal所称的深度匹配,匹配body中出现的所有ClassBodyDeclaration

代码语言:javascript
运行
复制
declList = [ d | /ClassBodyDeclaration d := body ];

这是很好的,除非,由于某种原因,您可以将类嵌套在其他类中,在这种情况下,您不会只获得那些属于当前类的类体声明,还会获得嵌套类所拥有的所有声明。

票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40158926

复制
相关文章

相似问题

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