编译原理PL0编译程序的实现2(希赛教育基础学院)..docVIP

编译原理PL0编译程序的实现2(希赛教育基础学院)..doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
编译原理PL0编译程序的实现2(希赛教育基础学院).

2.4 PL/0编译程序的语法分析   PL/0编译程序语法、语义分析是整个编译程序设计与实现的核心部分,要求学员努力学习掌握实现技术和方法。现分别说明语法分析实现的主要思想方法和语义分析的实现。   语法分析的任务是识别由词法分析给出的单词符号序列在结构上是否符合给定的文法规则。PL/0语言的文法规则已在2.1节中给出。本节将以语法图描述的语法形式为依据,给出语法分析过程的直观思想。   PL/0编译程序的语法分析采用了自顶向下的递归子程序法。 什么是自顶向下的语法分析?   可形象地对该程序自顶向下构造一棵倒挂着的语法分析树,其构造方法是:   (1) 由开始符号非终结符程序作为分析树的根结点,由非终结符程序规则的右部为子结点。   (2) 对分析树中的每个非终结符结点,选择它规则的一个右部为子结点构造分析树的下一层。   (3) 重复(2)直到分析树中的末端结点只有终结符。   (4) 若分析树中的末端结点从左到右连接的终结符号串刚好是输入的程序终结符号串,则说明所给程序在语法上是正确的。 可用下面简单的PL/0程序为例构造其语法分析树  粗略地说:自顶向下的递归子程序法就是对应每个非终结符语法单元,编一个独立的处理过程(或子程序)。语法分析从读入第一个单词开始由非终结符程序即开始符号出发,沿语法描述图箭头所指出的方向进行分析。当遇到非终结符时,则调用相应的处理过程,从语法描述图看也就进入了一个语法单元,再沿当前所进入的语法描述图的箭头方向进行分析,当遇到描述图中是终结符时,则判断当前读入的单词是否与图中的终结符相匹配,若匹配,则执行相应的语义程序(就是翻译程序)。再读取下一个单词继续分析。遇到分支点时将当前的单词与分支点上的多个终结符逐个相比较,若都不匹配时,可能是进入下一非终结符语法单位或是出错。图 2.7 PL/0语法调用关系图   如果一个PL/0语言的单词序列在整个语法分析中,都能逐个得到匹配,直到程序结束符.,这时就说所输入的程序是正确的。对于正确的语法分析做相应的语义翻译,最终得出目标程序。 以上所说语法分析过程非常直观粗浅,实际上应用递归子程序法构造语法分析程序时,对文法有一定的要求和限制,这个问题我们将在第5章详细讨论。   此外,从PL/0的语法描述图中可以清楚地看到,当对PL/0语言进行语法分析时,各个非终结符语法单元所对应的分析过程之间必须存在相互调用的关系。这种调用关系可用图2.7表示。也可称为PL/0语法的依赖图,在图中箭头所指向的程序单元表示存在调用关系,从图中不难看出这些子程序在语法分析时被直接或间接递归调用。   由图 2.7 PL/0语法调用关系图可以看出对分程序和语句为直接递归调用,对表达式为间接递归调用。 例:如何用递归子程序法实现表达式的语法分析 现用2.1中给出的表达式语法图进行语法分析,语法图如下: 图 2.1(e) 表达式语法描述图 图 2.1(f) 项语法描述图 图 2.1(g) 因子语法描述图 表达式的EBNF   〈表达式〉=[+|-]〈项〉{(+|-)〈项〉}   〈项〉=〈因子〉{(*|/)〈因子〉}   〈因子〉=〈标识符〉|〈无符号整数〉|‘(’〈表达式〉‘)’   〈表达式〉的递归子程序实现   procedure expr;    begin     if sym in [ plus, minus ] then      begin       getsym; term;      end     else term;     while sym in [plus, minus] do      begin       getsym; term;      end    end;   〈项〉的递归子程序实现   procedure term;   begin    factor;    while sym in [ times, slash ] do    begin     getsym; factor;    end   end;   〈因子〉的递归子程序实现   procedure factor;   begin    if sym ident then     begin      if sym number then       begin        if sym = ‘(‘ then         begin          getsym;          expr;          if sym = ‘)’ then           getsym          else error         end

文档评论(0)

d47fv82b5hI + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档