国外精选视频:编译原理入门3

语法分析

该阶段的目的是为了发现已标记化(已分词)程序中的任何语法错误,语法错误是指那些破坏变成语言规则的内容

分析程序的语法就像检查用英语写的简单句子是否具有语义
在这里插入图片描述
这句话是有效的,因为它符合某种规定
在我们对一个已标记(已分词)的程序应用编程语言的语法规则之前,这个特定语言的语法必须已经通过某种方式被定义完毕
他需要以一种大家认可的方式写下来

在程序的定义语言中,通常是使用一种称为上下文无关语言系统来完成,BNF(巴科斯范式),被广泛的用于对上下文无关语法的描述

在这里插入图片描述
这里使用分隔符来分割这些可选择的结构形式,这种也是我们平时写代码时运用的规则

在这里插入图片描述
在这个特定的语言中,一个条件是由两个表达式和一个关系操作符组成的

在这里插入图片描述
用于特定编程语言的语法分析器通常会在其代码的逻辑中实现相关的上下文语法,编译器是不会使用BFN

在这里插入图片描述
对于一个高级程序来说,它的各种结构和构造可以使用解析树的节点和分支来做中间表示

在这背后,解析树是一种基于临时内存的结构,其中每一个节点都可以作为一个类实例来实现

解析器检查来自词法分析器的每个token(词法分析得到的那些元素),然后分辨出他们是什么类型的token,每个token都会以编程方式进行分析,每个token都会在语法的设计实现工程中进行调用,接着,词法单元信息会被插入分析树上合适的位置

在构建分析树的过程中,解析器会检查语言的语法是否已在源码中正常使用
例如,如果If关键字后面没有跟上一个符合语法定义的有效条件,或者end if 关键字缺失,那么就会生成一条错误信息,然后编译失败,编译器还会检查标识符是否正确,例如,变量名称要以字母为首,括号和引号要记得成对使用,所谓的,递归下降解析器,将自顶向下构建解析树
解析树也称为具体语法树,因为它包含词法分析器提供的几乎素有信息以及解析器识别的token的语法定义
如果你查看整棵树的叶子结点,在这些杂乱的语法中你可以看到我们的源码片段
在这里插入图片描述
在构造一棵解析树期间进行的语法检查是有限的。

对一个英文句子进行意思分析的过程被称为语义分析

Semantic Analysis

在这里插入图片描述
在这里插入图片描述
对于局部变量和参数内存地址会基于程序执行的栈起始位置进行相对偏移量的偏移,编译器实现无法确定要占用多少空间,所以内存必须要进行动态分配,这个过程是在运行时发生的,被动态分配的标识符通常分配给一块被称为堆的内存区域,当然,变量究竟会在物理内存中的哪个位置,取决于程序运行时所在的操作系统,因为在编译过程的所有阶段都会频繁访问和修改符号表,那么符号表就需要使用一种可以允许快速访问的数据结构来实现,遗传你,符号表通常用哈希表来实现,每个符号都可以用作Hash函数的Key,并且符号的各种属性(比如一条记录或者一个对象的属性)都可以保存在Hash table中,有些编译器用有序线性list实现符号表,可以使用二分查找

逆波兰式:不需要括号编译

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

向上Claire

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值