返回介绍

8.4.1.2 if语句中的模式匹配

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

if语句中的判定条件可以是一系列使用&&操作符分割的子句。每一个字句或者是一个表达式(用作布尔过滤器),或者具有形状表达式匹配模式。这些子句代表了一个从左到右的顺序的联合,也就是说,如果任何子句失败,剩余的子句都不会被计算,为了使判定条件为真,所有的子句都必须成功。布尔表达式以正常的方式计算。每一个模式都产生一个新的作用范围,其中模式标识符被隐式声明;这个作用范围扩展到判定条件中剩余的子句并扩展到if语句中对应为“真”的分支。

在每一个e匹配于p的子句中,ep必须相同的静态已知的类型。e的值以上面描述的方式与p进行匹配。

即使模式匹配子句总是返回1位的结果,整个判定条件的结果也可能会因为其中的布尔过滤器表达式变得不明确。if语句保持标准语义,也就是说,第一条语句只有当结果是确定的非零值时才执行。

例子:

if (e matches (tagged Jmp (tagged JmpC {cc:c,addr:a})))
    ...    // c和a可以在这里使用
else
    ...

下面的例子与前一个相同,它演示了一个带有标识符的两个模式匹配的序列,标识符在第一个模式中绑定,并在第二个模式中使用。

if (e matches (tagged Jmp j),
    j matches (tagged JmpC {cc:c,addr:a}))
    ...    // c和a可以在这里使用
else
    ...

下面的例子与第一个例子相同,但为子句序列加入了一个布尔表达式。它的含义为:“如果e是一个有条件的跳转指令并且条件寄存器不等于0,...”。

if (e matches (tagged Jmp (tagged JmpC {cc:c,addr:a})) && (rf[c] != 0))
    ...    // c和a可以在这里使用
else
    ...

对于if语句来说,即使它们使用了模式匹配,priority和unique限定符也仍然扮演它们原本的角色。

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

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

发布评论

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