• 编译器架构Compiler Architecture(上)


    编译器架构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
  • 相关阅读:
    104.Maximum Depth of Binary Tree
    103.Binary Tree Zigzag Level Order Traversal
    102.Binary Tree Level Order Traversal
    101.Symmetric Tree
    100.Same Tree
    99.Recover Binary Search Tree
    98.Validate Binary Search Tree
    97.Interleaving String
    static静态初始化块
    serialVersionUID作用
  • 原文地址:https://www.cnblogs.com/wujianming-110117/p/13234533.html
Copyright © 2020-2023  润新知