jCompiler是我一年前完成的一个课程作业。目的是尝试为编程语言提供基于浏览器的编译器实现+骗取高分(这才是重点)。
实现的功能有:词法分析、语法分析、语法树生成(LL(1)文法)和中间代码生成(四元式)以及解释执行。
下面上图。
也许有人会有这样的疑问,为什么要用JavaScript来实现一个编译器?意义何在?
ok~答案是,JavaScript是我当时用得最熟练的编程语言...
这个玩意的研究价值应当大于它的实用价值。
它现在的最大的价值是为纠结于编译原理这门课的童鞋提供一个相对完善的编码实例。
也许在不久的将来,它会演变为一个云端的IDE。Who knows.
另外,水平所限,程序仅支持火狐和webkit浏览器。
附录——C语言子集定义
- 语言结构:顺序结构(赋值语句、输入、输出)、选择语句(if-else)、循环结构(while)。这些语句结构和C语言的结构一样,允许嵌套。
- 表达式局限于关系表达式和算术表达式,运算的优先级为:算术运算、关系运算,并服从左结合规则。
- 算术表达式包括整数和实数上的运算、变量以及“()”、“*”、“+”、“-”、“/”,运算符的优先级顺序为:“()”大于“*”和“/”大于“+”和“-”。
- 关系运算符包括:“<”、“==”、“<>”。
- 一条语句以“;”结束;程序由一条语句或者由“{”和“}”嵌套表达的复合语句。
- 注释放在“/*”“ */ ”之间,支持多行注释。
- 支持数组运算,数组的下标必须是正整数,使用“[”和“]”表示数组下标。
- 变量的使用之前需要先声明,声明的方式和C语言一样。
-
保留字
特殊符号
其他
If
+
十进制的整数与实数
else
-
while
*
read
/
标识符(由数字、字母和下划线组成的串,但必须以字母开头、且不能以下划线结尾的串)
write
=
int
<
real
==
<>
(
)
;
{
}
/*
*/
[
]