前言
语法:语言学的一个分支,研究按确定用法来运用的"词类"、"词"的屈折变化或表示相互关系的其他手段以及词在句中的功能和关系。也就是说,语法的意义更多的是用来表达“词”的功能和属性
语法分析器:将词法分析程序所产生的的单词符号流作为输入串,按一定的规则分析检查是否构成合法的句子,(通俗的点说,在单词没有写错的基础上,检查单词组合是否出现问题)
自下而上分析的基本问题
- 自下而上分析,字面意思从语法树的底部向上分析(也即归约)至语法树的顶部,从而确定语法的正确性。
- 实现自下而上分析关键问题如何找到“可规约串”,如何判断栈顶的字符串的可归约性及与候选式匹配(自下而上分析是一边输入一边规约的),及实现如下效果:
- 一般对于句子的理解,都是由左向右开始解读,如同生活中阅读一样,同样语法分析只是模拟了这个过程,观察如下图的语法树,其语法为S->xAy,观察的过程即模拟语法分析器的工作过程,从最左边开始逐步向右分析。所以对于语法树能找到最左边的归约项是由为重要的,也即句柄,下面是关于句柄定义的介绍。
1)短语:对于文法S=>abc,若S=>aAc,且A=+>b,则称b是句型abc相对于非终结符A的短语(语法树中句型不含有”开叉“的非终结符)
2)直接短语:对于文法S=>abc,若S=>aAc,且A=>b,则称b是句型abc相对于非终结符A的短语
3)句柄:一个句型最左边的直接短语称之为句柄
运用句柄对句子进行规约:1,短语有,"x*y",”*“。直接短语,“*”,也即句柄。
2,当识别到“*”时与候选式A->*匹配规约,
3,规约后识别到字符串xAy时与候选式S->xAy进行匹配规约为S结束。
- 规范规约
a是文法G的一个句子,序列an......a0是a的一个规范规约
对于规范归约而言,最关键的就是确定一个句型的句柄,不同的寻找句柄的算法即不同的规范归约方法
PS:若文法G是无二意的,则规范退到的逆过程必然是规范归约。
算符优先分析
- 算符优先分析:规定算符(即终结符)之间的优先顺序和结合性质,借助这种关系寻找“可归约串”。
- 算符优先文法:一个文法,如果它的任一产生式的右部都不含有两个相继的非终结符,则我们称该文法为算符文法;实际上,真正的算法优先分析方法中,需定义任意两个相继出现的终结符a和b之间的优先关系,一旦确定了这种优先关系,就可以用它来确定“可规约串”进行归纳。
- 优先级关系
-
优先关系矩阵
- 构造集合FIRSTVT(P)
1)若有产生式P->a...或P->Qa...,则a属于FIRSTVT(p)
2)若a属于FIRSTVT(Q),且有产生式P->Q.....,则a属于FIRSTVT(P)
- 构造集合LASTVT(R)
1)若有产生式P->.....a或P->.....aQ,则a属于LASTVT(P)
2)若有a属于LASTVT(Q),且有产生式P->....Q,则a属于LASRTVT(P)
- 构造优先表
1)a同级b,找出所有满足“同级”的终结符对
2)a优于b,a劣于b:找出满足“优于”和“劣于”的终结符对
(PS:千万别晕,目的都是为了构造ab,或者aQb)
3)“#”同级“#”;“#”劣于FIRSTVT(开始符号);LASTVT(开始符号)优于“#”。
- 素短语:至少含有一个终结符,并且除它自身之外不再含更小的素短语。(最左素短语即字面意思)
- 一个算符优先文法G的任何句型的最左素短语是满足如下条件:aj-1<Njaj....NiaiNi+1>ai+1
算法过程
- 通过判断移进的字符串是否满足最左素短语的条件进行归约
- 优先函数:利用使每个终结符θ对应两个优先函数f(θ),g(θ)来表达终结符之间的优先关系,从而实现算符优先分析算法。
优点:便于作比较运算,并且节省存储空间
缺点:原先不存在优先关系的两个终结符,由于与自然数相对应变成可比较的,因而可能会掩盖输入串的某些错误