整理了一些知识点,比较零散,多以例题为主

自顶向下分析方法:

语法分析从顶部(树根、文法的开始符号)到底部(叶子、语言的终结符号)为输入的符号串建立分析树。

主旨:从文法的开始符号S出发,反复使用各种产生式,寻找”匹配”于输入符号串的推导(从S(根)出发,向下逐步建立语法树,最终:为输入串寻找一个最左推导)

自上而下分析面临的主要问题
   1) 如何选择候选式:如果对文法不做任何限制,对候选式的选择成为无根据的,只好一一试探所有候选式,直至成功或失败。不断地回溯,大大影响速度。

2)左递归文法将使自上而下分析陷入无限循环.

因此,我们需要:

1)对文法加以一定的限制,使每次对候选式的选择是唯一的,从而进行确定的自上而下分析。

2)将左递归变为右递归(或迭代)

消除直接左递归方法:

A->Aα|β, α,β ∈ (VN∪VT)*, A ∈ VN, β不以A开头

则:A -> βA′

A ′->αA ′|ε

[例]   文法   E->E+T | T   
                   T->T*F | F    
                   F->(E) | a 
          消除左递归,得
                  E->TE’
                  E’->+TE’ | ε
                  T->FT’
                  T’->*FT’ |ε
                  F->(E) | a

消除间接左递归:

[例]  G[S]: S ->Qc | c
                        Q ->Rb | b
                        R ->Sa | a
因     S ->Qc->Rbc->Sabc, 是左递归文法
代入法:                       S->(Rb | b)c | c
                                      S->Rbc | bc | c
                                      S->(Sa | a)bc | bc | c
所以                               S->Sabc | abc | bc | c
消除左递归,得
                                      S->abcS’ | bcS’ | cS’
                                      S’->abcS’ | ε

LL(1)文法定义:

一个文法G是LL(1)文法,当且仅当对文法中形如 A->α1 | α2 | …| αn都满足LL(1)条件,即
(1) First(αi) ∩First(αj)=Φ, i≠j;
      且如果αi ->* ε,则
(2) First(αj) ∩Follow(A)=Φ, i≠j

[例]: 给定文法 S→0S|1S|ε是否为 LL(1) 文法?
解:构造LL(1)分析表:

0              1             #

S     S->0S      S->1S      S->ε

因为表中无多重定义, 所以该文法是 LL(1) 文法。

[例]左递归文法是LL(1)文法吗?
解: 因为左递归文法意味着有隐含的左公共因子,所以左递归文法不是LL(1)文法。
        例如: A->Aa|b
        因为:First(Aa}={b}, First(b)={b},
        所以:First(Aa} -> First(b)= {b}

FOLLOW集的计算:

(1) 设S为G中开始符号,则#∈FOLLOW(S)
(2) 若A ->αBβ是一产生式,则把FIRST(β)的非空元素加入到FOLLOW(B)中。
    如果β ->* ε,即有: A ->αB
    则把FOLLOW(A)也加入到FOLLOW(B)中
(3) 反复使用(2),直到每个VN的FOLLOW集不再增大为止。

SELECT集的计算:

当α不能推出ε时: select( A→α) =First(α)

当α ->* ε时: select( A→α) =Follow(A) ∪ (First(α) –{ε})

[例] 判断G是否是LL(1)文法,如果是,构造LL(1)分析表G[S]

1.  S ->AB|bC
2.  A ->ε|b
3.  B ->ε|aD
4.  C ->AD|b
5.  D ->aS|c

求First集、 Follow集:

FIRST        FOLLOW

S b,a,ε           # FOLLOW(S)={#} ∪ FOLLOW(D)

A b,ε              #,a,c FOLLOW(A)=(FIRST(B)-{ε})∪ FOLLOW(S)∪ FIRST(D)

B a,ε              # FOLLOW(B)=FOLLOW(S)

C b,a,c          # FOLLOW(C)=FOLLOW(S)

D a,c             #  FOLLOW(D)=FOLLOW(B)∪FOLLOW(C)

