首页 > 其他分享 >day04_编译原理学习

day04_编译原理学习

时间:2024-09-04 17:22:59浏览次数:15  
标签:文法 终结符 递归 推导 符号 day04 编译 句型 原理

第四章 语法分析

自顶向下分析的概述

处理文法的编译器大致分为三种类型:通用型,自顶向下型和自底向上型。编译器中常用的方法可以分为自顶向下和自底向上。

自顶向下分析

  • 从分析树的顶部(根节点)向底部(叶节点)方向构造分析树
  • 可以看成是从文法开始符号S推导出词串w的过程。
  • 每一步推导中,都需要做两个选择

    • 替换当前句型中的哪个非终结符
    • 用该非终结符的哪个候选式进行替换
  • 基本概念:

    • 推导:从开始符号出发,每个重写步骤把一个非终结符号替换为其某个产生式的体。
    • 句型:由文法的开始符号经过零步或多步推导出的,既包含终结符号又包含非终结符号,也可能是空串。
    • 句子:不包含非终结符号的句型
    • 文法生成的语言:所有句子的集合

最左推导

  • 在最左推导中,总是选择每个句型的最左非终结符进行替换。相应地,其逆过程称为最右规约。

最右推导

  • 在最右推导中,总是选择每个句型的最右非终结符进行替换。相应地,其逆过程称为最左规约。

  • 在自底向上的分析中,总是采用最左规约的方式,因此把最左规约称为 规范规约,而最右推导相应地称为规范推导。

最左推导和最右推导的唯一性

自顶而下的语法分析采用最左推导

  • 总是采用每个句型的最左非终结符进行替换
  • 根据输入流中的 下一个终结符,选择最左非终结符的一个候选式。

自顶向下语法分析的通用形式

  • 递归下降分析(Recursive-Descent Parsing)

    • 由一组 过程 组成,每个过程对应一个非终结符
    • 从文法开始符号S对应的过程开始,其中递归调用文法中其它非终结符对应的过程。如果S对应的过程恰好扫描了整个输入串,则成功完成语法分析
    • 可能需要回溯,导致效率比较低
  • 预测分析(Predictive Parsing)

    • 预测分析是递归下降分析的一个特例,通过在输入中向前看 固定个数(通常为1)符号来选择正确的A-产生式。
      • 可以对某些文法构造出向前看k个输入符号的预测分析器,该类文法有时也成称为LL(k)文法类
    • 预测分析不需要回溯,是一种确定的自顶向下方法

文法转换

问题一

  • 同一非终结符的多个候选式存在共同前缀,将导致 回溯 现象

问题二

  • 含有A->A形式产生式的文法称为是 直接左递归(immediate left recursive)的
  • 如果一个文法中有一个非终结符A使得某个串a存在一个推导,那么这个文法就是左递归的。
  • 经过两步或两步以上推导产生的左递归称为是 间接左递归 的

消除直接左递归

  • 将左递归转换成右递归

    • 消除左递归的一般形式
      • 消除左递归是要付出代价的——引进了一些非终结符和空产生式

消除间接左递归

消除左递归算法

       

提取左公因子

  • 通过改写产生式来 推迟决定,等读入了足够多的输入,获得足够信息后再做出正确的选择。

LL(1)文法

S_文法

  • 预测分析法的工作过程
    • 从文法开始符号出发,在每一步推导过程中根据当前句型的最左非终结符A和当前输入符号a,选择正确的A-产生式。为保证分析的确定性,选出的候选式必须是唯一的。
  • S_文法(简单的确定性文法)
    • 每个产生式的右部都以终结符开始
    • 同一非终结符的各个候选式的首终结符都不同
      • S_文法不含 空产生式

非终结符的后继符号集FOLLOW

  • 非终结符A的后继符号集
    • 可能在某个句型的中紧跟在A后面的终结符a的集合,即为 FOLLOW(A).
      • 如果A是某个句型的最右符号,则将结束符“”添加到FOLLOW(A)中

产生式的可选集

  • 产生式A->\beta的可选集是指可以选用该产生式进行推导时对应的输入符号的集合,记为SELECT(A->\beta)
  • q_文法
    • 每个产生式的右部或为空,或以终结符开始
    • 具有相同左部的产生式有 不相交的可选集
      • q_文法不含右部以非终结符打头的产生式

串首终结符集

  • 串首第一个符号,并且是终结符。简称首终结符
  • 给定一个文法符号串\alpha\alpha的串首终结符集FRIST(\alpha)被定义为可以从\alpha推导的所有串首终结符构成的集合。如果\alpha\Rightarrow\varepsilon,那么\varepsilon也在FIRST(\alpha)。

