使用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 楼

草依山

2010-11-21

有意思的东东

2 楼

jorneyR

2010-11-26

可以参考SableCC实现C语言的编译器。

3 楼

zhc0822

2010-11-26

jorneyR 写道

可以参考SableCC实现C语言的编译器。

当时参考的javaCC。感觉功能比较强大,啃起来有些吃力。

4 楼

EldonReturn

2010-11-27

非常好的尝试。做前端开发的,对基础的如编译,汇编,性能分析有兴趣的人真的不多。

5 楼

hpf1908

2010-11-29

很不错,想起自己大学时写的C0编译器了

6 楼

westice

2010-11-29

在线IDE,不错!

7 楼

ZeaLoVe

2011-11-23

好牛啊,最近刚看到用JavaScript实现JVM。。你可以尝试下。。

8 楼

zhc0822

2011-11-23

ZeaLoVe 写道

好牛啊,最近刚看到用JavaScript实现JVM。。你可以尝试下。。

我也看到那个新闻了...一种膜拜的感觉

c语言实现一个编译器生成语法树,运用JavaScript构造C语言子集的编译器相关推荐

  1. 关于《利用LexYacc进行词法分析和语法分析并生成语法树》

    利用Lex&Yacc进行词法分析和语法分析 写在前面 利用Lex进行词法分析的流程在前面已经讲过,接下来是利用Lex&Yacc进行语法分析,最后可视化生成语法树.具体的操作视频:htt ...

  2. Java解析SQL生成语法树_04. Hive源码 — HQL解析(抽象语法树的生成和语义分析)

    HQL的解析过程主要在Driver中的compile方法,这一些主要看这个方法中的代码. 1. compile中的主要内容 public int compile(String command, boo ...

  3. Java解析SQL生成语法树_Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python...

    Atitit.sql ast 表达式 语法树 语法 解析原理与实现java php c#.net js python 1.1.Sql语法树ast如下图锁死 2.SQL语句解析的思路和过程 2.1.le ...

  4. 用vhdl语言设计一个小游戏_用最直白的设计语言营造梦想的办公空间

    两间室内设计新工作室位于钱塘江西侧,毗邻西湖山脉.建筑原本是一幢地处村落中心的4层民居房,建筑外围有一个绿化大庭院,可休闲可聚会活动,具备良好的天然条件.由于此次设计项目是我们自己的办公空间,所以希望 ...

  5. python语言是一个优秀的面向对象语言_python是面向对象的语言吗

    Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的. 面向对象技术简介(推荐学习:Python视频教程) 类(Class): 用来描述具有相同的属 ...

  6. java语言描述一个行为_设计模式之责任链模式——Java语言描述

    责任链模式为请求创建了一个接受者对象的链.这种模式给予请求的类型,对请求的发送者和接受者进行解耦.这种类型的设计模式属于行为模式.在这种模式下,通常每个接收者都包含对另一个接收者的引用.如果一个对象不 ...

  7. c语言建立一个链表,每个结点包括姓名和成绩,求C语言几道题的答案~~拜托了~~...

    #include #include #include #include #include #include void pause(); typedef struct STUDENT { char st ...

  8. c语言输入一个字符 对其进行归类,计算机二级C语言改错题归类 - 图文

    b[k++]=' '; t[2*sl]='\\0'; t[i] = s[sl-i-1]; t[2*d]='\\0'; pt[i]=str[k][i]; 2.先将在字符串s中的字符按正序存放到t串中,然 ...

  9. 用c语言编写一个完整的实现单链表,如何用c语言实现两个单链表的归并

    我已经用c语言编写运行请各位朋友帮忙看看哪错呵呵非谢谢 #include"stdio.h" #include"stdlib.h" typedef struct ...

最新文章

  1. Nat.Commun. | AI指导发现炎症性肠病保护治疗方法
  2. layui上传图片列表展示_layui怎么做图片在列表中显示 | 学步园
  3. Bert时代的创新:Bert应用模式比较及其它
  4. python3 json.dump乱码问题
  5. 以太坊DAPP[2]-×××-react框架与web3实例
  6. Java黑皮书课后题第10章:*10.18(大素数)编写程序找出五个大于Long.Max_VALUE的素数
  7. java字符串与数组比较大小_java-如何将存储在数组中的字符串与简单字符串进行比较?...
  8. ESXi 6.7 的https服务挂掉处理方法 503 Service Unavailable (Failed to connect to endpoint: [N7Vmacore4Http16Loc
  9. add函数python怎么用_Python add()函数是如何使用呢?
  10. Spring框架零基础学习(一):IOC|DI、AOP
  11. python中import和from...import...有关头文件的使用方法及工作原理
  12. 通达OA2017按部门创建公共文件柜
  13. ai的预览模式切换_ai预览模式怎么退出
  14. python方向键 ubuntu,ubuntu|linux下 如何用python 模拟按键
  15. chrome 打开网页速度很慢的可能原因
  16. 2021年高光谱图像文献追踪_ISPRS_V.180_10
  17. CorelDRAW快速制作绚丽的彩色透明心形
  18. SaaSBase:艺赛旗iS-RPA是什么?
  19. 数据科学家应当了解的五个统计基本概念
  20. linux网卡驱动源码分析

热门文章

  1. 年过20载,超1000万人在用,还说要被淘汰?
  2. 程序员大厂面试被怼:干这么多年只会增删改查!谁会要!
  3. 汲取 IE6、IE8 消亡的经验,如何“杀死” IE11?
  4. 父母延长退休,作为程序员的我光荣失业
  5. 祸害阿里云宕机 3 小时的 IO HANG 究竟是个什么鬼?!
  6. 今日头条、快手们疯狂招人是人工智能的失败?
  7. 高德开放平台与360儿童手表达成合作,全球数据助力第三方企业
  8. “非死不可”Facebook
  9. 如果美图可以把妹,如何用技术手段做一个会拍照的程序员?
  10. TOP 1%的软件工程师和其他 99%有什么不同?