Skip to content

CorleoneYu/compiler

Repository files navigation

编译原理

沉淀个人对于编译原理学习、实践的仓库。

monkey 编译器

实现了

  1. 词法解析
  2. 语法解析
  3. 程序执行

词法分析

支持:

  1. 操作符: - + / * == != ! < >
  2. 界符: , ; { } ( ) [ ]
  3. 保留字: let if else fn false true return while

语法分析

支持:

  1. 表达式类型:error integer boolean string null 数组 类对象 前序表达式 中序表达式 fn表达式 fnCall表达式
  2. 语句类型:let声明语句 赋值语句 return语句 表达式语句 块级语句 if-else语句 while语句
// 1. 前序表达式 boolean integer
!true
-3

// 2. 字符串
'hello world'

// 3. 中序表达式 integer
1 + 1
1 + 2 * (3 + 4)

// 4. let声明语句 fn表达式 fnCall表达式(函数调用)
let add = fn(a, b) {
    // return 语句 块级语句
    return a + b;
}
add(1, 2);

// 5. if-else语句
if (true) {
    return 1;
} else {
    return 0;
}

// 6. while语句
let a = 0;
while(a < 5) {
    // 赋值语句
    a = a + 1;
}

let count = 4;
while(count > 0) {
    move(1);
    turnLeft();
    move(1);
    turnRight();
    count = count -1;
}

// 7. 数组
let arr = [1, 2, 3, 4];
arr[0]; // key取值 1

// 8. 类对象
let person = {
    "name": "lky"
};
person["name"]; // key取值 lky

执行

支持:

  1. integer操作:
    1. 一元操作符 ! -
    2. 二元操作符 + - * / == != > <
  2. boolean操作:
    1. 一元操作符 !
    2. 二元操作符 == !=
  3. string操作:
    1. 一元操作符 !
    2. 二元操作符 + == !=
  4. if-else 执行
  5. fn执行 支持闭包
  6. let 与简单赋值语句
  7. while执行

与编程游戏结合

  1. 支持内置函数
    1. move(step)
    2. canMove: 用于判断坦克是否可以向前移动
    3. turnLeft() turnRight()
  2. 执行中代码高亮
  3. 任务执行器

难点:

  1. 程序执行中canMove()结果需返回给程序执行使用
  2. 任务执行 异步调度

效果图

sql 解析器

Todo...

正则表达式解析器

效果图

学习

编译流程

  1. 词法分析
  2. 语法分析
  3. 语义分析
  4. 中间代码生成
  5. 代码优化
  6. 后端:目标代码生成

知识点

  1. 文法 语言
  2. 正规集 -> (正规式 正规文法 DNA) NFA
  3. 自顶向下:LL(1) -> 提取左公因子 消除左递归 FIRST FOLLOW SELECT 预测表
  4. 自底向上:LR(1)
  5. 运行时存储管理:活动记录 DISPLAY表

视频资料

《编译原理》 廖力

快速刷完了B站廖力老师的视频 有了大体的认识

网易云课堂教程

自己动手用java写编译器

书籍资料

《龙书》

Todo...

《虎书》

Todo...

About

简易编译器,包含 词法分析 语法解析 程序执行

Topics

Resources

Stars

7 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages