LL(1)分析算法

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.提取左公因式

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值