自上而下
终结符和非终结符
- 单词符号,称为终结符,(不可再分
- 语法单位称为非终结符,(可再分,能出现再上下无关文法左边
- 产生式:<> -> <><>
- 开始符号只能是非终结符
直接推导
=>表示只需要一步的直接推导,
推导
a=>b=>c,
a到c是一个推导,要很多步
句型,句子,语言
- 文法G所产生句子的全体称为语言L(G)
- 句型终结符和非终结符
- 句子全是终结符
- 语言:就是句子的全体
语法树
产生二义性原因,有不同的语法树,产生的形态的句子
给定一个句子,判断他是否能由文法推出
- ①S->字符串
- ②语法树
语法分析方法
自上而下
递归(假设是左递归 )
- 直接左递归
- 转右递归
- 间接左递归
- 1.间接转直接
- 2.直接转右
- 消除左递归算法,这后面没化简,
- 1.对文法中的非终结符排序,(顺序随便
- 用前面的非终结符的产生式表示现在后面的非终结符
- 最后消除递归
回溯
- 消除回溯,提取公共因子
- 文法最左边右公共因子,
First集
First集是看产生式的开始符号后面紧跟的符号是什么,如果是终结符直接写在对应的First集合中多个或不管,连看,如果是非终结符,就要再对应的非终结里面找
follow集
follow集看右边(不是最右边,主要产生式右边有它就行),如A->BC Follow(C)其中找产生式后面有C的
- 首先开始Follw(符号)加个#
- \(A->\alpha B\)如果求Follow(B)其中B后面为空(就是B后面没又任何单词)将Follow(A)加入倒follow(B)中
- A-> \(\alpha B \beta\) B后不为空,
- 其中\(\beta\)是终结符,直接写,
- 如果\(\beta\)不是终结符,将first(\(\beta\))(减上空字符),加入到followB中,
- 如果\(\beta\)能推出空,那么就变成了第一个情况了
LL(1)
条件
- 先找能推出两种或以上的产生式,就是右边有或
然后构造LL(1)表
分析过程
递归下降算法
大概就是在开始符号开始,然后如果是终结符就移动指针,如果是非终结符就跳下个函数
procedure 开始符号;
begin
if sym ='(' then //就执行下面
begin
advance;//移动指针
T;//移动到T的开始符号,执行T去了类似函数,执行完T回来,说明执行完直到advance
if sym = ')' then advance else error
end
if sym = 'a' then//移动的是第二条a
begin
advance;
s'
end
else error
end
预测分析程序
构造分析表
构造分析表
- 先看first集合,如果first集合A能推出a就就a列写推出a的写下
- 如果first集合有空串,如A'的first集合有空串,那么将A'->\(\epsilon\)写到对应的follow列中
看是不是LL(1)文法
这里看有或的两个如上图,\(A'->AB|\epsilon\),那么看first(A)交集follow(A)如果是空集,属于
分析过程