select(S ->AB)={b,a,#}
select(S ->bC)={b}            
select(A -> ε)=Follow(A)={#, a, c}
select(B -> ε) =Follow(B) ={#}
select(C ->AD)=First(AD)={b,a,c}
select(C ->b)={b}

故LL(1)表为:


编译原理自顶向下语法分析相关推荐

  1. 编译原理2-Bison语法分析

    ps:补上了图 实验要求 了解 Bison 基础知识和理解 Cminus-f 语法(重在了解如何将⽂法产⽣式转换为 Bison 语句) 阅读 /src/common/SyntaxTree.c ,对应头 ...

  2. 编译原理之语法分析(预测分析法)

    编译器之语法分析 自顶向下 上下文无关文法 语法树 NFA→CFG 预测分析法 改写CFG 原因 消除二义性 消除左递归 消除左公因子 消除空产生式 消除回路 自顶向下 上下文无关文法 CFG本质上就 ...

  3. 编译原理之语法分析(自底向上)(包含源码)

    编译器之语法分析 自底向上 基本概念 算符优先 SLR 规范LR LALR 自底向上 基本概念 自底向上形成语法树的过程就是及逆行归约,将一堆单词串放在一起,形成某个产生式的样子,然后规约成某个产生式 ...

  4. 编译原理 自顶向下分析

    从顶部的根节点到底部的叶节点分析方法叫做自顶向下分析.我们知道顶部的根节点可以表示成一个文法的开始符号S,所以说,自顶向下分析可以看成是从文法的开始符号S推导出词串w的过程. 例如,我们以输入id + ...

  5. 编译原理——自上而下语法分析

    自上而下分析面临的问题 回溯 (当候选有多个的时候,匹配失败会造成回溯) 文法左递归问题 那么他这个语法树就会无限增长但是分析并没有继续进行下去,就会导致分析进入死循环中 LL1文法消除左递归 消除直 ...

  6. 编译原理词/语法分析

    效果: 代码: 1: using System; 2: using System.Collections.Generic; 3: using System.ComponentModel; 4: usi ...

  7. 计算机语法分析,电子科技大学-计算机学院-编译原理实验-语法分析.pdf

    // SyntaxAnalyzer.cpp : 定义控制台应用程序的入口点. // #include #include #include #define MAX_COUNT 1024 #define ...

  8. 【编译原理】Python语法分析LL(1)、LR(1)

    目录 一.实验目的 二.实验任务 三.实验原理 1  LL(1)文法 2  LR文法 四.实验过程 1  LL(1)文法 2  LR文法 五.实验结果 1  LL(1)文法 2  LR(0)文法 3 ...

  9. 读书笔记(II) 编译原理及实践

    编译原理及实践 作者:Kenneth C.Louden 机械工业出版社 出版年:2000-3-1 综合评分:7.0 _________________________ 果然如网上流传的那样,翻译的真是 ...

  10. [编译原理]DO-WHILE循环语句的翻译程序设计(LR(1)方法、输出四元式)C++实现

    题目: DO-WHILE循环语句的翻译程序设计(LR(1)方法.输出四元式) 1 课设任务概述 初始条件: ​ 理论:完成编译原理,数据结构.高级编程语言.汇编语言等相关课程的学习,基于计算机专业知识 ...

最新文章

  1. OKR不但是目标管理工具,也是沟通工具
  2. 人脸分割 人脸解析 源码推荐
  3. 【Python小脚本】实现王者农药自动刷金币啦~啦啦啦走跟我一起组队~
  4. C++ Opengl绘制3D源码
  5. 《c语言从入门到精通》看书笔记——第3章 数据类型
  6. python基础入门(3)之字符串
  7. jsp页面div上下滑动_H5单页面手势滑屏切换原理
  8. GaussDB数据dump实现完全同步
  9. flink其他可选api
  10. 机器学习基础(六十一)—— 范数及范数的微分
  11. 粉碎文件软件测试大乐,软件测试基础(面试)(27页)-原创力文档
  12. python 绘制堆积柱状图
  13. 如何查看谷歌卫星地图每级分辨率的两种方法
  14. 微信企业号开发接口文档
  15. vue 中动态添加组件方式
  16. Rust游戏数据查询、Rust服务器清档时间表
  17. 什么是云渲染?【云渲染和传统渲染农场的区别】
  18. Win10查看电脑上次的开机时间
  19. 服务器应用程序不可用的问题
  20. 刘韧:煮知识 论英雄

热门文章

  1. python统计字符个数然后变成字典_Python之String字符串练习一(统计字符串中单词出现个数并生成字典、打印下一秒钟时间、简单购物车功能)...
  2. html5 拾色器原理,HTML_html5 学习简单的拾色器 ,下面是源码 需要浏览器支持htm - phpStudy...
  3. 数据库:简述对数据库的认识
  4. ubuntu中火狐浏览器安装flash插件
  5. Bug Algorithms
  6. 鼠标macOS下定义快捷键(各品牌通用)
  7. 如何查看MacBook Pro硬盘序列号
  8. ubuntu16安装liteide
  9. 2022电大国家开放大学网上形考任务-工程数学(本)非免费(非答案)
  10. 数学-线性代数:线性代数