编译原理随笔4(自下而上的语法分析-递归法)

0、基础知识

  • 推导

    • 自上而下的语法分析过程
    • 预测分析程序,递归下降分析法(最左推导)
    • 注:要求文法是LL(1)文法
  • 规约
    • 自下而上的语法分析过程
    • 简单优先分析法,算符优先分析法,LR分析法

1、自下而上的语法分析方法

  • 过程思想:

    • 最左规约的过程
    • 由输入串开始,朝着文法的开始符号进行规约
    • 规约成非终结符
    • 注:输入串是指词法分析器送过来的二元式序列
  • 下推自动机PDA
  • 语法分析程序执行动作
    • 移入:读入一个单词,入栈,读头后移
    • 规约:检查栈顶 若干个符号能否规约,若能,则以产生式左部替代该符号,同时输出产生式编号----关键点:找句柄
    • 识别成功: 移入-规约结局为,栈内只剩下栈底符号和文法开始符号,读头指向结束符。
    • 识别失败
  • 分类
    • 优先分析器(Procedence Parser)

      • 简单优先分析器
      • 算符优先分析器
    • LR分析器 

简单优先分析器

  1. 基本思想

    1. 相邻文法符号之间的优先关系。
  2. 核心步骤:找句柄    
  3. 简单优先文法    
    1. 优点:技术简单
    2. 缺点:适用范围小,分析表尺寸太大
  4. 算符优先分析法
    1. 原理:仿照四则远算的计算过程构造的
    2. 特点:简单直观、是不规范的规约,未必按照句柄进行规约,
    3. 关键:规定符号(终结符)的优先级以及综合性质 
    4. 文法:表达式文法
      1. 不考虑非终结符,仅考虑终结符之间的优先级
    5. 直观算符分析法
      1. 优点:简单,易于手工实现,适于分析各种算术表达式;;;可以很方便的将表达式翻译成目标指令(四元式)
      2. 因为用两个栈,容易将错误的语句识别为正确的,无法指出输入串出错位置。
    6. 通用算符分析法

原文地址:https://www.cnblogs.com/sqchao/p/11573778.html

时间: 2024-10-07 10:20:47

编译原理随笔4(自下而上的语法分析-递归法)的相关文章

编译原理随笔

最近初步接触到了编译原理这门课程,通过老师提供的一些链接,以及课上的知识,对这门课有了一些认识与了解. 编译原理旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成.从源语言提取需要的信息:把源语言翻译成目标语言:自动生成满足一定规范的文本... 学习编译原理可以更加容易的理解在一个语言种哪些写法是等价的,哪些是有差异的可以更加客观的比较不同语言的差异,更不容易被某个特定语言的宣扬者忽悠,学习新的语言是效率

编译原理随笔1

<!doctype html> 编译原理 blockquote:first-child, #write > div:first-child, #write > figure:first-child, #write > ol:first-child, #write > p:first-child, #write > pre:first-child, #write > ul:first-child { margin-top: 30px; } #write li

Atitit.编译原理与概论

编译原理 词法分析 Ast构建,语法分析 语意分析 6 数据结构  1. ? 记号 2. ? 语法树 3. ? 符号表 4. ? 常数表 5. ? 中间代码 1. ? 临时文件 7 其他问题  2. ? 分析和综合 3. ? 前端和后端 4. ? 遍 5. ? 语言定义和编译器 1.3 程序设计语言的发展历程1.3.1 走向高级程序设计语言1.3.2 对编译器的影响1.3.3 1.3节的练习1.4 构建一个编译器的相关科学1.4.1 编译器设计和实现中的建模1.4.2 代码优化的科学1.5 编译

编译原理实验代码(词法分析,语法分析,中间代码生成)

花了一天写出的程序没有顾及很多层面,但对于理解基本的实验道理和交上实验还是有点帮助的.代码实现了基于有限自动机的词法分析,采用递归下降分析法和EBNF文法实现语法分析并生成中间代码. lexAnalysis.h /* * lexAnalysis.h * * Created on: 2014-12-2 * Author: liuqiushan */ #ifndef LEXANALYSIS_H_ #define LEXANALYSIS_H_ #include <stdio.h> #include

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

语法分析之自顶向下分析 说明:以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 基本过程分析 1. 一般方法:对任一字符串,试图用一切可能的方法,从树根节点(开始符号)出发,根据文法自上而下地为输入符号串建立一棵语法树.直观理解为从开始符号出发,依据规则建立推导序列,最后推至目标字符串. 2. 特点:分析过程是带有预测的,是一种试探过程.试探失败就会出现回溯问题,降低了分析的效率. 3. 存在问题:左递归问题.回溯问题. 问题一:左递归问题 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); 输出:正

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

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

编译原理学习随笔

编译原理就是什么? 编译原理是计算机必修的一门重要学科.编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂. 我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了. 学习编译原理有什么好处? 可以大大提高我们的编程能力,能更好的了解计算机内部运行结果,对进一步研究计算机系统有很大帮助,同时学会了编译原理也相当于学会了一种解决问题的方法,而且是强有力的方法.能让你一直在寻求高

编译原理与javacc初探

1.前序 真是书到用时方恨少啊,在大学的时候,虽然学过编译原理,但当时真是不懂啊,只是为了应付考试,死记硬背了一点点.现在呢,由于工作上的需要,不得不弥补一下啊. 这两天把编译原理的书又看了一遍,其实也就是主要看了文法,词法分析,语法分析而已,为了备忘,赶紧先记一下吧. 2.定义 词法分析,就是把源码中的一行行代码按照事先规定好的格式分隔成一个个单词符号(token),比如数字,变量名称,函数等等. 语法分析呢,主要就是分析词法分析后的一个个token,是否能够拼装,组成事先规定好的语法中的一个