LL(1)文法

  • 同一非终结符的各个产生式的 可选集互不相交
  • 可以为LL(1)文法构建预测分析器.
  • 解释:
    • 第一个“L”表示 从左向右扫描输入
    • 第二个“L” 表示产生 最左推导
    • “1”表示 在每一步中只需向前看 一个 输入符号来决定语法分析动作。

附:目前学习到FIRST集和FOLLOW集,难度明显上升,有些概念需要反复回味翻阅书籍才能懂,建议多看视频和书籍进行学习,下次将学习这两个集合的计算

标签:文法,终结符,递归,推导,符号,day04,编译,句型,原理
From: https://blog.csdn.net/m0_74985290/article/details/141873023

相关文章

  • 【Redis】缓存击穿、缓存穿透、缓存雪崩原理以及多种解决方案
    一、前言在SpringCloud微服务集群项目中,客户端的请求首先会经过Nginx,Nginx会将请求反向代理到Gateway网关层,接着才会将请求发送到具体的服务service。在service中如果要查询数据,则会到缓存中查询,如果缓存未命中,再到数据库中查询数据。作为缓存的Redis扛住了系统......
  • 并行编程原理与实践-MPI实现快排
    并行编程原理与实践-MPI实现快排1.VS2022配置MPI环境可参考这篇博客:http://t.csdnimg.cn/T390g2.具体代码#include<mpi.h>#include<stdio.h>#include<stdlib.h>voidquicksort(int*array,intlow,inthigh);intpartition(int*array,intlow,inthigh);......
  • 初探编译链接原理
    初探编译链接原理bug最近因为遇到了一个有意思的bug,就去学习了一下编译链接原理,本篇博文记录学习过程中相关的一些思考。foo5.c/*$beginfoo5*//*foo5.c*/#include<stdio.h>voidf(void);intx=15213;inty=15212;intmain(){f();prin......
  • S-Clustr(影子集群) Simple SCC伪代码编译器,工业控制DSL结构语言,递归函数调用
    项目地址:https://github.com/MartinxMax/S-Clustr/releases200S-ClustrSimpleDSL语法内置函数示例RUN(启动设备)RUN:<ID>STOP(停止设备)STOP:<ID>TIME(MS延时)TIME:<Delay/Ms>函数示例DEF(定义函数名,空形参)DEFFunction:DEF(函数名,带形参)DEFFunction:var,......
  • Linux下makefile 编译项目
    1、规划makefile编写a、根目录下放三个文件:1、makefile:是咱们编译项目的入口脚本,编译项目从这里开始,起总体控制作用。2、config.mk:配置脚本,被makefile包含,单独分处理,为了应付一些可变的东西。3、common.mk:最核心的编译脚本,定义makefile编译规则,并且各个子目录中都用到这个来编译.......
  • 深度学习基础实践:理解Sigmoid激活函数原理和实现
    Sigmoid激活函数是一种广泛应用于机器学习和深度学习中的非线性函数,特别是在二分类问题中。它的作用是将一个实数值映射到(0,1)区间,使得输出可以被解释为概率值,这在处理二分类问题时非常有用。Sigmoid函数的定义Sigmoid函数的数学表达式为:......
  • 买药秒送 JADE动态线程池实践及原理浅析
    一、背景及JADE介绍买药秒送是健康即时零售业务新的核心流量场域,面对京东首页高流量曝光,我们对频道页整个技术架构方案进行升级,保障接口高性能、系统高可用。动态线程池是买药频道应用的技术之一,我们通过3轮高保真压测最终初步确定了线程池的核心参数。但我们仍面临一些保障系统稳......
  • OpenTelemetry 实战:gRPC 监控的实现原理
    前言最近在给opentelemetry-java-instrumentation提交了一个PR,是关于给gRPC新增四个metrics:rpc.client.request.size:客户端请求包大小rpc.client.response.size:客户端收到的响应包大小rpc.server.request.size:服务端收到的请求包大小rpc.server.response.size:服务......
  • 【网络原理】Udp 的报文结构,保姆式教学,快速入门
    本篇会加入个人的所谓鱼式疯言❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言而是理解过并总结出来通俗易懂的大白话,小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.......
  • Linux内核的栈回溯dump_stack原理
    浅析ARMv8体系结构:Aarch64过程调用标准_aarch64-64-little(重磅原创)冬之焱:谈谈Linux内核的栈回溯与妙用-腾讯云开发者社区-腾讯云(tencent.com)ARM架构dump_stack实现分析(3.0printk%pS选项实现)测试程序:#include<stdio.h>intA(inta){}intB(){ inta=5; A(a);......