编译原理笔记 1

  • 前端:编译器对程序代码的分析和理解过程,跟语言的语法有关,跟目标机器无关

    • 词法分析(Lexical Analysis):识别词法记号(Token),基于正则文法(Regular Grammar)。工具读入正则表达式,输出有限自动机(Finite-state Automaton,FSA,or Finite Automaton)

      • 可手写规则(如 GNU 的 C 编译器)
      • 也可用词法分析器生成工具(如 Lex/Flex)
    • 语法分析 (Syntactic Analysis / Parsing):识别程序语法结构,构造抽象语法树(Abstract Syntax Tree)
      可以参考 JointJS 提供的可视化 JavaScript AST demo
      执行脚本语言的过程,就是遍历 AST 的过程(此处遍历通常是后序遍历,左->右->根)。
      AST 构造完成后,会标记一些属性,例如源代码的行号。

      • 如何构造 AST:
        • 手写递归下降算法(Recursive Descent Parsing)
        • 使用工具:Yacc、Antlr、JavaCC
    • 语义分析(Semantic Analysis):根据语义规则进行分析判断,上下文分析、消除歧义
      语义分析的部分结果,会标记在 AST 上,例如 int 等数据类型

  • 后端:生成目标代码,跟目标机器有关

    • 生成目标代码
    • 对代码进行优化
原文地址:https://www.cnblogs.com/cdyang/p/compiler-theory-note-1.html