编译原理与编译构造 课堂笔记9

DFA 转换表

例:

Ii a b
012
113
23
31

则由表的前两行得 I0aI1,I0bI2

大概代码如下

state = 0;
while(1) {
    ch = getchar();
    s = lookup(state, ch);
    if(s == ' ' && s is non-terminal state) {
        error;
    } else if(s == ' ' && s is terminal-state) {
        ungetchar();
        return;
    } else {
        state = s;
    }
}

Language By experience RE

  1. 逐步求精法
  2. FA-based

例:一个2进制数能被3整除,我们做出在某个数后面添加一个0/1后模3余的结果电路转换图

Markdown

语法分析

自上而下

递归下降分析法

一个非终结符对应一个子程序

若有以下文法:

SaA|bB

AcD|d

BeB|f

Dg

则有对应程序:

int S() {
    ch = getchar();
    if(ch == 'a') {
        return A();
    } else if(ch == 'b') {
        return B();
    } else {
        return 0;
    }
}
int A() {
    ch = getchar();
    if(ch == 'c') {
        return D();
    } else if(ch == 'd') {
        return 1; // 表示结束
    } else {
        return 0; // 表示出错
    }
}
// 其余同理

换一种文法:

SaA|aB

AAd|d

BBe|e

int S() {
    ch = getchar();
    if(ch == 'a') {
        if(A()) {
            return 1;
        } else {
            return B();
        }
    }
}

int A() {
    A();
    if(ch == 'd') {
        return 1;
    } else {
        return 0;
    }
}

在这种情况下会出现回溯和栈溢出

不能出现公共左子表达式和左递归,会出现回溯。

因此想用这种方法的话,对文法的要求比较高。

预测分析法

预处理:

提取最大公共左子表达式
消除左递归

把左递归变成右递归的形式

左递归:

  • 直接左递归: AAα|β
  • 间接左递归: ABα|β,BAβ|θ
消除直接左递归

AAα|ββ,βα,βα2,,βαn,βαn(n0)

αn=A ,则有 AβA,Aϵ|αA

消除间接左递归

SQc|cQRb|bRSa|a

此时有间接左递归

我们强行规定优先级: S>Q>R

SQc|cQRb|bRSa|a(Qc|c)a|aQca|ca|a(Rb|b)ca|ca|aRbca|bca|ca|a

此时由消除直接左递归的方法得, R(bac|ca|a)RRbcaR|ϵ

先消除直接左递归,再消除间接左递归

SQc|cQQd|Rb|bRSa|a

Q(Rb|b)QQdQ|ϵ

SQRSQc|cQ(Rb|b)QQdQ|ϵR(Qc|c)a|aQca|ca|a(Rb|b)Qca|ca|aRbQca|bQca|ca|a

此时再用消除直接左递归的方法再消除一下就好了

1.1 编译器概述.flv 1.2 编译器结构.flv 1.3 编译器实例.flv 2.1 词法分析的任务.flv 2.2.1 词法分析器的手工构造1.flv 2.2.2 词法分析器的手工构造2.flv 2.2.3 词法分析器的手工构造3.flv 2.3.1 正则表达式1.flv 2.3.2 正则表达式2.flv 2.3.3 正则表达式3.flv 2.3.4 正则表达式4.flv 2.4.1 有限状态自动机1.flv 2.4.2 有限状态自动机2.flv 3.1.1 RE转换成NFA:Thompson算法1.flv 3.1.2 RE转换成NFA:Thompson算法2.flv 3.1.3 RE转换成NFA:Thompson算法3.flv 3.2.1 NFA转换成DFA:子集构造算法1.flv 3.2.2 NFA转换成DFA:子集构造算法2.flv 3.2.3 NFA转换成DFA:子集构造算法3.flv 3.2.4 NFA转换成DFA:子集构造算法4.flv 3.3.1 DFA的最小化:Hopcroft算法1.flv 3.3.2 DFA的最小化:Hopcroft算法2.flv 3.3.3 DFA的最小化:Hopcroft算法3.flv 3.4.1 从DFA生成分析算法1.flv 3.4.2 从DFA生成分析算法2.flv 3.4.3 从DFA生成分析算法3.flv 4.1.1 语法分析的任务1.flv 4.1.2 语法分析的任务2.flv 4.1.3 语法分析的任务3.flv 4.2.1 上下文无关文法和推导1.flv 4.2.2 上下文无关文法和推导2.flv 4.2.3 上下文无关文法和推导3.flv 4.2.4 上下文无关文法和推导4.flv 4.2.5 上下文无关文法和推导5.flv 4.3.1 分析树和二义性文法1.flv 4.3.2 分析树和二义性文法2.flv 4.3.3 分析树和二义性文法3.flv 4.3.4 分析树和二义性文法4.flv 4.4.1 自顶向下分析1.flv 4.4.2 自顶向下分析2.flv 4.4.3 自顶向下分析3.flv 4.4.4 自顶向下分析4.flv 4.5.1 递归下降分析算法1.flv 4.5.2 递归下降分析算法2.flv 4.5.3 递归下降分析算法3.flv 4.5.4 递归下降分析算法4.flv 5.1.1 LL(1)分析算法1.flv 5.1.2 LL(1)分析算法2.flv 5.1.3 LL(1)分析算法3.flv 5.1.4 LL(1)分析算法4.flv 5.1.5 LL(1)分析算法5.flv 5.1.6 LL(1)分析算法6.flv 5.1.7 LL(1)分析算法7.flv 5.1.8 LL(1)分析算法8.flv 5.2 LL(1)分析的冲突处理.flv 5.3.1 LR(0)分析算法1.flv 5.3.2 LR(0)分析算法2.flv 5.3.3 LR(0)分析算法3.flv 5.3.4 LR(0)分析算法4.flv 5.4 SLR分析算法.flv 5.5 LR(1)分析算法.flv 5.6.1 LR(1)分析工具1.flv 5.6.2 LR(1)分析工具2.flv 5.6.3 LR(1)分析工具3.flv 6.1.1 语法制导翻译1.flv 6.1.2 语法制导翻译2.flv 6.1.3 语法制导翻译3.flv 6.2.1 语法制导翻译的实现原理1.flv 6.2.2 语法制导翻译的实现原理2.flv 6.3.1 抽象语法树1.flv 6.3.2 抽象语法树2.flv 6.3.3 抽象语法树3.flv 6.3.4 抽象语法树4.flv 6.4.1 抽象语法树的自动生成1.flv 6.4.2 抽象语法树的自动生成2.flv 7.1.1 语义分析的任务1.flv 7.1.2 语义分析的任务2.flv 7.1.3 语义分析的任务3.flv 7.2.1 语义规则及实现1.flv 7.2.2 语义规则及实现2.flv 7.2.3 语义规则及实现3.flv 7.2.4 语义规则及实现4.flv 7.3.1 符号表1.flv 7.3.2 符号表2.flv 7.3.3 符号表3.flv 7.4 语义分析中的其它问题.flv
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值