编译原理之语法分析(第三篇)

一、语法分析

1.语法分析器的任务

记号流--------->语法分析器-------->语法树

语法树的构建

if (x>5)
	y="hello";
else
	z=1;

语法树
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210425102209645.png

2.语法分析–上下文无关文法

上下文无关文法是描述程序语言语法的强有力的数学工具

乔姆斯基文法体系

3型文法:正则文法:词法结构
2型文法:上下文无关文法:语法结构
1型文法:上下文有关文法
0型文法:任意文法
每一个外部文法(大圈)都比内部文法(小圈)表达能力强

举个自然语言处理的例子
自然语言中的句子的典型结构
主语 谓语 宾语
名词 动词 名词
例子:
名词:{羊, 老虎, 草, 水}
动词:{吃, 喝}
句子:
羊 吃 草
羊 喝 水
老虎 吃 老虎
草 吃 老虎

对这个例子,我们进行形式化分析:

(S表示句子,->表示推出,N表示名词,V表示动词)

S -> N V N 
N -> s(sheep) | t(tiger) | g(grass) | w(water)
V -> e(eat) | d(drink)

我们将其中的大写符号叫做非终结符:{S, N, V}
将小写的符号(单个字符或连续字符或+ 、*等)(名词+谓词)叫做终结符:{s, t, g, w, e, d}
开始符号是:S
上下文无关文法
上下文无关文法 G 是一个四元组:

在这里插入图片描述
对于之前给出的上下文无关文法的例子

S -> N V N 
N -> s | t | g | w
V -> e | d

在这里插入图片描述

最左推导和最右推导

最左推导:每次总是选择最左侧的符号进行替换
即对于上例中的 N V N ,首先替换最左边的 N, 再替换之后最左侧的非终结符 V, 最后替换最有一个非终结符 N
最右推导:每次总是选择最右侧的符号进行替换
原文链接:https://blog.csdn.net/qq_37236745/article/details/83540187

3.分析树和二义性

分析树

  • 推导可以表达成树状结构
    和推导所用的顺序无关(最左、最有、其他)

  • 特点:
    树中的每个内部节点代表非终结符
    每个叶子节点代表终结符
    每一步推导代表如何从双亲节点生成他的直接孩子节点

    为了更好的表示,看一下这个例子

E -> num
   | id
   | E + E
   | E * E
   推导出3+4*5的这个句子
E -> E + E 《最左推导 》
  -> 3 + E
  -> 3 + E * E
  -> 3 + 4 * E
  -> 3 + 4 * 5
     

在这里插入图片描述

分析树的含义取决于树的后序遍历

二义性文法

  • 给定文法G,如果存在句子s,他有两颗不同的分析树,那么称G为二义性文法
  • 从编译器的家督,二义性文法存在的问题:
    同一个程序会有不同的含义
    因此程序运行的结果不唯一
  • 解决方案: == 文法的重写==
表达式文法的重写

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值