📄 explain.htm
字号:
value
(e) ---> e
not f ---> f
not </font></pre>
<p><font size="3">语法制导翻译:(可能出现的错误中仅列出可能的语义错误,语法错误略)</font></p>
<pre><font size="3"> _program ---> 'PROGRAM'
id id填入零层符号表;
;
将当前层curLevel加一,进入下一层;
填写目标代码,将填写templength,varlength,displ的文件指针记录下来,准备反填;
_body 填写目标代码,反填templength,varlength,displ;
. 填写结束程序的目标代码。</font></pre>
<pre><font size="3"> _body ---> [_const_session ]
[ _type_session ]
[ _var_session ] 得到varlength的值
{ _proc_df } 得到displ的值
[ _compound ] 得到templength的值 </font></pre>
<pre><font size="3"> _const_session ---> const
{ id 在符号表中插入id,可能产生2号错误(id已存在)
=
_const 填写符号表表项
(idclass:=1;value和consttype由_const的返回值得到)
如果产生错误,将id从符号表中删除
;
} </font></pre>
<pre><font size="3"> _const ---> id 查找id,返回常数值和类型
如果找不到id或idclass不等于1,产生23或15号错误,错误返回
| num 返回常数值和类型(整型)
其他情况产生15错误(缺少常数),错误返回 </font></pre>
<pre><font size="3"> _type_session ---> 'TYPE'
{ id 将id插入符号表。可能产生“id已存在”的错误
=
_type_df
;
} </font></pre>
<pre><font size="3"> _type_df ---> 'ARRAY'
[
_const
..
_const 检查上下界常数
可能错误:上下界不匹配,下界小于上界
]
'OF'
id 在符号表中查找id,填写elementtype,size和idclass=2
可能错误:找不到id或id不是类型名
;
---> 'RECORD'
_recordlist 填写idclass=3
; </font></pre>
<pre><font size="3"> _recordlist --->{
id 将变量名保存在记录类型名表项的items的数组中
可能错误:id已存在
{ , id } 同上
:
id 在符号表中查找id,计算出填入的变量名的记录内偏移
可能产生错误:id不是类型名或id不存在
;
}
'END' </font></pre>
<pre><font size="3"> _var_session ---> 'VAR'
{ id
_var_list 将一串变量名保存到namelist中
:
id 在符号表中查找id,计算出填入namelist中的变量的偏移值,将这些变量插入符号表中
删除namelist的所有内容
;
} </font></pre>
<pre><font size="3"> _proc_df ---> id 在符号表中插入id。(可能错误:id已存在,嵌套过程过多)
填入信息:idclass=6;isStandard=false
curLevel=curLevel+1
填写目标代码,将templength,varlength,displ对应的文件指针保存起来
[_param]
';'
_body 反填varlength,templength,displ的值
; 填写过程结束的目标代码
删除本层的符号表的所有表项
curLevel=curLevel-1 </font></pre>
<pre><font size="3"> _param ---> '('
{ [ 'VAR' ] 如果出现var,则记录下来
id _var_list 将一串变量名保存到namelist中
:
id 在符号表中查找id,将namelist中的变量名插入符号表中,计算它们的偏移量(负值)
在过程名表项中的params中,填写参数类型和是否变参
;
} 在过程名表项中填写paramnum和paramlength
')' </font></pre>
<pre><font size="3"> _compound---> 'BEGIN'
{ _sentence 得到templength
;
}
'END' </font></pre>
<pre><font size="3">_sentence ---> id 在符号表中查找id
(若是过程名 idclass=6) _callproc
| (若是变量名idcalss=5) _assign
可能错误:id不存在或是其他种别
--->'IF'
_if
--->'WHILE'
_while
--->'BEGIN'
_compound
--->empty
</font></pre>
<pre><font size="3">_callproc ---> (若id是标准过程read) _callread
|(若是标准过程write) _callwrite
|(其他一般过程)
_setparam 填写调用过程的目标代码 </font></pre>
<pre><font size="3"> _setparam---> '('
{ (是变参) _varvisit
| (是值参) _expr
} 可能错误:参数类型不匹配
')' 可能错误:参数个数不匹配 </font></pre>
<pre><font size="3"> _callread--->'('
{ _varvisit 填写读数据的目标代码
可能错误:不是整型变量
,
}
')' </font></pre>
<pre><font size="3"> _callwrite---> '('
{ _expr 填写写数据的目标代码
可能错误:不是整型或布尔值
,
}
')' </font></pre>
<pre><font size="3"> _if--->'if'
_expr 可能错误:表达式不是布尔值
'then' 填写跳转语句的目标代码,将文件指针记录下来
_sentence;
[ 'else' 填写跳转语句的目标代码,反填跳转地址,将新的文件指针记录下来
_sentence
] 反填跳转地址 </font></pre>
<pre><font size="3"> _while---> 'while' 记录文件指针,这是将来的跳转地址
_expr 可能错误:表达式不是布尔值
'do' 填写跳转语句的目标代码,记录下文件指针
_sentence 填写目标代码跳转至地址,反填跳转地址 </font></pre>
<pre><font size="3"> _expr---> _simple_expr 记录表达式类型为简单表达式类型
[relop 记录比较操作
_simple_expr ] 填写目标代码,将表达式类型记为布尔型
可能错误:前后简单表达式类型不一致 </font></pre>
<pre><font size="3"> _simple_expr---> [addop] 记录操作类型
_term 填写目标代码.记录简单表达式类型
可能错误:项之前有操作符,且项不是整型
{ addop|'or' 记录操作
_term 填写目标代码,记录简单表达式类型
可能错误:前后两项类型不一致,或与操作不一致
} </font></pre>
<pre><font size="3"> _term---> _factor 记录项类型(与因子类型相同)
{ '*'|'and'|'div'|'mod'
_factor 填写目标代码
可能错误:前后两因子类型不一致,或与操作不一致
} </font></pre>
<pre><font size="3"> _factor---> _const 填写目标代码,记录因子类型为常数的类型
| '('
_expr 记录因子类型为表达式的类型
')'
| 'not'
_factor 填写目标代码,记录因子类型为布尔型
可能错误:因子类型不是布尔型
| _varvisit 记录因子类型为变量的类型 </font></pre>
<pre><font size="3">_assign---> _varvisit
':='
_expr 填写目标代码。可能错误:变量与表达式类型不匹配。 </font></pre>
<pre><font size="3"> _varvisit---> id
{ _select } </font></pre>
<pre><font size="3"> _select---> '[' 可能错误:变量不是数组类型
_expr 可能错误:表达式类型与数组下标类型不一致
(编译时不检查数组下标越界错误〕
']' 填写数组元素访问的目标代码,记录变量类型
---> '.' 可能错误:变量不是数组类型
id 在符号表中查找id,填写目标代码,记录变量类型
可能错误:无此域名 </font></pre>
<h4>主要过程及其说明</h4>
<pre><font size="3"><a href="source.htm#_program" target="ff2">_program</a>
说明:本过程是模块的主过程,按照_program的语法制导工作。</font></pre>
<pre><font size="3"><a href="source.htm#_body" target="ff2">_body</a>
输出:变量长度varlength,临时堆栈长度templength,过程偏移displ。
说明:本过程分析程序体的语法语义,按照_body的语法制导工作。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -