编译原理

编译原理之词法分析器(三)

你说的曾经没有我的故事 提交于 2019-12-05 17:10:19
上篇用了另一种方式构造词法分析,总体来说实现的过程比较明确,但是我们可以看到,上篇的分析仅仅只进行了少量的单词分析,如果将C语言中的32个保留字还有其他的操作符以及界限符加进入,其构造的状态机会异常的庞大,所以接下来将简化其状态机,使用查询匹配的方式,很明显这种方式有很大的确定,在该系列博客第一篇谈到,但是对于C语言这样的来说,构造完全的状态机太费事了,所以这也是一种取舍的方式。 下面是简化版的状态机,注意:该状态机只能区分单词的种类,单词的ID是通过遍历比较匹配得到的。 下面由于时间关系暂时先写到这,后面会继续写。 来源: https://www.cnblogs.com/listenscience/p/11935380.html

编译原理11 LL(1)文法的判断,递归下降分析程序

做~自己de王妃 提交于 2019-12-05 06:33:49
1. 文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不是 LL(1)文法? FIRST集 FIRST(AB)={b,a,c} FIRST(Da)={b,a} FIRST(ε)={ε} FIRST(cC)={c} FIRST(aADC)={a} FIRST(b)={b} Follow集 Follow(S)={c,b,a} Follow(A)={a,b,c,#} Follow(B)={a,b,c} Follow(C)={#} Follow(D)={#,a} Select集 Sellect(A->Da)={b,a} Sellect(A->ε)={a,b,c,#} 2.(上次作业)消除左递归之后的表达式文法是否是LL(1)文法? 1. SELECT(E'→+TE')∩SELECT(E'→ε)=∅         SELECT(T'→*FT')∩SELECT(T'→ε)=∅         SELECT(F→(E))∩SELECT(F→i)=∅ 所以是 LL(1)文法 2. SELECT(A'→ABe)∩SELECT(A'→ε)=∅ SELECT(B'→bB')∩SELECT(B'→ε)=∅ 所以是 LL(1)文法 3. SELECT(S'→BaS')∩SELECT(S'→ε)

LLVM编译原理和使用

你说的曾经没有我的故事 提交于 2019-12-05 06:16:34
LLVM 简介: LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。 LLVM最早的时候是Illinois的一个研究项目,主要负责人是Chris Lattner,他现在就职于Apple. Apple 目前也是llvm项目的主要赞助者之一。 在理解LLVM时,我们可以认为它包括了一个狭义的LLVM和一个广义的LLVM。广义的LLVM其实就是指整个LLVM编译器架构,包括了前端、后端、优化器、众多的库函数以及很多的模块;而狭义的LLVM其实就是聚焦于编译器后端功能(代码生成、代码优化、JIT等)的一系列模块和库。 LLVM 优势: 传统编译器分三个阶段: 前端(Frontend)-- 优化器(Optimizer)-- 后端(Backend) 前端负责分析源代码,可以检查语法级错误,并构建针对语言的抽象语法树(AST);抽象语法树可以进一步转换为优化,最终转为新的表示方式,然后再交给让优化器和后端处理; 最终由后端生成可执行的机器码。 llvm 也分三个阶段,但是设计上略微的有些区别, LLVM不同的就是对于不同的语言它都提供了同一种中间表示:

编译原理随堂作业十一-------LL(1)文法的判断

女生的网名这么多〃 提交于 2019-12-05 04:56:59
文法 G(S): (1)S -> AB (2)A ->Da|ε (3)B -> cC (4)C -> aADC |ε (5)D -> b|ε 验证文法 G(S)是不是 LL(1)文法. SELECT(A ->Da)=FIRST(Da)={b,a} SELECT(A ->ε)=FOLLOW(A)=FIRST(B) U FIRST(D) U FIRST(C) U FOLLOW(C)={c,b,a,#} SELECT(C -> aADC)=FIRST(aADC)={a} SELECT(C -> ε)=FOLLOW(C)={#} SELECT(D -> b)=FIRST(b)={b} SELECT(D -> ε)=FOLLOW(D)={a,#} 因为SELECT(A ->Da)与SELECT(A ->ε)的交集不为空集 所以文法 G(S)不是 LL(1)文法 2.法消除左递归之后的表达式文法是否是LL(1)文法? 消除左递归: E-->TE' E'-->+TE' | ε T-->FT' T'-->*FT' | ε F-->(E) | i SELECT(E'-->+TE' )=FIRST(+TE')={+} SELECT(E'-->ε )=FOLLOW(E')={#} SELECT(T'-->*FT' )=FIRST(*FT")={*} SELECT(T'-->ε )=FOLLOW(T')=

编译原理之消除左递归

核能气质少年 提交于 2019-12-04 12:05:57
1.将以下文法消除左递归,分析符号串 i*i+i 。 并分别求FIRST集、FOLLOW集,和SELECT集 E -> E+T | T T -> T*F | F F -> (E) | i 消除左递归: E -> TE' E' -> +TE' | ε T -> FT' T' -> *FT' | ε F -> (E) | i 分析i * i + i: FIRST集: FIRST(E)=FIRST(T)=FIRST(F)={(,i} FIRST(E’)= {+,ε} FIRST(E’)= {+,ε} FIRST(T’)={*,ε} FOLLOW集: FOLLOW(E)={),#} FOLLOW(E')=FOLLOW(E)={),#} FOLLOW(T)={+,),#} FOLLOW(T’)= FOLLOW(T)= {+,),#} FOLLOW(F)= {+,*,) ,#} SELECT集: SELECT(E -> TE')={(,i} SELECT(E' -> +TE')={+} SELECT(E' -> ε)={),#} SELECT(T -> FT')={(,i} SELECT(T' ->*FT' )={*} SELECT()={T' ->ε}={+,),#} SELECT( F -> (E))={(} SELECT()={F ->i}={i} 2.文法改写,并分别求FIRST集

编译原理第十次作业

柔情痞子 提交于 2019-12-04 11:53:06
1.将以下文法消除左递归,分析符号串 i*i+i 。 并分别求FIRST集、FOLLOW集,和SELECT集 E -> E+T | T T -> T*F | F F -> (E) | i 消除左递归 E->TE’ E’->+TE’ | ε T->FT’ T’->*FT’ | ε F->(E) | i 分析符号串i*i+i: first集:   FIRST(E)={ (, i }    FIRST(E')={+, ε}    FIRST(T)={ (, i }    FIRST(T')={ *, ε }    FIRST(F)={(,i} follow集:    FOLLOW(E)={ ),# }    FOLLOW(E')={ ),# }    FOLLOW(T)={+,),#}    FOLLOW(T')={+,),#}    FOLLOW(F)={*,+,),#} select集:    SELECT(E->TE')=FIRST(TE')={ (, i }    SELECT(E'->+TE')=FIRST(+TE')={+}    SELECT(E'->ε)=FIRST(ε)-{ε}UFOLLOW(E')=FOLLOW(E')={ ),# }    SELECT(T->FT')=FIRST(FT')={ (,i }    SELECT(T'->*FT')=FIRST(*FT'

编译原理 十

此生再无相见时 提交于 2019-12-04 09:43:08
1.将以下文法消除左递归,分析符号串 i*i+i 。 并分别求FIRST集、FOLLOW集,和SELECT集 E -> E+T | T T -> T*F | F F -> (E) | i 解: 消除左递归 E -> TE' E' -> +TE' | ε T -> FT' T' ->*FT' | ε F -> (E) | i FIRST集: FIRST(E)=FIRST(T)=FIRST(F)={(,i}FIRST(E’)= {+,ε}FIRST(E’)= {+,ε}FIRST(T’)={*,ε} FOLLOW集: FOLLOW(E)={),#} FOLLOW(E')=FOLLOW(E)={),#} FOLLOW(T)={+,),#} FOLLOW(T’)= FOLLOW(T)= {+,),#} FOLLOW(F)= {+,*,) ,#} SELECT集: SELECT(E -> TE')={(,i} SELECT(E' -> +TE')={+} SELECT(E' -> ε)={),#} SELECT(T -> FT')={(,i} SELECT(T' ->*FT' )={*} SELECT()={T' ->ε}={+,),#} SELECT( F -> (E))={(} SELECT()={F ->i}={i} 2.P101练习7(2)(3)文法改写,并分别求FIRST集

编译原理介绍

 ̄綄美尐妖づ 提交于 2019-12-04 09:04:55
什么是编译程序 把某一种语言程序(称为源语言程序)等价地转换 成另一种语言程序(称为目标语言程序)的程序 高级语言程序需要编译程序的翻译才能变成机器语言程序(目标程序),机器程序可以运行成为结果 编译程序: 1.诊断编译程序(Diagnostic Compiler) 2.优化编译程序(Optimizing Compiler) 3.交叉编译程序(Cross Compiler) 4.可变目标编译程序(Retargetable Compiler) 解释程序(Interpreter) 把源语言写的源程序作为输入,但不产生目标 程序,而是边解释边执行源程序 为什么要学习编译原理 理解计算系统 设计计算系统 训练计算思维(Computational Thinking) 计算思维基本概念 Jeannette M. Wing, Computational Thinking, Communications of ACM, Vol.49, No.3, 2006, pp.33-35. 被认为是近十年来产生的最具有基础性、长期性的 学术思想,成为21世纪计算机科学研究和教育的热 点 计算思维是运用计算机科学的基础概念去求解问题、 设计系统和理解人类的行为,它包括了一系列广泛 的计算机科学的思维方法 计算思维和阅读、写作和算术一样,是21世纪每个 人的基本技能,而不仅仅属于计算机科学家 计算思维在生物、物理

编译原理:消除左递归

≯℡__Kan透↙ 提交于 2019-12-04 08:03:54
1.将以下文法消除左递归,分析符号串 i*i+i 。 并分别求FIRST集、FOLLOW集,和SELECT集 E -> E+T | T T -> T*F | F F -> (E) | i 2.P101练习7(2)(3)文法改写,并分别求FIRST集、FOLLOW集,和SELECT集 课堂练习: 求以下文法的FIRST集、FOLLOW集和SELECT集。 S -> Ap A -> a | ε A -> cA A-> a A S -> Ap S -> Bq A -> a A -> cA B -> b B -> dB 来源: https://www.cnblogs.com/zhif97/p/11847133.html

编译原理 九

给你一囗甜甜゛ 提交于 2019-12-03 21:22:02
1.将DFA最小化:教材P65 第9题 答: 最小化结果: 2.构造以下文法相应的最小的DFA S→ 0A|1B A→ 1S|1 B→0S|0 答: 正规式: S->(01|10)(01|10)* NFA DFA状态转换矩阵 DFA 最小化 最小化结果 3.给定如下文法 G [ S ]: S → AB A → aA | ɛ B → b | bB 给出句子 aaab 的一个自顶向下语法分析过程,并说明回溯产生的原因是什么? 答: S->AB S->aAB S->aaAB S->aaaAB S->aaaB S->aaab 回溯产生原因: 反复提取公因子 4.P100 练习4,反复提取公共左因子,对文法进行改写。 S->C$ C->bA|aB A->aD|bAA B->bD|aBB D->ɛ|C 来源: https://www.cnblogs.com/huangwenshuo/p/11809486.html