编译原理(八)——LL(1)语法分析

一、LL(1)语法分析原理

在这里插入图片描述
LL(1)文法定义中的条件是为了满足选择规则时的唯一性,在我们选择规则的时候只能选择其中的一条规则进行推导,依据这样的思想构造的语法分析程序叫做LL(1)语法分析程序
在这里插入图片描述
替换就是直接使用右部代替左部,而待判断字符串不变
匹配需要分析栈和字符串同时改变

整个语法分析器的结构:

stack就是所谓的栈,栈顶是X1,分析的对象是输入流,这是我们用到的两个分析对象:VT是终极符集合(Terminal),非终极符集合。
在这里插入图片描述

二、LL(1)分析表的构造

终极符VT里还要增加一个#,竖着写非终极符,横着写终极符。

在这里插入图片描述
给每个文法规则编号,随便编,然后在E的predict集中有某个终极符的框框里填文法规则的编号,没有的地方空着就行
在这里插入图片描述

三、驱动程序设计

初始格局的S是初始状态,后面是带匹配的字符串
一般格局是指驱动程序执行一段时间之后,当前的结果状态。前面是根据文法规则推导出来的一些短语,后面是前面已经被部分匹配掉的字符串。
每步的分析:
如果X1,最开头的元素是终极符就要和待比较字符串进行匹配,匹配成功就从两个列表中把它们去掉
如果不是终极符,根据当前文法规则使用右部代替左部,注意这里涉及到压栈顺序的问题
最后只剩两个#则成功,否则报错还要提供相关的错误信息。
在这里插入图片描述
在这里插入图片描述

四、注意问题

在这里插入图片描述

五、相关例题

满足LL(1)文法分析的条件
  1. 没有公共前缀
A->aB|aC|aj|a
这些项都有一个共同的左公共因子,可以把它提取出来
(和数学中提取公因式相同,如果最后一个是a的话,提取出来剩一个null)
A->aA'
A'->B|C|j|null
  1. 消除左递归
    左递归有两种:直接左递归和间接左递归
1. 直接左递归
A->Aa|b
消除方法:
A->bA'
A'-> aA'|null(不要忘了这个null)
2. 间接左递归
A->Bb
B->Aa
先转换成直接左递归,就将B->Aa代入到上面的式子中即可
A->Aab
然后利用化简直接左递归的方法进行化简。

即按照LL(1)文法的定义来进行判断,如果两个推出的predict集有交集就不符合LL(1)文法
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值