LL(1)分析算法
//在现代编译器的架构上,词法分析器都是作为语法分析器的一个子模块来实现的,并不是这些记号流一
次性全都调用出来了,而是说,根据语法分析器需要,当它需要一个记号流,才会调用,然后返回一个记
号流。下次调用,下次再返回,这样的一个交互式的过程。
定义:
从左( L) 向右读入程序,最左( L) 推导,采用一个( 1) 前看符号(lookhead,这个前看符号是用来作辅助判断用的,也就是说这个前看符号就是用来查LL(1)分析表的)
优点:
分析高效(线性时间)
错误定位和诊断信息准确
有很多开源或商业的生成工具(ANTLR,。。。)
算法基本思想:
表驱动的分析算法
表驱动的LL分析器架构
回顾:自顶向下分析算法
tokens[]; // all tokens——本质上它是程序中输入的所有的记号
i=0;
stack = [S] // S是开始符号
while (stack != [])
if (stack[top] is a terminal t)
if (t==tokens[i++])
pop();
else backtrack();//回溯
else if (stack[top] is a nonterminal T)
pop();
push(the next right hand side of T)
LL(1)分析法
//LL(1)分析算法本质上,就是用栈来显示地实现非递归版本的递归下降分析,或者说非递归版本的树的遍历的一个过程。
LL(1)分析表
LL(1)分析流程
FIRST集
FIRST集的不动点算法
把FIRST集推广到任意串上
构造LL(1)分析表
LL(1)分析表中的冲突
一般条件下的LL(1)分析表构造
NULLABLE集合
NULLABLE集合算法
FIRST集合的完整计算公式
FIRST集的不动点算法
FIRST集计算示例
FOLLOW集的不动点算法
FOLLOW集计算示例
计算FIRST_S集合
示例:构造FIRST_S集
示例:构造LL(1)分析表
LL(1)分析器
//2017-05-16更新
LL(1)分析表中的冲突解决方法
1.消除左递归
2.提取左公因式