|
关于Basic程序解释器及编译原理的简单化(1)--词法分析和代数式求值(1)
在网上,看到还是有部分程序爱好者希望能编出自己的编译器.当然,这的确是件难事,许多人都说要去看什么编译原理和精通汇编语言,结果让这些爱好者都望而却步.但是,当我们亲手去做做后,发现要做一个简单的程序解释器(就像Java和Basic)那样,还是挺容易的.你根本不用去看那些东西,只要你懂C语言,在看了本文后,就可以完成那样的解释器. 在网上,有许多大型C语言,Perl语言的编译器源代码.但当你下载后看看,竟发现点都看不懂.其实那些东西还是不看为妙.看了本文后,我相信你宁愿自己动手编,也不愿意去领会那些庞大的源代码了. 少说费话了,我们开始讲解. 这一篇Basic解释器的代码.十分经典.而且十分简单化. get_token()是词汇提取,譬如 PRINT A+B 通过调用一次get_token(),就在 字符串token里装上PRINT 再调用一次get_token(),token里就装上A 再调用一次get_token(),token里就装上+ 再调用一次get_token(),token里就装上B 很简单吧! putback()是将prog指针向回移动一格. 其中包含了词发分析和十分关键的代数式求值get_eXP(int *result) 关于它的代数式求值get_exp(int *result),用到递归函数 void get_exp(),level2(),level3(),level4(),level5(); void level6(),primitive(),arith(),unary(); ,确实难看懂,不过你尽管拿来用就是了. 话不多说,你看源代码就是了.最后,我将给你看看C++中完整的源代码 /* recursive descent parser for integer expression which may include variables */ #include <stdio.h> #include <setjmp.h> #include <math.h> #include <ctype.h> #include <stdlib.h> #define DELIMITER 1 #define VARIABLE 2 #define NUMBER 3 #define COMMAND 4 #define STRING 5 #define QUOTE 6 #define EOL 9 #define FINISHED 10 extern char *prog; /* holds expression to be analyzed */ extern jmp_buf e_buf; /* hold enviroment */ extern int variables[26]; /* variables */ extern strUCt commands { char command[20]; char tok; } table[]; extern char token[80]; /* holds string representation of token */
|