【编译原理】第三章语法分析

语法分析

根据词法单元的构成规则,对源代码文件的字符流进行了词法分析,由词法单元的模式 → 正则表达式 → DFA → 词法

语法分析就是根据一个个单词,让它们组成逻辑关系,语言规约是上下文无关语法

要进行语法分析,输入的是词素流,类似于这样,这是之前词法分析得到的结果

image-20220314123504308

如何进行语法分析?

先引入一个概念,文法

文法

算术表达式文法

我们都知道算术表达式是什么,就是一个式子,式子和式子之间也能构成新的式子。算术运算表达式文法的构成因此有:

① E →num
② E →id
③ E →F
④ E →( E )
⑤ E →E / E
⑥ E →E * E
⑦ E →E - E
⑧ E →E + E

E代表算术表达式,num和id就不用多说了,代表数字和变量

image-20220314124230387image-20220314124251698

语句的文法

上面引入了算术表达式文法,程序有很多的语句构成,一条语句的文法包含什么语句?

① S →T id ( L ) { Q } 函数实现语句
② S →T L; 变量定义语句
③ S →L = E; 赋值语句
④ S →while ( B ) Q while语句
⑤ S →return E 函数返回语句
⑥ S →return; 函数返回语句

程序的文法

最核心的部分,说明的一个程序的文法构成,下面讲解的

① P →Q 程序有语句序列构成
② Q →Q S 语句序列可以由语句序列和单个语句构成
③ Q →S 一个语句序列也可以只有由单个语句
④ Q →{ Q } 语句序列可以由{}括起来
⑤ S →T id ( L ) { Q }
⑥ S →T L;
⑦ S →L = E;
⑧ S →while ( B ) Q
⑨ S →return E;

P代表程序,Q代表语句序列,S代表单个语句,T代表预定义符,B代表逻辑表达式,E代表算术表达式,还有V,L,F…

语法分析树

语法分析的目标是验证词素流是否符合语法规则

语法分析树,很好的表现了语法的构成逻辑以及之后处理的过程

已知语言的文法,给定一个词素串,判定它是否符合文法,符合的话,得出语法分析树

语法分析的方式有自顶向下的语法分析:最左推导,最右推导,还有自底向上的语法分析

image-20220314133046683

下面是词法分析和语法分析的区别,加深理解

image-20220314132545916


2022/3/19更新,重要的是推导过程

上下文无关文法

对词法分析后的源程序:输入串(符号串);验证输入串符合文法吗?

不符号的话,就说明源程序有语法错误;输入串:id + id

符合的话,推导出输入串的语法分析树

语法分析分类两种方式:

  • 自顶向下的语法分析:最左推导,最右推导
  • 自底向上的语法分析

算术表达式的上下文无关文法举例(带优先级)

image-20220319165543429 image-20220319165915749

开始符号:树根非终结符号:E, T,F
终结符号:+,*,(,),id
产生式:从左到右:推导,分析;
从右到左:规约,归纳;

基于文法的推导

从根往下,任用产生式,进行细化的过程,直至树的叶结点不含非终结符号,仅含终结符号

自顶向下的语法分析,最右推导,以id +id *id为例

image-20220319170111544 image-20220319170129345

推导是从输入串的最右端(即末尾)开始逐一来匹配:不切实际

image-20220319170645585

自顶向下的语法分析,最左推导,以id +id *id为例

image-20220319170233237 image-20220319170242389

推导是从输入串的最左端(即起始)开始逐一来匹配:切合实际

image-20220319170730315

推导后:树中的叶结点,从左至右,组成的符号串,叫句型;如果句型中不含非终结符号,自然只含终结符号,那么就叫句子

文法就是所有句子的集合

最后是文法和正则表达式比较,用正则表达式表达的,用文法都能表达,但是括号配对的语法,正则表达式无法表达;但是文法语法树中出现了很多非终结符,效率比正则表达式低

如果写得不错就麻烦点个赞吧👍,个人博客网站http://www.liangyuanshao.top

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
这个里面的都是测试数据,总共得分5分。从控制台输入,不能从文件中读取。实现了基本功能,加分项目都没有去实现,没有函数数组这些的实现。这是用C++语言写的,新建parser类别要选C++,其他对于VS的配置和C语言一样。for语句用的是枚举所有情况,你可以自行修改。 对预备工作中自然语言描述的简化C编译器的语言特性的语法,设计上下文无关文法进行描述 借助Yacc工具实现语法分析器 考虑语法树的构造: 1.语法树数据结构的设计:节点类型的设定,不同类型节点应保存哪些信息,多叉树的实现方式 2.实现辅助函数,完成节点创建、树创建等功能 3.利用辅助函数,修改上下文无关文法,设计翻译模式 4.修改Yacc程序,实现能构造语法树的分析器 考虑符号表处理的扩充 1.完成语法分析后,符号表项应增加哪些标识符的属性,保存语法分析的结果 2.如何扩充符号表数据结构,Yacc程序如何与Lex程序交互,正确填写符号表项 以一个简单的C源程序验证你的语法分析器,可以文本方式输出语法树结构,以节点编号输出父子关系,来验证分析器的正确性,如下例: main() { int a, b; if (a == 0) a = b + 1; } 可能的输出为: 0 : Type Specifier, integer, Children: 1 : ID Declaration, symbol: a Children: 2 : ID Declaration, symbol: b Children: 3 : Var Declaration, Children: 0 1 2 4 : ID Declaration, symbol: a Children: 5 : Const Declaration, value:0, Children: 6 : Expr, op: ==, Children: 4 5 7 : ID Declaration, symbol: a Children: 8 : ID Declaration, symbol: b Children: 9 : Const Declaration, value:1, Children: 10: Expr, op: +, Children: 8 9 11: Expr, op: =, Children: 7 10 12: if statement, Children: 6 11 13: compound statement, Children: 3 12

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小梁说代码

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

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

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

打赏作者

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

抵扣说明:

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

余额充值