使用JavaScript构造C语言子集的编译器
jCompiler是我一年前完成的一个课程作业。目的是尝试为编程语言提供基于浏览器的编译器实现+骗取高分(这才是重点)。
实现的功能有:词法分析、语法分析、语法树生成(LL(1)文法)和中间代码生成(四元式)以及解释执行。
下面上图。
也许有人会有这样的疑问,为什么要用JavaScript来实现一个编译器?意义何在?
ok~答案是,JavaScript是我当时用得最熟练的编程语言...
这个玩意的研究价值应当大于它的实用价值。
它现在的最大的价值是为纠结于编译原理这门课的童鞋提供一个相对完善的编码实例。
也许在不久的将来,它会演变为一个云端的IDE。Who knows.
另外,水平所限,程序仅支持火狐和webkit浏览器。
附录——C语言子集定义
语言结构:顺序结构(赋值语句、输入、输出)、选择语句(if-else)、循环结构(while)。这些语句结构和C语言的结构一样,允许嵌套。
表达式局限于关系表达式和算术表达式,运算的优先级为:算术运算、关系运算,并服从左结合规则。
算术表达式包括整数和实数上的运算、变量以及“()”、“*”、“+”、“-”、“/”,运算符的优先级顺序为:“()”大于“*”和“/”大于“+”和“-”。
关系运算符包括:“”。
一条语句以“;”结束;程序由一条语句或者由“{”和“}”嵌套表达的复合语句。
注释放在“/*”“*/”之间,支持多行注释。
支持数组运算,数组的下标必须是正整数,使用“[”和“]”表示数组下标。
变量的使用之前需要先声明,声明的方式和C语言一样。
保留字
特殊符号
其他
If
+
十进制的整数与实数
else
-
while
*
read
/
标识符(由数字、字母和下划线组成的串,但必须以字母开头、且不能以下划线结尾的串)
write
=
int
<
real
==
<>
(
)
;
{
}
/*
*/
[
]
1 楼
草依山
-11-21
有意思的东东
赞
2 楼
jorneyR
-11-26
可以参考SableCC实现C语言的编译器。
3 楼
zhc0822
-11-26
jorneyR 写道
可以参考SableCC实现C语言的编译器。
当时参考的javaCC。感觉功能比较强大,啃起来有些吃力。
4 楼
EldonReturn
-11-27
非常好的尝试。做前端开发的,对基础的如编译,汇编,性能分析有兴趣的人真的不多。
5 楼
hpf1908
-11-29
很不错,想起自己大学时写的C0编译器了
6 楼
westice
-11-29
在线IDE,不错!
7 楼
ZeaLoVe
-11-23
好牛啊,最近刚看到用JavaScript实现JVM。。你可以尝试下。。
8 楼
zhc0822
-11-23
ZeaLoVe 写道
好牛啊,最近刚看到用JavaScript实现JVM。。你可以尝试下。。
我也看到那个新闻了...一种膜拜的感觉
如果觉得《c语言实现一个编译器生成语法树 运用JavaScript构造C语言子集的编译器》对你有帮助,请点赞、收藏,并留下你的观点哦!