编译器架构Compiler Architecture(上)

编译器是程序,通常是非常大的程序。它们几乎都有一个基于翻译分析综合模型的结构。

CONTENTS

Overview • Compiler Components • Lexical Analysis (Scanning) • Syntax Analysis (Parsing) • Combining Scanning and Parsing • Semantic Analysis • Intermediate Code Generation • Machine Independent Code Improvement • Code Generation • Machine Dependent Code Improvement

Overview

编译器执行翻译。每一个非平凡的翻译都需要分析和综合:

分析和综合都是由内部相位组成的。

Compiler Components

以下是生成汇编语言或机器语言的生产编译器的主要功能组件(如果您只是针对C之类的高级语言或虚拟机,则可能没有那么多阶段):

还可以标识错误恢复子系统和符号表管理器。

You might also identify an error recovery subsystem and a symbol table manager, too.

Lexical Analysis (Scanning)

扫描器将源程序的字符流转换为令牌流。这样,它会像

删除评论

展开宏(如C语言),

检查缩进并创建INDENT和DEDENT标记,使用具有空格意义的语言,如Python和Haskell

删除空白(在考虑缩进和删除后)

An example in C:

#define ZERO 0

unsigned  gcd(   unsigned   int  // Euclid’s algorithm

x,unsigned   y) {   while ( /* hello */  x>   ZERO

){unsigned temp=x;x=y   %x;y  = temp ;}return y ;}

标记化为 gets tokenized into:

与扫描仪有关的问题包括:

区分大小写(或不敏感)

空白是否重要

新行是否重要

是否可以嵌套注释

扫描过程中可能出现的错误称为词法错误,包括:

遇到不在语言字母表中的字符

单词或行中的字符太多(是的,这种语言确实存在!)

未闭合的字符或字符串

注释中的文件结尾

Syntax Analysis (Parsing)

解析器将令牌序列转换为抽象语法树。对于上面的例子,我们得到这个树:

树也可以存储为字符串

(fundecl unsigned gcd
  (params (param unsigned x) (param unsigned y))
  (block
    (while
      (> x 0)
      (block (vardecl unsigned temp y) (= x (% y x)) (= y temp)))
    (return y)))

从技术上讲,AST中的每个节点都存储为一个带有命名字段的对象,其中许多字段的值本身就是树中的节点。注意,在编译的这个阶段,树肯定只是一棵树。没有循环。

在构造解析器时,需要关注语法的复杂性(例如语法是LL还是LR),以及是否有任何可能需要破解的消歧规则。有些语言实际上需要一些语义分析来解析。

练习:说明C中的(x)-y可以有两种不同的句法解释。提示:你的答案可能包含“减法”、“typedef”、“cast”和“negation”。

在解析过程中可能发生的错误,称为语法错误,在C语言中包括如下内容。

  • j = 4 * (6 − x;
  • i = /5
  • 42 = x * 3

最新文章

  1. less
  2. Sublime Text 2 实用快捷键(Mac OS X)
  3. React(二)实现双向数据流
  4. Asp.net从文件夹中读取图片,随机背景图
  5. HTTP - 摘要认证
  6. Linux的进程优先级
  7. JSP 最佳实践: 用 jsp:include 控制动态内容
  8. nginx正向代理
  9. POJ 1741 Tree(树的点分治,入门题)
  10. EF Core 快速上手——EF Core的三种主要关系类型
  11. poj3662 二分+最短路
  12. Forth 语言概要 - Forth: An underview
  13. 化学1(chem1)- 化学合成
  14. Python基础4--一看就会的选择与循环
  15. Scala_方法和函数
  16. AAPT err(Facade for): libpng error: Not a PNG file 错误解决
  17. JVM性能调优监控工具详解
  18. WCF(一) 创建第一个WCF
  19. 2017 ACM暑期多校联合训练 - Team 4 1007 HDU 6073 Matching In Multiplication (模拟)
  20. Python基本数据类型之列表

热门文章

  1. IDS入侵检测系统
  2. 我的主站 SHARELIST -分享列表 (功能持续完善中 2019-11-24 版本0.3)
  3. 分子动力学模拟软件VMD的安装与使用
  4. 数据库增量日志监听canal
  5. PHP解压压缩包文件到指定目录的实现
  6. ConcurrentHashMap源码解读二
  7. JS String总结
  8. Spring核心结构及核心思想
  9. 用scanf_s判断输入数据是否合法
  10. 从0开始fastjson漏洞分析