📄 00584.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<html>
<head>
<title>8.4.1 模式匹配</title>
<meta http-equiv="Content-Type" content="text/html; charset=GB2312" />
<meta name="generator" content="Doc-O-Matic" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<link rel="STYLESHEET" href="default.css" type="text/css" />
<script type="text/javascript" src="scripts.js"></script>
</head>
<body class="Element700" onload="onBodyLoadEx('systemverilog31a.html', 'topic', '00584.html');" onmousedown="onBodyMouseDown();">
<!-- Begin Popups -->
<div class="Element801" id="popup00146">
<div class="Element800">
<div class="Element14">
链接</div>
<div class="Element11">
<div class="Element10">
<a href="00583.html" target="topic">8.4 选择语句</a>, <a href="00915.html" target="topic">主题</a></div>
</div>
</div>
</div>
<!-- End Popups -->
<!-- Begin Page Header -->
<div class="Element710" id="areafixed">
<div class="Element92">
<table width="100%" cellspacing="0" cellpadding="0">
<tr><td width="33%">
<div class="Element1">
<a href="#" onmousedown="showPopup(this, 'popup00146');"><img src="seealsolink.png" border="0" alt="" title=""></a> SystemVerilog 3.1a语言参考手册</div>
</td><td width="34%">
<div class="Element2">
</div>
</td><td width="33%">
<div class="Element90">
<a href="00583.html" target="topic"><img src="btn_prev_lightblue.gif" border="0" alt="Previous" title="Previous" onmouseover="switchImage(this, 'btn_prev_lightblue_hover.gif');" onmouseout="switchImage(this, 'btn_prev_lightblue.gif');"></a><a href="00583.html" target="topic"><img src="btn_up_lightblue.gif" border="0" alt="Up" title="Up" onmouseover="switchImage(this, 'btn_up_lightblue_hover.gif');" onmouseout="switchImage(this, 'btn_up_lightblue.gif');"></a><a href="00585.html" target="topic"><img src="btn_next_lightblue.gif" border="0" alt="Next" title="Next" onmouseover="switchImage(this, 'btn_next_lightblue_hover.gif');" onmouseout="switchImage(this, 'btn_next_lightblue.gif');"></a></div>
</td></tr></table><div class="Element5">
8.4.1 模式匹配</div>
</div>
</div>
<!-- End Page Header -->
<!-- Begin Client Area -->
<div class="Element720" id="areascroll">
<div class="Element721">
<!-- Begin Page Content -->
<div class="Element58">
<a name="描述"></a><div class="Element11">
<div class="Element10">
<p class="Element10">
对于将一个值与结构体、标签联合体和常量进行比较以及对它们的成员的访问来讲,模式匹配提供了一个形象而又简洁的符号。SystemVerilog为<span style="color: #0000FF">case</span>语句、<span style="color: #0000FF">if</span>语句以及条件表达式加入了模式匹配的能力。在描述那些关联文中的模式匹配之前,我们首先描述一下基本概念。 </p>
<p class="Element10">
</p>
<p class="Element10">
模式是在叶子上带有标识符、常量表达式、以及通配符模式“<span style="color: #800080">.*</span>”的标签联合体和结构体表达式的嵌套。对于标签联合体模式,紧跟<span style="color: #0000FF">tagged</span>关键字之后的标识符是一个联合体成员名。对于<span style="color: #0000FF">void</span>成员, 嵌套的成员模式被忽略。 </p><div class="Element170">
<a href="#" onclick="CopyElementToClipboard('code00267');">Copy Code</a></div>
<div class="Element13"><div class="Element12" id="code00267"><pre class="Element12">pattern ::= <span style="color: #008000">// 引用自附录A.6.7.1</span>
variable_identifier
| <strong><span style="color: #FF0000">.*</span></strong>
| <strong><span style="color: #FF0000">.</span></strong>constant_expression
| <strong><span style="color: #FF0000">tagged</span></strong> member_identifier [pattern]
| <strong><span style="color: #FF0000">{</span></strong>pattern{<strong><span style="color: #FF0000">,</span></strong>pattern}<strong><span style="color: #FF0000">}</span></strong>
| <strong><span style="color: #FF0000">{</span></strong>member_identifier <strong><span style="color: #FF0000">:</span></strong> pattern {<strong><span style="color: #FF0000">,</span></strong> member_identifier <strong><span style="color: #FF0000">:</span></strong> pattern}<strong><span style="color: #FF0000">}</span></strong></pre></div></div>
<p class="Element10" style="text-align: center">
<strong>语法 8-4 — 模式语法(摘录自附录A)</strong></p><p class="Element10">
</p>
<p class="Element10">
由于模式是与已知类型的表达式进行匹配,所以模式总是出现在已知类型的关联文中。递归起来,它的嵌套模式也是已知类型的。常量表达式模式必须具有integral类型。因此,模式总是可以进行静态的类型检查。 </p>
<p class="Element10">
</p>
<p class="Element10">
每一个模式都引入了一个新的范围;下面的几节会对<span style="color: #0000FF">case</span>语句、<span style="color: #0000FF">if</span>语句和条件表达式的范围扩展作单独的描述。每一个模式标识符在模式的范围内被隐式地声明成一个新的具有唯一类型的变量,它必须基于它在模式中的位置来确定这个类型。模式标识符在模式内必须是唯一的,也就是说,在单个模式内相同的标识符不能在多个位置使用。 </p>
<p class="Element10">
</p>
<p class="Element10">
在模式匹配中,一个表达式的值<i>V</i>总是匹配于一个模式。注意:静态类型检查能够确保V与模式具有相同的类型。一个模式匹配的结果是:</p>
<ul class="Element630">
<li class="Element600">一个确定的1位值:<span style="color: #FF0000">0</span>(假或失败)或<span style="color: #FF0000">1</span>(真或成功)。即使值和模式包含了<span style="color: #FF0000">x</span>或<span style="color: #FF0000">z</span>,结果也不会是<span style="color: #FF0000">x</span>或<span style="color: #FF0000">z</span>。</li>
<li class="Element600">如果匹配成功,那么模式标识符使用普通的过程赋值绑定到<i>V</i>中的对应成员。</li>
</ul><p class="Element10">
每一个模式通过使用下述简单的递归规则进行匹配:</p>
<ul class="Element630">
<li class="Element600">一个标识符模式总是成功的(匹配于任意值),并且标识符被绑定到这个值(使用普通的过程赋值)。</li>
<li class="Element600">通配符模式“<span style="color: #800080">.*</span>”总是成功的。</li>
<li class="Element600">一个常量表达式模式在<i>V</i>等于表达式的值的时候是成功的。</li>
<li class="Element600">对于一个标签联合体模式,如果值具有相同的标签,并且如果这个嵌套的模式匹配于标签联合体的成员值,那么匹配是成功的。</li>
<li class="Element600">对于结构体模式,如果每一个嵌套成员模式匹配于<i>V</i>中的对应成员,那么匹配是成功的。在具有命名成员的结构体模式中,成员的文本顺序是无关紧要的,并且成员可以被省略。省略的成员会被忽略。</li>
</ul><p class="Element10">
从概念上讲,如果值<i>V</i>被看作是一个展平的位向量,那么模式指定了哪些位进行匹配,它们应该匹配于什么值,并且,如果匹配成功,它指定需要提取哪些位并绑定于模式标识符。匹配可以不敏感于<span style="color: #FF0000">x</span>和<span style="color: #FF0000">z</span>,就像下面的单独结构中所描述的那样。</p></div>
</div>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -