基于antlr的C++转JS的语法编译器

一、环境配置和设计目标

开发环境:安装antlr的IDEA
设计目标:通过antlr提供的语法分析器将一段cpp源程序语言转化为js程序
源程序语言:c++ 目标语言:JavaScript 测试用程序:一个简单的四则运算

二、开发流程

1.根据c++和js的语法差距设计.g4文法文件
2.通过antlr插件生成词法lexer和语法分析器paraser
3.通过antlr提供的语法生成树进行验证
4.将c++编写的四则运算器翻译成js语言

三、计算器程序的伪代码

int main(){
	while(true){
		读入输入的算式,调用play函数,输出计算结果。}
}
double play(char flag){	//操作式子,flag为式子结束标识
	for 式子未结束{
		if遇到数字	通过一个while对数字进行提取操作。
		else if遇到括号	产生一个新的式子。
else if遇到操作符	栈为空则入栈,否则比较操作符与栈顶操作符优先级,并选择对当前优先的算式进行计算。}
	while 栈内操作符非空{
		根据栈内操作符完成剩下算式的计算。}
	return 计算结果

四、c++和js部分语法对比

1.函数声明:
C++——有返回值的声明,有参数类型声明。
returnType functionID (paraType para, …, paraType para){}
Javascript——无返回值,内部有return 操作,无需传递参数类型。
functionID = function(para list){}
2.函数传参:
C++——需要传递参数类型,支持引用类型&。
Javascript——无需传递参数的数据类型,除对object 类型之外不支持引用的类型。
3.变量类型
C++——明确区分数据类型。
Javascript——除了对数组是array 类型之外基本不区分数据类型,都为var 类型。
4.构建数组
C++——arrayType arrayID[] = {para}。
Javascript——var arrayID = new Array(para)。
5.整体结构
C++需要main 函数作为程序的入口,对语法规则限制更多,更加规范。而Javascript 没有特定的main 函数作为程序的起始地址,整个程序布局由function 定义语句块作为分界,相对来说限制较少,语言更灵活。

五、设计计算器程序所需要的相应的文法

for循环while循环
在这里插入图片描述

六、额外希望实现的功能

1.在文法设计中增加tab属性,使得最后输出的js代码增强可读性
2.优化编译效率

七、最终成果

在这里插入图片描述

八、参考书目

《antlr4权威指南》.机械工业出版社

猜你喜欢

转载自blog.csdn.net/Gainsense/article/details/85269350