• 编译器架构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
  • 相关阅读:
    docker容器升级脚本
    Haproxy状态监控配置教程
    负载均衡之Haproxy配置详解(及httpd配置)
    升级代码脚本
    升级数据库脚本(加入事务)
    监控端口,新疆模拟用户登录脚本
    mongodb3.2系统性学习——3、update()操作
    Java Socket编程
    php错误级别设置
    php 用于绘图使用的颜色数组
  • 原文地址:https://www.cnblogs.com/wujianming-110117/p/13234533.html
Copyright © 2020-2023  润新知