Stanford哈工大 编译原理

2024-04-07 19:58

本文主要是介绍Stanford哈工大 编译原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1 introduction to compilers
  • 2 Lexical analysis
    • 2.1 regular language & formal language(P9+P10+P11)
  • 3 Parsing(P18)
    • 3.1 CFG: context-free grammar(P19+P20)
    • 3.2 derivation: 派生、推导(P20)
  • 4 Semantic analysis(P42)
    • 4.1 scope(P43)
    • 4.2 symbol tables(P44)
  • 6 语法分析
    • 6.1 预测分析法
    • 6.2 算符优先分析法
  • 7 语义分析

1 introduction to compilers

https://lagunita.stanford.edu/courses/Engineering/Compilers/Fall2014/info

  • compiler: offline
  • interpreter: online, 程序每次都要重新解释
    the structure of compiler
  1. lexical analysis 词法分析:divide program text into words or tokens
  2. parsing 语法分析:分清主语谓语
  3. semantic analysis 语义分析
  4. optimization
  5. code generation

COOL: classroom object oriented language

2 Lexical analysis

  • classify program substrings according to role
  • communicate tokens to the parser
    token记号标志: identifier标识符, keywords, (), number, whitespace
    在fortan中空格可以忽略,这会导致关键词和变量名不容易区分

2.1 regular language & formal language(P9+P10+P11)

The regular expressions over Σ \Sigma Σ are the smallest set of expressions including.

  • union并集
  • concatenation交集
  • iteration
    在这里插入图片描述
    Let Σ \Sigma Σ be a set of characters (an alphabet). A language over Σ \Sigma Σ is a set of strings of characters drawn from Σ \Sigma Σ.
    在这里插入图片描述

lexical specification:
rugular languages are a language specification语言规范

3 Parsing(P18)

parser output: parser tree

3.1 CFG: context-free grammar(P19+P20)

可以参考https://blog.csdn.net/qq_37171771/article/details/79342819

  1. Begin with a string with only the start symbol S
  2. Replace any non-terminal X in the string by the right-hand side of some production X->Y1…Yn

3.2 derivation: 派生、推导(P20)

a derivation can be drawn as a tree

  • start symbol is the tree’s root
  • for a production X->Y1Y2…Yn, add children Y1Y2…Yn to node X

4 Semantic analysis(P42)

4.1 scope(P43)

The scope of an identifier is the portion of a program in which that identifier is accessible

  • static scope(静态作用域): depends on the program text, not run-time behavior
  • dynamically scoped: depend on execution of the program

4.2 symbol tables(P44)

a symbol table is a data structure that tracks the current bindings of identifiers
for a simple symbol table we can use a stack


6 语法分析

  • 最右推导:每次选择句型的最右非终结符进行替换
    在自底向上的分析中,总是采用最左规约的方式,所以最左规约称为规范归约,最右推导称为规范推导
    自顶向下的语法分析采用最左推导方式
  • 递归下降分析:由一组过程组成,每个过程对应一个非终结符
  • 预测分析:是递归下降分析的一个通过在输入中向前看固定个数符号来确定正确的产生式,预测分析不需要回溯,是一种确定的自顶向下分析方法
  • 含有 A − > A α A->A\alpha A>Aα形式产生式的文法称为直接左递归
  • S文法(简单的确定性文法):每个产生式的右部都以终结符开始,同一非终结符的各个候选式的首终结符都不同,这就要求S文法不含 ϵ \epsilon ϵ
  • 非终结符A的后继符号集:可能在某个句型中紧跟在A后边的终结符a的集合,记为FOLLOW(A)
  • 产生式的可选集:产生式 A − > β A->\beta A>β的可选集指可以选用该产生式进行推导时,对应的输入符号的集合,记为 S E L E C T ( A − > β ) SELECT(A->\beta) SELECT(A>β)
  • q文法:每个产生式的右部或为 ϵ \epsilon ϵ,或以终结符开始,而且具有相同左部的产生式具有不相交的可选集
  • 串首终结符:串首的第一个符号,并且是终结符,简称首终结符
  • 给定一个文法符号串 α \alpha α α \alpha α的串首终结符集 F I R S T ( α ) FIRST(\alpha) FIRST(α)定义为可以从 α \alpha α推导出的所有串首终结符构成的集合
  • 对于产生式 A − > α A->\alpha A>α的可选集SELECT
    如果 ϵ ∉ F I R S T ( α ) \epsilon \notin FIRST(\alpha) ϵ/FIRST(α),那么 S E L E C T ( A − > α ) = F I R S T ( α ) SELECT(A->\alpha)=FIRST(\alpha) SELECT(A>α)=FIRST(α)
    如果 ϵ ∈ F I R S T ( α ) \epsilon \in FIRST(\alpha) ϵFIRST(α),那么 S E L E C T ( A − > α ) = F I R S T ( α ) ∪ F O L L O W ( A ) SELECT(A->\alpha)=FIRST(\alpha) \cup FOLLOW(A) SELECT(A>α)=FIRST(α)FOLLOW(A)

6.1 预测分析法

在这里插入图片描述

  • 递归的预测分析法:在递归下降分析中,编写每一个非终结符对应的过程时,根据预测分析表进行产生式的选择
  • 非递归的预测分析法:不需要为每个非终极符编写递归下降过程,而是根据预测分析表构造一个自动机,也叫表驱动的预测分析
  • 预测分析法的实现步骤:
  1. 构造文法
  2. 改造文法
  3. 求变量的FIRST集和FOLLOW集,从而求得SELECT集
  4. 如果是LL(1)文法,则构造预测分析表
  5. 对于递归的预测分析,根据预测分析表为每个非终结符编写一个过程;对于非递归的预测分析,实现表驱动的预测分析算法
  • 句柄:每次规约的符号串
  • 规范句型:最右推导每次得到的句型
  • LR文法:对输入进行从左到右的扫描,反向构造出一个最右推导序列
    如果LR(0)分析表中没有语法分析动作冲突,那么给定的文法称为LR(0)文法,不是所有的上下文无关文法是LR(0)文法
  • 增广文法:如果G是一个以S为开始符号的文法,则G的增广文法G’就是在G中加上新开始符号S‘和产生式S’->S而得到的文法
    引入新的开始产生式的目的是使得文法开始符号仅出现在一个产生式的左边,从而使分析器只有一个接收状态
  • 项目集闭包:所有等价的项目组成的项目集,每个项目集闭包对应着自动机的一个状态
  • SLR分析法:简单的考察下一个输入符号b是否属于与规约项目 A − α A-\alpha Aα相关联的FOLLOW(A)
    问题在于,在特定位置,A的后继符集合是FOLLOW(A)的子集

6.2 算符优先分析法

  • 简单优先分析法:PDA读入一个单词后,比较栈顶符号和该单词的优先级级,以决定是入栈还是规约
  • 算符优先分析法:优先表里只有非终结符之间的优先关系,节省了空间
  • 算符文法:给定上下文无关文法G,若G中所有产生式右部都不包含两个相继的非终结符,则G是算符文法

7 语义分析

这篇关于Stanford哈工大 编译原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/883528

相关文章

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO