编译原理(四)语法分析之自顶向下分析

语法分析之自顶向下分析

说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记。

基本过程分析

1. 一般方法:对任一字符串,试图用一切可能的方法,从树根节点(开始符号)出发,根据文法自上而下地为输入符号串建立一棵语法树。直观理解为从开始符号出发,依据规则建立推导序列,最后推至目标字符串。

2. 特点:分析过程是带有预测的,是一种试探过程。试探失败就会出现回溯问题,降低了分析的效率。

3. 存在问题:左递归问题、回溯问题。

问题一:左递归问题

1. 左递归文法:文法规则中有形如 \(U::=U···\) 或 $ U=+>U···$。

为什么自顶向下分析不能处理左递归?
答:试想,若遇到非终结符U时,尝试用该规则右部 "U···" 去匹配字符串,下一步又要匹配U,又要尝试用用该规则右部 "U···" 右部去匹配,无限循环无终止。

2. 消除左递归

引用说明

- 邵老师课堂PDF
- 《编译原理级编译程序构造》

原文地址:https://www.cnblogs.com/AlvinZH/p/8306007.html

时间: 2024-10-22 03:18:01

编译原理(四)语法分析之自顶向下分析的相关文章

编译原理课后作业【自顶向下分析法】语法分析

实验二: 题目:语法分析 目的:通过该实验掌握描述语法的文法和自顶向下分析法中的预测分析法. 要求:对给定的文法建立预测分析表:利用预测分析法对实验一的结果进行语法分析,对不符合给定文法的表达式给出出错位置信息. 内容:给定描述语法的文法为: E->E+T|T T->T*F|F F->i|(E) 题目如上描述. 用了STL里的MAP写了个程序,写的比较简单也可能有BUG,欢迎大家指出修正 Source code: 1 //Jeremy Wu {Wushuaiyi} CS1301 2 //

编译原理 四

1. 梳理第二章的内容,写一篇理解与总结. 当我们要描述一种语言时,需要给出这种语言的所有句子,当句子的数目是有限可数时,就要都列出来:当句子是一个无穷集,也就是无限不可数时,就要给出可以表示它们的结构的描述方法或者说,句子的组成规则.这种规则就是文法. 从形式上用于描述和规定结构的称为文法(或者说语法) 一.文法的定义: 文法G定义为一个四元组(VN,VT,P,S),其中,VN为非终结符集合,VT终结符集合:P是产生式结合:S称为识别符或开始符号,也是一个非终结符,至少要在一条产生式的左边出现

编译原理 算法3.8 LR分析 c++11实现

LR分析简介 LR分析是应用最广泛的一类分析方法,它是实用的编译器功能中最强的分析器,其特点是: 1,采用最一般的无回溯移进-规约方法. 2,可分析的文法是LL文法的真超集. 3,能够及时发现错误,及时从左扫描输入序列的最大可能. 4,分析表较为复杂,难以手工构造. 实验内容 根据LR分析表action和goto实现LR分析. 实验步骤 输入 序列$\omega$和文法$G$的LR分析表action与goto. 输出 若$\omega \in L(G)$,得到$\omega$的规范规约,否则指出

编译原理(一)

一.编译器前端模型 |---------->符号表------------------------------------------------>| 源程序----(词法分析器)--->词法单元----(语法分析器)---->语法分析树----(中间代码生成器)--->三地址代码 二.语法定义——“上下文无关文法”(context-free grammar) 1.由数位和+.-符号组成 此文法产生式为 expr -> expr + digit expr -> e

学期总结之数学建模软件——编译原理

这学期我们还学习了编译原理的知识,总结起来,共分几个步骤:1.词法分析:任务是将源程序转换成内部格式:2.语法分析:任务是判断源程序结构是否符合该语言的语法:3.语义分析:任务是保证源程序在语义上的正确性:4.中间代码生成:将于源程序转换成等价的中间语言代码:5.代码优化:对中间代码的优化处理6.目标代码生成:将中间代码翻译为机器语言或汇编语言.其中,词法分析使用的方法和算法为:状态转换图和有限自动机. 其中,我们主要学习了词法分析和语法分析部分. 词法分析: 依次读入字符,根据有穷自动状态机来

编译原理复习

第1章 引论 编译程序的基本任务是将源语言程序翻译成等价的目标语言程序 编译过程 包括词法分析.语法分析.语义分析.中间代码生成.代码优化和目标代码生成6个阶段,除此之外还有表格管理以及出错处理. 词法分析 任务:从左到右一个字符一个字符的读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词. 输入为:源程序 语法分析 任务:在词法分析的基础上将单词序列分解成各类语法短语. 语义分析 任务:审查源程序有无语义错误,为代码生成阶段收集类型信息. 中间代码生成 常用的三种方式:三元式

编译原理LL(1)详解

前段时间为了做编译器,猛啃了一下编译原理.语法分析部分用的是比较简单上手的LL(1), 自认为LL(1)的理论部分理解得不错,在这里写出来跟大家share一下. 关于什么是LL(1),就不赘述了,书上也说得很清楚,就是从左向右扫描输入,然后产生最左推导(就是每次都把最左边的非终结字符用产生式代替). (一)为什么我们需要First集合 比如有产生式 A-> + T | - P , 当我们读到串为 +开头的时候,我们可以很直接地判断选择 A-> + T 这个生成式:串为- 开头的时候,选择 A-

吉首大学_编译原理实验题_基于预測方法的语法分析程序的设计【通过代码】

一.实验要求 实验二 基于预測方法的语法分析程序的设计 一.实验目的 了解预測分析器的基本构成及用自顶向下的预測法对表达式进行语法分析的方法,掌握预測语法分析程序的手工构造方法. 二.实验内容 1.了解编译程序的基于预測方法的语法分析过程. 2.依据预測分析原理设计一个基于预測方法的语法分析程序. 三.实验要求 对给定文法G[S]: S->AT       A->BU     T->+AT|$      U->*BU|$    B->(S)|m 当中,$表示空串. 1.推断上

编译原理 实验3 语法分析

语法分析 一. 实验目的 算术表达式的文法可以是(你可以根据需要适当改变): E→E+E|E-E|E*E|E/E|(E)|i 根据算符优先分析法,将表达式进行语法分析,判断一个表达式是否正确. 二. 实验环境 操作系统:window xp 编写环境:visual c++ 编写语言:c语言 三. 实验内容 程序输入/输出示例: 如参考C语言的运算符.输入如下表达式(以分号为结束)和输出结果: (1)10; 输出:正确 (2)1+2; 输出:正确 (3)(1+2)/3+4-(5+6/7); 输出:正