一、环境配置和设计目标
开发环境:安装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权威指南》.机械工业出版社