语法分析—自顶向而下分析.ppt

  1. 1、本文档共55页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
语法分析—自顶向而下分析

第四章 语法分析——自顶向而下分析 4.1 语法分析的任务 检查输入的单词符号序列是否符合该语言文法 使用例 检查表达式、语句、函数的格式 分析器的输出 分析树 格式化的程序 合法的表达式、语句、函数 出错处理要求 尽快发现错误,准确定位, 可能时进行恢复处理,继续语法分析 4.2 上下文无关文法(2型文法) 编程语言的语法大都可用2型文法来描述 例 4-1 表达式的语法 E → E + T | E - T | T T → T * F | T / F | F F → ( E ) | id | const VN={ E,T, F } VT={ id, const, +,-,*,/,(,) } S = E 2 型文法的使用限制 没有一种方法能够有效地分析所有上下文无关文法 存在无法处理的2型文法 每种方法能够处理一部分上下文无关文法 每种方法都有适用范围 常用文法 LL文法和 LR 文法都是2型文法的子集 对于同一语言的语法 可用不同的文法来描述 对于不同的文法,可用不同的分析方法 LL文法 ── 递归下降分析法 LR文法 ── LR分析法 LL 文法多用于编译的手工实现 LR 文法多用于编译的自动生成 4.2.1 自顶向下分析 基本方法 为输入符号串寻找最左推导 试图根据当前输入单词判断使用哪个产生式 过程 从根开始,按前序顺序,构造分析树 例 4-2:分析符号串 id + id * id 符合表达式文法: E → T E E→ + T E|ε T → F T T→ * F T|ε F → ( E )|id 按照最左推导过程,构造分析树 推导过程 推导过程的分析 输入:符号串(有序的) 输出:结构化的符号串(树结构) 产生式的选择 根据当前符号(单词) 分析树的表示: 按照使用序列排列的产生式序列 4.2.2 FIRST 和 FOLLOW 集 定义: FIRST( α ) = { a |α ==* a …,a∈VT } α的所有首符号(选择产生式的依据) 且,若 α==*ε,则ε∈ FIRST(α) 定义: FOLLOW( A ) = { a | S ==* …Aa…,a∈VT } A 的后续符号 FIRST( X ) 的计算法 对所有语法符号 X,重复进行以下计算 1) 若 X ∈VT,则 FIRST( X ) = X 。 2) 若 X ∈VN, 有产生式 X → a…,则将 a 加入FIRST(X); 有产生式 X →ε,则将ε加入 FIRST( X )。 3) 若有产生式 X → Y…,且 Y ∈VN, 则 FIRST(Y) 的非ε元素 ∈ FIRST(X); 若有产生式 X → Y1…Yk ,并对于某个 i,使得 Y1 ... Yi-1==*ε, 则将 FIRST( Yi ) 的所有非ε元素加入到 FIRST( X ) 中; 若 Y1 ... Yk ==* ε, 则将 ε 加入到 FIRST( X )。 例 4-3: 表达式文法的 FIRST 集 FIRST( F ) = { ‘(‘, id } FIRST( T ) = FIRST( F ) = { ‘(‘, id } FIRST( E ) = FIRST( T ) = { ‘(‘, id } FIRST( E ) = { ‘+’,ε} FIRST( T ) = { ‘*’, ε} FOLLOW( A ) 的计算法 对于所有非终结符, 重复进行以下计算 1) 将 # 加入到 FOLLOW( S ) 句子的结束符 2) 若 A → αBβ, 则将 FIRST(β) 的非ε元素加入 FOLLOW(B) 3) 如果 A → αB 或 A → αBβ,且 β==*ε,A≠B, 则将 FOLLOW(A) 的所有元素加入 FOLLOW(B) 例 4-4: 表达式文法的 FOLLOW 集 FOLLOW( E ) = { ‘)’, # } FOLLOW( E ) = FOLLOW( E ) = { ‘)’, # } FOLLOW( T ) = { +, ‘)’, # } FOLLOW( T ) = FOLLOW( T ) = { +, ‘)’, # } FOLLOW( F ) = { *, +, ), # } 4.2.3 LL( 1 ) 文法 第一个 L 表示从左向右扫描输入符号串 第二个 L 表示生成最左推导 1 表示读入一个符号可确定下一步推导 表示了自顶向下方法能够处理的文法 文法G是 LL(1) 的充要条件: 对于 G 的每个非终结符 A 的 任何两个不同的产生式 A → α|β 1) FIRST(α) ∩ FIRST(

文档评论(0)

ligennv1314 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档