基于antlr的C++转JS的语法编译器
碎碎念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权威指南》.机械工业出版社
- Reactjs开发自制编程语言Monkey的编译器:语法解析
- (基于Java)编写编译器和解释器-第5A章:基于Antlr解析表达式和赋值语句及计算(连载)
- Reactjs开发自制编程语言Monkey的编译器:高能技术干货之语法高亮1
- 正则表达式基本语法及表单验证操作详解【基于JS】
- Visual C++ 编译器自动假定带 .C 扩展名的文件是 C 文件而不是 C++ 文件,并且拒绝 C++ 语法和关键字(c语言只能在大括号最前面申明变量)
- C++:基于LL(1)方法的语法分析程序-1
- gcc命令_Linux gcc 命令用法详解:基于C/C++的编译器
- C++ 程序 附加 进程调试 方法 本文基于VS2010为例, 其他版本的编译器也可以
- 基于 wke 的浏览器:如何实现 js 和 c++ 的互相调用
- Reactjs开发自制编程语言Monkey的编译器:高能技术干货之语法高亮2
- 基于LINUX平台G++编译器从汇编层面深度剖析C++虚函数
- C++:基于LL(1)方法的语法分析程序-2
- 基于正则表达式匹配的C++语法高亮度显示
- 基于C++实现的语法分析之LL(1)分析法实现
- js es6系列教程 - 基于new.target属性与es5改造es6的类语法
- C++:基于LL(1)方法的语法分析程序-3
- JS实现禁止高频率连续点击的方法【基于ES6语法】
- 基于JSP编译器基本语法的使用详解
- 基于JS的DOM 编程基础和Json语法及JS下的AJAX基础
- 基于JS的DOM 编程基础和Json语法及JS下的AJAX基础