返回介绍

8.4.1 模式匹配

发布于 2020-09-09 22:55:47 字数 1494 浏览 980 评论 0 收藏 0

对于将一个值与结构体、标签联合体和常量进行比较以及对它们的成员的访问来讲,模式匹配提供了一个形象而又简洁的符号。SystemVerilog为case语句、if语句以及条件表达式加入了模式匹配的能力。在描述那些关联文中的模式匹配之前,我们首先描述一下基本概念。

模式是在叶子上带有标识符、常量表达式、以及通配符模式“.*”的标签联合体和结构体表达式的嵌套。对于标签联合体模式,紧跟tagged关键字之后的标识符是一个联合体成员名。对于void成员, 嵌套的成员模式被忽略。

pattern ::=                                              // 引用自附录A.6.7.1
    variable_identifier
  | .*
  | .constant_expression
  | tagged member_identifier [pattern]
  | {pattern{,pattern}}
  | {member_identifier : pattern {, member_identifier : pattern}}

语法 8-4 — 模式语法(摘录自附录A)

由于模式是与已知类型的表达式进行匹配,所以模式总是出现在已知类型的关联文中。递归起来,它的嵌套模式也是已知类型的。常量表达式模式必须具有integral类型。因此,模式总是可以进行静态的类型检查。

每一个模式都引入了一个新的范围;下面的几节会对case语句、if语句和条件表达式的范围扩展作单独的描述。每一个模式标识符在模式的范围内被隐式地声明成一个新的具有唯一类型的变量,它必须基于它在模式中的位置来确定这个类型。模式标识符在模式内必须是唯一的,也就是说,在单个模式内相同的标识符不能在多个位置使用。

在模式匹配中,一个表达式的值V总是匹配于一个模式。注意:静态类型检查能够确保V与模式具有相同的类型。一个模式匹配的结果是:

  • 一个确定的1位值:0(假或失败)或1(真或成功)。即使值和模式包含了x或z,结果也不会是x或z。
  • 如果匹配成功,那么模式标识符使用普通的过程赋值绑定到V中的对应成员。

每一个模式通过使用下述简单的递归规则进行匹配:

  • 一个标识符模式总是成功的(匹配于任意值),并且标识符被绑定到这个值(使用普通的过程赋值)。
  • 通配符模式“.*”总是成功的。
  • 一个常量表达式模式在V等于表达式的值的时候是成功的。
  • 对于一个标签联合体模式,如果值具有相同的标签,并且如果这个嵌套的模式匹配于标签联合体的成员值,那么匹配是成功的。
  • 对于结构体模式,如果每一个嵌套成员模式匹配于V中的对应成员,那么匹配是成功的。在具有命名成员的结构体模式中,成员的文本顺序是无关紧要的,并且成员可以被省略。省略的成员会被忽略。

从概念上讲,如果值V被看作是一个展平的位向量,那么模式指定了哪些位进行匹配,它们应该匹配于什么值,并且,如果匹配成功,它指定需要提取哪些位并绑定于模式标识符。匹配可以不敏感于x和z,就像下面的单独结构中所描述的那样。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文