您的位置:首页 > 编程语言 > C语言/C++

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

2018-12-26 21:41 337 查看

碎碎念1:这个编译原理的期末课设最后一周才开始赶,真的累
碎碎念2:期末了,一堆考试复习和大作业,前端学习得推到寒假里了
碎碎念3:antlr4用得真的爽,真要自己写一个编译器不知道得写到哪一年去

一、环境配置和设计目标

开发环境:安装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 定义语句块作为分界,相对来说限制较少,语言更灵活。

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


六、额外希望实现的功能

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

七、最终成果

八、参考书目

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: