摘要:介绍了一种自制的脚本语言的设计思路,定义第一版语言的词法与语法,虚拟机的设计。
编译器设计,是每个程序员通往高阶的必修课。从本文开始设计一种脚本语言及其编译器。为了方便,不编译为机器语言而是运行在一个基于栈的虚拟机上。语言是弱类型动态检查。虚拟机主要功能参考JVM。技术上,编译器选择Java语言写,虚拟机用C++写。因为Java便于开发,而C++可以管理底层。
第一版脚本语言,只需要实现一些简单的功能。变量定义与赋值,四则运算与比较表达式,函数的定义与调用,递归调用,控制台输入输出。
词法设计:
var表示变量: [a-z A-Z]+ [0-9 a-z A-Z]*
number表示数字常量,为方便都转为double型: [0-9]* 或 [0-9]* . [0-9]*
String类型常量:" [.]* "
bool型常量true, false用1,0代替。
opt运算符: { } ( ) + - * / = < > == =!
保留关键词:if else while var function return print input
语法设计:
用LALR(1)语法解析。语法解析器(parser)用生成器(generator)自动生成。主要有以下生成式:
stmt_list -> stmt_list stmt
stmt -> if_stmt | while_stmt | function_stmt | exp | IO_stmt
exp -> bool_exp | four_exp | call_exp | (exp)
虚拟机设计:
方法区:保存函数、对象的元信息
运行栈:局部变量、上下文
堆:变量的体、函数的体
GC:停顿标记清扫