⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 explain.htm

📁 建立《编译原理网络课程》的目的不仅使学生掌握构造编译程序的原理和技术
💻 HTM
📖 第 1 页 / 共 4 页
字号:
                value
     (e)   ---> e
     not f ---> f
                not    </font></pre>

<p><font size="3">语法制导翻译:(可能出现的错误中仅列出可能的语义错误,语法错误略)</font></p>

<pre><font size="3"> _program ---&gt; 'PROGRAM'
               id          id填入零层符号表;
                           将当前层curLevel加一,进入下一层;
                           填写目标代码,将填写templength,varlength,displ的文件指针记录下来,准备反填;
               _body       填写目标代码,反填templength,varlength,displ;
               .           填写结束程序的目标代码。</font></pre>

<pre><font size="3"> _body ---&gt; [_const_session ] 
            [ _type_session ]
            [ _var_session ]       得到varlength的值
            { _proc_df }           得到displ的值
            [ _compound ]          得到templength的值 </font></pre>

<pre><font size="3"> _const_session ---&gt; const
                   { id          在符号表中插入id,可能产生2号错误(id已存在)
                     =
                     _const      填写符号表表项
                                (idclass:=1;value和consttype由_const的返回值得到)
                                 如果产生错误,将id从符号表中删除
                    }     </font></pre>

<pre><font size="3"> _const ---&gt; id       查找id,返回常数值和类型
                      如果找不到id或idclass不等于1,产生23或15号错误,错误返回
             | num    返回常数值和类型(整型)
                      其他情况产生15错误(缺少常数),错误返回         </font></pre>

<pre><font size="3"> _type_session ---&gt; 'TYPE'
                    { id     将id插入符号表。可能产生“id已存在”的错误
                      =
                      _type_df
                      ;
                     }  </font></pre>

<pre><font size="3"> _type_df ---&gt; 'ARRAY'
                [
                 _const
                 ..
                 _const        检查上下界常数
                               可能错误:上下界不匹配,下界小于上界
                 ]
                 'OF'
                 id            在符号表中查找id,填写elementtype,size和idclass=2
                               可能错误:找不到id或id不是类型名   
                 ;
           ---&gt; 'RECORD'
                 _recordlist     填写idclass=3
                 ;    </font></pre>

<pre><font size="3"> _recordlist ---&gt;{
                   id         将变量名保存在记录类型名表项的items的数组中
                              可能错误:id已存在
                   { , id }   同上
                   :
                   id          在符号表中查找id,计算出填入的变量名的记录内偏移
                               可能产生错误:id不是类型名或id不存在
                  }
                  'END'    </font></pre>

<pre><font size="3"> _var_session ---&gt; 'VAR'
                   {   id            
                       _var_list     将一串变量名保存到namelist中
                       :
                       id            在符号表中查找id,计算出填入namelist中的变量的偏移值,将这些变量插入符号表中    
                                     删除namelist的所有内容 
                       ;
                    }   </font></pre>

<pre><font size="3"> _proc_df ---&gt; 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 ---&gt; '('
            {   [ 'VAR' ]      如果出现var,则记录下来
                id             _var_list      将一串变量名保存到namelist中
                :
                id             在符号表中查找id,将namelist中的变量名插入符号表中,计算它们的偏移量(负值)
                               在过程名表项中的params中,填写参数类型和是否变参
                ;                   
             }                 在过程名表项中填写paramnum和paramlength
               ')'                     </font></pre>

<pre><font size="3"> _compound---&gt; 'BEGIN'
              { _sentence    得到templength
               }
               'END'    </font></pre>

<pre><font size="3">_sentence ---&gt; id       在符号表中查找id
            (若是过程名 idclass=6) _callproc
          | (若是变量名idcalss=5) _assign
                       可能错误:id不存在或是其他种别
          ---&gt;'IF'
               _if
          ---&gt;'WHILE'
               _while
          ---&gt;'BEGIN'
               _compound
          ---&gt;empty

</font></pre>

<pre><font size="3">_callproc ---&gt; (若id是标准过程read) _callread
             |(若是标准过程write) _callwrite
             |(其他一般过程)
               _setparam      填写调用过程的目标代码 </font></pre>

<pre><font size="3"> _setparam---&gt; '('
              {  (是变参) _varvisit
               | (是值参) _expr
              }                可能错误:参数类型不匹配
              ')'              可能错误:参数个数不匹配  </font></pre>

<pre><font size="3"> _callread---&gt;'('
             { _varvisit        填写读数据的目标代码
                               可能错误:不是整型变量
                ,
              }
               ')'                                             </font></pre>

<pre><font size="3"> _callwrite---&gt; '('
              { _expr            填写写数据的目标代码
                                 可能错误:不是整型或布尔值
                  ,
               }
                ')'         </font></pre>

<pre><font size="3"> _if---&gt;'if'
        _expr                    可能错误:表达式不是布尔值
        'then'                   填写跳转语句的目标代码,将文件指针记录下来
        _sentence;
     [  'else'                   填写跳转语句的目标代码,反填跳转地址,将新的文件指针记录下来
        _sentence
     ]                           反填跳转地址       </font></pre>

<pre><font size="3"> _while---&gt; 'while'              记录文件指针,这是将来的跳转地址
             _expr               可能错误:表达式不是布尔值
            'do'                 填写跳转语句的目标代码,记录下文件指针 
            _sentence            填写目标代码跳转至地址,反填跳转地址 </font></pre>

<pre><font size="3"> _expr---&gt; _simple_expr          记录表达式类型为简单表达式类型
          [relop                 记录比较操作
          _simple_expr ]         填写目标代码,将表达式类型记为布尔型
                                 可能错误:前后简单表达式类型不一致  </font></pre>

<pre><font size="3"> _simple_expr---&gt; [addop]         记录操作类型
                  _term           填写目标代码.记录简单表达式类型
                                  可能错误:项之前有操作符,且项不是整型  
                 { addop|'or'     记录操作
                   _term          填写目标代码,记录简单表达式类型
                                  可能错误:前后两项类型不一致,或与操作不一致
                  }                  </font></pre>

<pre><font size="3"> _term---&gt; _factor                  记录项类型(与因子类型相同)
          { '*'|'and'|'div'|'mod'
           _factor                  填写目标代码
                                    可能错误:前后两因子类型不一致,或与操作不一致
           }   </font></pre>

<pre><font size="3"> _factor---&gt; _const              填写目标代码,记录因子类型为常数的类型
           | '('
             _expr               记录因子类型为表达式的类型
             ')'  
           | 'not'
             _factor             填写目标代码,记录因子类型为布尔型
                                 可能错误:因子类型不是布尔型
           | _varvisit           记录因子类型为变量的类型  </font></pre>

<pre><font size="3">_assign---&gt; _varvisit
            ':='
            _expr                 填写目标代码。可能错误:变量与表达式类型不匹配。 </font></pre>

<pre><font size="3"> _varvisit---&gt; id
              { _select } </font></pre>

<pre><font size="3"> _select---&gt; '['               可能错误:变量不是数组类型
             _expr             可能错误:表达式类型与数组下标类型不一致
                              (编译时不检查数组下标越界错误〕
             ']'               填写数组元素访问的目标代码,记录变量类型
        ---&gt; '.'               可能错误:变量不是数组类型
             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 + -