Cmicro-Compiler 是一个类C语言解释器,支持C语言的简单语法解析,主要是跟随《用Go语言自制解释器》以及《用Go语言自制编译器》这两本书进行编译原理的学习
。目前本程序代码部分借鉴自书中,创新补充实现了赋值语句
、input函数
、for循环
(包括嵌套for循环)的解析,以及拓展了几个二元运算符>=
、<=
等,后续还会继续完善。
token
:定义了token词法单元,用于将输入的代码根据可解析的token类型。lexer
:词法分析器。根据对应token将输入代码进行切分。结果输送进入ast。object
:定义了抽象语法树的节点类型。规定了语法分析器能够支持的数据类型。ast
:抽象语法树。此文件夹定义了抽象语法树的数据结构。用于将对应的token接生成相应的语法节点。自顶向下递归生成抽象语法树。结果输送进入parser
。parser
:语法分析器。递归的对抽象语法树进行递归下降解析,将结果输送进入evaluator
。evaluator
:求值器。递归对每一个ast
语法节点node
中的内容进行求值,将结果返回到repl
交互中。repl
:交互式环境。用于接受用户输入和打印程序执行结果。
- 变量声明
let a = 1;let a = true;let a = "hello";
支持类型:int、string、bool,不是Null的值均认为为true。 - if 语句
if(a == 1){}else{}
支持条件判断:==、!=、>、<、>=、<=。 - for 语句
for(let i = 0;i < 10;i++){print("hello");}
支持for循环,嵌套for循环。 - 支持函数定义和调用
let add = func(a,b){return a+b;};add(1,2);
支持基本的函数定义和调用,支持函数闭包。 - 支持对变量的赋值语句
let sum = 0; sum = 1 + 2;
对已定义变量可进行二次赋值。 - 支持部分内置函数。
input()
:输入一个字符串,返回字符串。print()
:输出一个字符串,返回字符串。println()
:输出一个字符串并换行,返回字符串。len();
:支持对字符串进行长度判断,返回长度。
- 安装go语言环境:Go安装及环境配置教程。本程序编写版本为
go 1.20
,低于本版本可能会出现异常错误。 - 启动main.go文件即可。
- 简单的表达式语句可以不输入“;”,但是复杂的代码如果不正确输入“;”可能会出现解析错误。特别是函数调用完成一定要加。