项目github地址及源码:
https://github.com/yunwei37/tryCgit
这一系列教程但愿面向初学者,使用c语言手工实现一个简单的解释器来玩,不须要您掌握除了c语言之外的其余前置知识,也不须要您学习过编译原理的相关知识(固然若是能对简单的数据结构有所了解的话会更好,好比树、栈等)。github
写一个能执行代码的解释器不只是一件颇有(zhuang)趣(bi)的事情,大概也能够做为刚学习完c语言的一个练手的小项目啦
不一样于大部分常见的其余只支持四则运算的所谓”手工解释器“教程,咱们但愿在代码结构尽可能清晰的600行代码中,手工(不借助lex/yacc等工具)完成一个脚本语言“try”,实现如下功能:express
(若是看不懂下面这段也不要紧,能够略过啦)数组
这个小玩意采用递归降低法进行语法分析,同时不显式构建语法树,不生成中间代码或目标代码,在语法分析的同时进行解释执行;
递归计算文波那契数列 1 - 15,将结果存入数组中,并打印:数据结构
# Fibonacci sequence func fun{ if(x <= 2){ return(1); } y = 0; x = x - 1; y = fun(x); x = x - 1; return(y + fun(x)); }; # save the Fibonacci sequence of 1 to 15 in an array array arr(15); x = 1; while( x <= 15 ){ arr[x - 1] = fun(x); x = x + 1; } puts("Fibonacci sequence:"); # print the Fibonacci sequence of 1 to 15 i = 0; while(i < 15){ print(arr[i]); i=i+1; }
(起名困难x)这个小玩意咱们就随便叫它tryC吧,当作是一个小的尝试。函数
本人水平有限,若有疏漏之处,还请多多指教。工具
赋值语句类型:学习
x = 123.4; x = 'c'; x = "hello world!";
循环语句:ui
while( bool ){ statements }
选择语句:指针
if( bool ){ statements } if( bool ){ statements }else{ statements }
定义函数:函数参数在定义中不出现,在调用中获取;返回值为double
func function_name{ ... return(expression); }
定义数组:
array array_name(array_length);
输入输出:
puts(string); print(num); read(num);
以前大一学c语言的时候,老师要求实现一个四则运算的计算器,因而我想...要是能给计算器加上函数和变量的定义就好啦...那大概能算一个简单的解释器?我应该怎样去实现它呢?就去查了很多资料七拼八凑加上本身脑补搓了一个出来...虽然能跑起来可是代码混乱不堪一塌糊涂,不过也挺好玩的。
这里的部分是过了一年以后大二学编译原理的时候,把当时的代码用相对比较规范完善的方式重写了一遍,也所以但愿把它整理成一个简单的教程,让c语言的初学者也能够愉快地搓一个解释器玩;或者让学过编译原理的同窗,可以把理论和实践联系起来,(不要像我同样被一大堆的理论迷惑住或吓跑),对于如何构造一个解释器有个直观感性的认识,而且发现它并不像想象的那么困难。