<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="generator" content="pdf2htmlEX">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" href="https://static.pudn.com/base/css/base.min.css">
<link rel="stylesheet" href="https://static.pudn.com/base/css/fancy.min.css">
<link rel="stylesheet" href="https://static.pudn.com/prod/directory_preview_static/622b2fa981ded46b7f1597d9/raw.css">
<script src="https://static.pudn.com/base/js/compatibility.min.js"></script>
<script src="https://static.pudn.com/base/js/pdf2htmlEX.min.js"></script>
<script>
try{
pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});
}catch(e){}
</script>
<title></title>
</head>
<body>
<div id="sidebar" style="display: none">
<div id="outline">
</div>
</div>
<div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/622b2fa981ded46b7f1597d9/bg1.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x1 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0"> <span class="ff2">《编译原理》</span></div><div class="t m0 x2 h3 y3 ff2 fs0 fc0 sc0 ls0 ws0">课程设计报告</div><div class="t m0 x3 h4 y4 ff2 fs1 fc0 sc0 ls0 ws0">指导教师:</div><div class="t m0 x4 h4 y5 ff2 fs1 fc0 sc0 ls0 ws0">班<span class="ff1"> </span>级:<span class="ff1"> </span></div><div class="t m0 x4 h4 y6 ff2 fs1 fc0 sc0 ls0 ws0">学生姓名:<span class="ff1"> </span></div><div class="t m0 x4 h4 y7 ff2 fs1 fc0 sc0 ls0 ws0">学<span class="ff1"> </span>号:</div><div class="t m0 x5 h4 y8 ff1 fs1 fc0 sc0 ls0 ws0"> <span class="ff2">完成日期:</span></div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,0.000000,0.000000]}'></div></div>
</body>
</html>
<div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/622b2fa981ded46b7f1597d9/bg2.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x6 h5 y9 ff2 fs2 fc0 sc1 ls0 ws0">一、课程设计题目</div><div class="t m0 x7 h6 ya ff3 fs3 fc0 sc0 ls0 ws0">PL/0<span class="_ _0"> </span><span class="ff2">语言编译器的设计与实现</span></div><div class="t m0 x6 h5 yb ff2 fs2 fc0 sc1 ls0 ws0">二、课程设计目的</div><div class="t m0 x7 h6 yc ff2 fs3 fc0 sc0 ls0 ws0">设计和<span class="_ _1"></span>实现某<span class="_ _1"></span>一规模<span class="_ _1"></span>适中的<span class="_ _1"></span>语言的<span class="_ _1"></span>编译器<span class="_ _1"></span>,该编<span class="_ _1"></span>译器不<span class="_ _1"></span>仅涉及<span class="_ _1"></span>编译程<span class="_ _1"></span>序的</div><div class="t m0 x6 h6 yd ff2 fs3 fc0 sc0 ls0 ws0">各个<span class="_ _1"></span>阶<span class="_ _1"></span>段<span class="_ _1"></span>,而<span class="_ _1"></span>且<span class="_ _1"></span>也<span class="_ _1"></span>强调<span class="_ _1"></span>了<span class="_ _1"></span>编<span class="_ _1"></span>译的<span class="_ _1"></span>总<span class="_ _1"></span>体<span class="_ _1"></span>设计<span class="_ _1"></span>、<span class="_ _1"></span>各<span class="_ _1"></span>个<span class="_ _1"></span>阶段<span class="_ _1"></span>的<span class="_ _1"></span>接<span class="_ _1"></span>口安<span class="_ _1"></span>排<span class="_ _1"></span>等<span class="_ _1"></span>等。<span class="_ _1"></span>通<span class="_ _1"></span>过<span class="_ _1"></span>上</div><div class="t m0 x6 h6 ye ff2 fs3 fc0 sc0 ls0 ws0">机实<span class="_ _1"></span>践<span class="_ _1"></span>,<span class="_ _1"></span>来设<span class="_ _1"></span>计<span class="_ _1"></span>这<span class="_ _1"></span>个相<span class="_ _1"></span>对<span class="_ _1"></span>完<span class="_ _1"></span>整的<span class="_ _1"></span>编<span class="_ _1"></span>译<span class="_ _1"></span>器,<span class="_ _1"></span>一<span class="_ _1"></span>方<span class="_ _1"></span>面<span class="_ _1"></span>可以<span class="_ _1"></span>使<span class="_ _1"></span>学<span class="_ _1"></span>生增<span class="_ _1"></span>加<span class="_ _1"></span>对<span class="_ _1"></span>编译<span class="_ _1"></span>程<span class="_ _1"></span>序<span class="_ _1"></span>的</div><div class="t m0 x6 h6 yf ff2 fs3 fc0 sc0 ls0 ws0">整体<span class="_ _1"></span>认<span class="_ _1"></span>识<span class="_ _1"></span>和了<span class="_ _1"></span>解<span class="_ _1"></span>—<span class="_ _1"></span>—巩<span class="_ _1"></span>固<span class="_ _1"></span>《<span class="_ _1"></span>程序<span class="_ _1"></span>设<span class="_ _1"></span>计<span class="_ _1"></span>语言<span class="_ _1"></span>编<span class="_ _1"></span>译<span class="_ _1"></span>原<span class="_ _1"></span>理》<span class="_ _1"></span>课<span class="_ _1"></span>程<span class="_ _1"></span>所学<span class="_ _1"></span>知<span class="_ _1"></span>识<span class="_ _1"></span>,另<span class="_ _1"></span>一<span class="_ _1"></span>方<span class="_ _1"></span>面<span class="_ _2"></span>,</div><div class="t m0 x6 h6 y10 ff2 fs3 fc0 sc0 ls0 ws0">通过<span class="_ _1"></span>上<span class="_ _1"></span>机<span class="_ _1"></span>练习<span class="_ _1"></span>,<span class="_ _1"></span>学<span class="_ _1"></span>生也<span class="_ _1"></span>可<span class="_ _1"></span>以<span class="_ _1"></span>学到<span class="_ _1"></span>很<span class="_ _1"></span>多<span class="_ _1"></span>程序<span class="_ _1"></span>调<span class="_ _1"></span>试<span class="_ _1"></span>技<span class="_ _1"></span>巧和<span class="_ _1"></span>设<span class="_ _1"></span>计<span class="_ _1"></span>大型<span class="_ _1"></span>程<span class="_ _1"></span>序<span class="_ _1"></span>一般<span class="_ _1"></span>的<span class="_ _1"></span>原<span class="_ _1"></span>则<span class="_ _2"></span>,</div><div class="t m0 x6 h6 y11 ff2 fs3 fc0 sc0 ls0 ws0">如模块接口的协调,数据结构的合理选择等等。</div><div class="t m0 x6 h5 y12 ff2 fs2 fc0 sc1 ls0 ws0">三、课程设计方案</div><div class="t m0 x6 h6 y13 ff2 fs3 fc0 sc0 ls0 ws0">建议把<span class="_ _1"></span>设计分<span class="_ _1"></span>成三部<span class="_ _1"></span>分,首<span class="_ _1"></span>先阅读<span class="_ _1"></span>本教程<span class="_ _1"></span>第一部<span class="_ _1"></span>分,在<span class="_ _1"></span>这部分<span class="_ _1"></span>就<span class="_ _3"> </span><span class="ff1">PL/0<span class="_ _0"> </span></span>语<span class="_ _1"></span>言的语</div><div class="t m0 x6 h6 y14 ff2 fs3 fc0 sc0 ls0 ws0">法及其<span class="_ _1"></span>编译程<span class="_ _1"></span>序的各<span class="_ _1"></span>个阶段<span class="_ _1"></span>作了简<span class="_ _1"></span>单介绍<span class="_ _1"></span>,以便<span class="_ _1"></span>对<span class="_ _3"> </span><span class="ff1">PL/0<span class="_ _0"> </span></span>编译程<span class="_ _1"></span>序有个<span class="_ _1"></span>初步的<span class="_ _1"></span>印</div><div class="t m0 x6 h6 y15 ff2 fs3 fc0 sc0 ls0 ws0">象。其<span class="_ _1"></span>次要认<span class="_ _1"></span>真阅读<span class="_ _1"></span>理解第<span class="_ _1"></span>三部分<span class="_ _1"></span>所给出<span class="_ _1"></span>的<span class="_ _3"> </span><span class="ff1">PL/0<span class="_ _0"> </span></span>编译器<span class="_ _1"></span>源程序<span class="_ _1"></span>,使上<span class="_ _1"></span>一阶段<span class="_ _1"></span>的</div><div class="t m0 x6 h6 y16 ff2 fs3 fc0 sc0 ls0 ws0">初步印<span class="_ _1"></span>象得以<span class="_ _1"></span>加深、<span class="_ _1"></span>具体化<span class="_ _1"></span>。最后<span class="_ _1"></span>按照第<span class="_ _1"></span>二部分<span class="_ _1"></span>的实验<span class="_ _1"></span>要求扩<span class="_ _1"></span>充<span class="_ _3"> </span><span class="ff1">PL/0<span class="_ _0"> </span></span>语<span class="_ _1"></span>言的功</div><div class="t m0 x6 h6 y17 ff2 fs3 fc0 sc0 ls0 ws0">能并加以实现。</div><div class="t m0 x6 h5 y18 ff2 fs2 fc0 sc1 ls0 ws0">四、课程设计内容</div><div class="t m0 x6 h6 y19 ff1 fs3 fc0 sc0 ls0 ws0">//<span class="ff2">要求写清自己对下面内容的理解,修改与实现。</span></div><div class="t m0 x6 h6 y1a ff2 fs3 fc0 sc0 ls0 ws0">对现存的<span class="_ _0"> </span><span class="ff1">PL/0<span class="_ _0"> </span></span>编译程序可做如下修改或扩充。</div><div class="t m0 x6 h6 y1b ff2 fs3 fc0 sc0 ls0 ws0">注释(<span class="ff1">20<span class="_ _0"> </span></span>分)</div><div class="t m0 x6 h6 y1c ff2 fs3 fc0 sc0 ls0 ws0">注释由<span class="ff1">(*</span>和<span class="ff1">*)</span>包含,不允许嵌套。</div><div class="t m0 x6 h6 y1d ff2 fs3 fc0 sc0 ls0 ws0">布尔类型的数据(<span class="ff1">30<span class="_ _0"> </span></span>分)</div><div class="t m0 x6 h6 y1e ff2 fs3 fc0 sc0 ls0 ws0">布尔类型的<span class="_ _0"> </span><span class="ff1">BNF<span class="_ _0"> </span></span>为:</div><div class="t m0 x6 h7 y1f ff1 fs3 fc0 sc0 ls0 ws0">var_option <span class="ff3">→</span> ε| <span class="ff4">var</span> var_decl_list</div><div class="t m0 x6 h7 y20 ff1 fs3 fc0 sc0 ls0 ws0">var_decl_list <span class="ff3">→</span> var_decl | var_decl_list var_decl</div><div class="t m0 x6 h7 y21 ff1 fs3 fc0 sc0 ls0 ws0">var_decl <span class="ff3">→</span> ident_list : data_type</div><div class="t m0 x6 h7 y22 ff1 fs3 fc0 sc0 ls0 ws0">data_type <span class="ff3">→</span> <span class="ff4">integer </span>| <span class="ff4">boolean</span></div><div class="t m0 x6 h6 y23 ff2 fs3 fc0 sc0 ls0 ws0">这种修改包括:</div><div class="t m0 x6 h6 y24 ff2 fs3 fc0 sc0 ls0 ws0">区别整型与布尔型变量、常量和表达式。</div><div class="t m0 x6 h6 y25 ff2 fs3 fc0 sc0 ls0 ws0">增加按严格计算的布尔类型运算符<span class="_ _3"> </span><span class="ff4">and</span>、<span class="ff4">or<span class="_ _0"> </span></span>和<span class="_ _0"> </span><span class="ff4">not</span>。这些算符以及己有的运算符</div><div class="t m0 x6 h6 y26 ff2 fs3 fc0 sc0 ls0 ws0">的优先级与<span class="_ _0"> </span><span class="ff1">Pascal<span class="_ _0"> </span></span>语言相同。</div><div class="t m0 x6 h6 y27 ff2 fs3 fc0 sc0 ls0 ws0">能够使用布尔常量<span class="_ _0"> </span><span class="ff4">true<span class="_ _0"> </span></span>和<span class="_ _0"> </span><span class="ff4">false</span>。</div><div class="t m0 x6 h6 y28 ff2 fs3 fc0 sc0 ls0 ws0">把<span class="_ _0"> </span><span class="ff1">PL/0<span class="_ _0"> </span></span>语言中的“条件”概念一般化为<span class="_ _0"> </span><span class="ff1">Pascal<span class="_ _0"> </span></span>语言那样。</div><div class="t m0 x6 h6 y29 ff2 fs3 fc0 sc0 ls0 ws0">布尔表达式可以比较大小:<span class="ff4">false<span class="ff1"> < </span>true</span></div><div class="t m0 x6 h6 y2a ff2 fs3 fc0 sc0 ls0 ws0">数组(<span class="ff1">10<span class="_ _0"> </span></span>分)</div><div class="t m0 x6 h6 y2b ff2 fs3 fc0 sc0 ls0 ws0">增加由任何数据类型构造的一维数组。数组的下标限于纯量类型。</div><div class="t m0 x6 h6 y2c ff2 fs3 fc0 sc0 ls0 ws0">注意<span class="_ _1"></span>:<span class="_ _1"></span>数<span class="_ _1"></span>组可<span class="_ _1"></span>以<span class="_ _1"></span>由<span class="_ _1"></span>其它<span class="_ _1"></span>的<span class="_ _1"></span>数<span class="_ _1"></span>组来<span class="_ _1"></span>构<span class="_ _1"></span>造<span class="_ _1"></span>,因<span class="_ _1"></span>而<span class="_ _1"></span>必<span class="_ _1"></span>须<span class="_ _1"></span>考虑<span class="_ _1"></span>多<span class="_ _1"></span>维<span class="_ _1"></span>数组<span class="_ _1"></span>的<span class="_ _1"></span>情<span class="_ _1"></span>况。<span class="_ _1"></span>数<span class="_ _1"></span>组<span class="_ _1"></span>的</div><div class="t m0 x6 h6 y2d ff2 fs3 fc0 sc0 ls0 ws0">上下界可为任意的纯量常数。</div><div class="t m0 x6 h6 y2e ff2 fs3 fc0 sc0 ls0 ws0">数组的定义如下:</div><div class="t m0 x6 h7 y2f ff1 fs3 fc0 sc0 ls0 ws0">data_type <span class="ff3">→</span> <span class="ff4">integer</span> | <span class="ff4">boolean</span> | <span class="ff4">array</span> [const..const] <span class="ff4">of</span> data_type</div><div class="t m0 x6 h7 y30 ff1 fs3 fc0 sc0 ls0 ws0">const <span class="ff3">→</span> <span class="ff4">ident</span> | <span class="ff4">number</span></div></div><div class="t m0 x8 h8 y31 ff1 fs4 fc0 sc0 ls0 ws0">2</div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,0.000000,0.000000]}'></div></div>
<div id="pf3" class="pf w0 h0" data-page-no="3"><div class="pc pc3 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/622b2fa981ded46b7f1597d9/bg3.jpg"><div class="c x0 y1 w2 h2"><div class="t m0 x6 h6 y32 ff2 fs3 fc0 sc0 ls0 ws0">语言<span class="_ _1"></span>中<span class="_ _1"></span>允<span class="_ _1"></span>许有<span class="_ _1"></span>数<span class="_ _1"></span>组<span class="_ _1"></span>说明<span class="_ _1"></span>,<span class="_ _1"></span>对<span class="_ _1"></span>数组<span class="_ _1"></span>元<span class="_ _1"></span>素<span class="_ _1"></span>赋值<span class="_ _1"></span>,<span class="_ _1"></span>在<span class="_ _1"></span>表<span class="_ _1"></span>达式<span class="_ _1"></span>中<span class="_ _1"></span>引<span class="_ _1"></span>用数<span class="_ _1"></span>组<span class="_ _1"></span>元<span class="_ _1"></span>素。<span class="_ _1"></span>为<span class="_ _1"></span>了<span class="_ _1"></span>便</div><div class="t m0 x6 h9 y33 ff2 fs3 fc0 sc0 ls0 ws0">于解释<span class="ff5">执行</span>,可能要增加<span class="ff5">新</span>的<span class="_ _0"> </span><span class="ff1">PL/0<span class="_ _0"> </span></span>机器<span class="ff5">操</span>作指<span class="ff5">令</span>。</div><div class="t m0 x6 h9 ya ff1 fs3 fc0 sc0 ls0 ws0">else<span class="_ _0"> </span><span class="ff5">子句<span class="ff2">和<span class="_ _0"> </span></span></span>repeat<span class="_ _0"> </span><span class="ff2">语<span class="ff5">句</span>(</span>10<span class="_ _0"> </span><span class="ff2">分)</span></div><div class="t m0 x6 h9 y34 ff1 fs3 fc0 sc0 ls0 ws0">for<span class="_ _0"> </span><span class="ff2">语<span class="ff5">句</span>,语法<span class="ff5">参</span>照<span class="_ _0"> </span></span>Pascal<span class="_ _0"> </span><span class="ff2">或<span class="_ _0"> </span></span>C<span class="_ _0"> </span><span class="ff2">语言(</span>5<span class="_ _0"> </span><span class="ff2">分)</span></div><div class="t m0 x6 h9 y35 ff1 fs3 fc0 sc0 ls0 ws0">exit<span class="_"> </span><span class="ff2">语<span class="_ _2"></span><span class="ff5">句<span class="_ _4"></span></span>(<span class="_ _4"></span><span class="ff5">退<span class="_ _2"></span></span>出<span class="_ _4"></span><span class="ff5">当<span class="_ _4"></span>前<span class="_ _2"></span>执<span class="_ _4"></span>行<span class="_ _4"></span></span>过<span class="_ _2"></span>程<span class="_ _4"></span>)<span class="_ _4"></span>和<span class="_ _5"> </span></span>break<span class="_"> </span><span class="ff2">语<span class="_ _2"></span><span class="ff5">句<span class="_ _4"></span></span>(<span class="_ _4"></span><span class="ff5">跳<span class="_ _2"></span></span>出<span class="_ _4"></span>包<span class="_ _4"></span>含<span class="_ _2"></span>它<span class="_ _4"></span>的<span class="_ _4"></span>最<span class="_ _2"></span>内<span class="_ _4"></span><span class="ff5">层<span class="_ _2"></span>循<span class="_ _1"></span>环<span class="_ _2"></span></span>)<span class="_ _4"></span>,</span></div><div class="t m0 x6 h6 yc ff2 fs3 fc0 sc0 ls0 ws0">(<span class="ff1">5<span class="_ _0"> </span></span>分)</div><div class="t m0 x6 h9 yd ff5 fs3 fc0 sc0 ls0 ws0">更<span class="ff2">有</span>力<span class="ff2">的语法</span>错误恢复<span class="ff2">机</span>制<span class="ff2">(<span class="ff1">20<span class="_ _0"> </span></span>分)</span></div><div class="t m0 x6 h9 ye ff2 fs3 fc0 sc0 ls0 ws0">另<span class="ff5">外</span>,<span class="_ _1"></span>为了实<span class="_ _1"></span>现以上<span class="_ _1"></span>功能,<span class="_ _1"></span><span class="ff5">你<span class="_ _1"></span></span>可任意<span class="_ _1"></span>增加<span class="_ _3"> </span><span class="ff1">PL<span class="_ _6"></span>/0<span class="_ _0"> </span><span class="ff5">处<span class="_ _1"></span><span class="ff2">理机的<span class="_ _1"></span>指</span>令<span class="_ _1"></span><span class="ff2">。</span>但<span class="ff2">要<span class="_ _1"></span>注意指<span class="_ _1"></span></span>令<span class="ff2">的</span></span></span></div><div class="t m0 x6 h6 yf ff2 fs3 fc0 sc0 ls0 ws0">简单与合理。<span class="ff1"> </span></div><div class="t m0 x6 ha y36 ff5 fs2 fc0 sc1 ls0 ws0">五<span class="ff2">、<span class="ff4 sc0"> </span>程序</span>流<span class="ff2">程</span>图</div><div class="t m0 x6 h6 y37 ff2 fs3 fc0 sc0 ls0 ws0">程序</div><div class="t m0 x6 h6 y15 ff2 fs3 fc0 sc0 ls0 ws0">程序体</div><div class="t m0 x6 h9 y2e ff2 fs3 fc0 sc0 ls0 ws0">语<span class="ff5">句</span>序<span class="ff5">列</span></div></div><div class="t m0 x8 h8 y31 ff1 fs4 fc0 sc0 ls0 ws0">3</div><div class="c x0 y1 w2 h2"><div class="t m0 x9 hb y38 ff2 fs5 fc0 sc0 ls0 ws0">程序体</div><div class="t m0 xa hc y39 ff4 fs5 fc0 sc0 ls0 ws0">.</div><div class="t m0 xb hd y3a ff2 fs5 fc0 sc0 ls0 ws0">语<span class="ff5">句</span></div><div class="t m0 xc hc y3b ff1 fs5 fc0 sc0 ls0 ws0">;</div><div class="t m0 xb hc y3c ff1 fs5 fc0 sc0 ls0 ws0">const<span class="_ _7"> </span>ident<span class="_ _8"> </span>number</div><div class="t m0 xd hc y3d ff1 fs5 fc0 sc0 ls0 ws0">=</div><div class="t m0 xe hc y3e ff1 fs5 fc0 sc0 ls0 ws0">var</div><div class="t m0 xb hc y3f ff1 fs5 fc0 sc0 ls0 ws0">;</div><div class="t m0 xf hc y3e ff1 fs5 fc0 sc0 ls0 ws0">ident</div><div class="t m0 x10 hc y40 ff1 fs5 fc0 sc0 ls0 ws0">procedure</div><div class="t m0 x11 hc y41 ff1 fs5 fc0 sc0 ls0 ws0">,</div><div class="t m0 xf hc y40 ff1 fs5 fc0 sc0 ls0 ws0">ident</div><div class="t m0 x12 hc y42 ff1 fs5 fc0 sc0 ls0 ws0">;</div><div class="t m0 xc hc y43 ff1 fs5 fc0 sc0 ls0 ws0">;</div><div class="t m0 x13 hb y44 ff2 fs5 fc0 sc0 ls0 ws0">程序体</div><div class="t m0 xc hc y45 ff1 fs5 fc0 sc0 ls0 ws0">;</div><div class="t m0 xb hd y46 ff2 fs5 fc0 sc0 ls0 ws0">语<span class="ff5">句</span></div><div class="t m0 x14 hc y47 ff1 fs5 fc0 sc0 ls0 ws0">,</div></div></div><div class="pi" data-data='{"ctm":[1.611850,0.000000,0.000000,1.611850,0.000000,0.000000]}'></div></div>