语法分析——LL(1) 分析算法

前言:LL(1) 分析算法,是一个经典的自顶向下的语法分析算法

0X00 解释为什么叫做 LL(1)

从左(L)向右读入程序,最左(L)推导,采用一个(1)前看符号。所以就叫做 LL(1)

LL(1) 是一个自顶向下的语法分析算法,算法的基本思想是:表驱动的分析算法

0X01 算法伪代码

tokens[]; // all tokens
i=0;
stack = [S] // S是开始符号
while (stack != []) {
    // 这里给 t 赋值了
    if (stack[top] is a terminal t) {
        if (stack[top] == tokens[i++]) {
            pop();
        } else {
            error();
        }
    } else if (stack[top] is a nonterminal T) {
        // 这里给 T 赋值了
        pop(); 
        push(the correct table[N, T]);
    }
}

0X02 结合具体例子解释伪代码

假设有这么一个规则:

由这一个规则可以得到一个表(怎么得来的,后面再详细说):

假设有这么一段输入:gdw

一开始的栈结构如下,

|_S_|

S 不是终结符,将表中 (S, g) 对应的规则 0 推入栈中,此时栈为:

|_N1__|
|__V__|
|_N2__|

N1 不是终结符,将 (N1, g) 对应的规则 3 推入栈中,此时栈为:

|__g__|
|__V__|
|_N2__|

g 是终结符,此时 i = 0,token[i++] = g 所以不报错,此时栈为:

|__V__|
|_N2__|

V 是不是终结符,将 (V, d) 对应的规则 6 压入栈中,此时栈为:

|__d__|
|_N2__|

...

最后检验没有出错。

接下来我们说说:这个表是如何生成的

0X02 FIRST 表

这个表叫做叫做 First 表,又叫做 LL(1) 分析表。由下面的这个关系转换得出

0X03 如何生成 FIRST 表

伪代码很简单(有缺陷):

foreach (nonterminal N)
    FIRST(N) = {}
while(some set is changing)
    foreach (production p: N->β1 … βn)
        if (β1== a …)
            FIRST(N) ∪= {a}
        if (β1== M …)
            FIRST(N) ∪= FIRST(M)

简单来说,就是并上字符以及并上非终结符的 FIRST 表

0X04 上述代码的缺陷

假如我们有这么一个转换规则:

就会发现 (N,w) 有两条对应规则,所以最后我们得到的表是:

这样就又可能出现了「回溯」。

还有一种出现空集的情况:

X 可能为空,Y 可能为空,又出现了回溯的情况。

接下来我们将讨论一般情况下的 FIRST 表的生成

0X05 一般情况下的 FIRST 表的生成——解决空集问题

首先定义:可以为空的非终结符属于 NULLABLE 集合

NULLABLE 集合就是所有可以为空的非终结符,有的直接可以空,有的可以再推导以后可以为空

用数学的方法表示一个非终结符是否为空:

计算 NULLABLE 集合——伪代码

NULLABLE = {};
while (NULLABLE is still changing)
    foreach (production p: X-> β)
        if (β== NULL)
            NULLABLE ∪= {X}
        if (β == Y1 … Yn)
            if (Y1 in NULLABLE && … && Yn in NULLABLE)
                NULLABLE  ∪ = {X}

计算 NULLABLE 集合——举个例子

首先可以看出 Y in NULLABLE

对与 X 可以写出:

X -> Y,由于 Y in NULLABLE,所以 X in NULLABLE

对于 Z 可以写出

Z -> X Y Z,所以 Z 不是

0X06 一般情况下的 FIRST 表的生成——冲突的处理

我们来看下面这个例子,思考产生冲突的原因一:

假如有这么一条规则:

0: E -> Eb
1:    -> a

就一定会产生冲突,比如第 0 条产生式就可以写成:aaaaab,第 1 条生成式就可以写成 a,所以遇到 a 的时候 0, 1 都可以指

一定会冲突!

解决的办法就是:把左递归转换成右递归可以把上述有错的生成式写成:

0: E -> aE1
1: E1 -> aE1
2:       -> b
3:       -> 

另外一种消除冲突的方法是提取左公因子,比如有以下文法:

0: E -> ab
1:    -> ac

我们可以写成:

0: E -> aE1
1: E1 -> b
2:       -> c

0X07 一般情况下的 FIRST 表的生成——伪代码

至此,我们就可以写出一般情况下的 FIRST 表的生成伪代码:

foreach (nonterminal N)
    FIRST(N) = {}
while(some set is changing)
    foreach (production p: N->β1 … βn)
        foreach (βi from β1 upto βn)
            if (βi== a …)
                FIRST(N) ∪= {a}
                break
            if (βi== M …)
                FIRST(N) ∪= FIRST(M)
                if (M is not in NULLABLE)
                    break

其实理解起来就是这个:

编译原理全部都是算法。。。写得我好累啊

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容

  • Unicode®标准附录#9 UNICODE双向算法#### 摘要#### 本附件是一份关于字符定位的规范,主要描...
    Eriice阅读 4,712评论 0 6
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,741评论 0 13
  • 自顶向下语法分析方法 什么叫确定:两个确定:①确定对最左的非终结符进行替换(最左推导)②对于同一个非终结符,确定一...
    getianao阅读 1,636评论 0 1
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,781评论 0 38