自己动手写basic解释器 七

                 

自己动手写basic解释器

刺猬@http://blog.csdn.net/littlehedgehog

 





注: 文章basic解释源码摘自梁肇新先生的《编程高手箴言》(据他所说这个代码也是网上摘录的),源码解读参考《java编程艺术》。《java编程艺术》里面自然是java版了(可能旭哥更加适合点儿),我这里还是解读的C版basic解释器代码。





终于把这个basic解释器主干源码解述完了。其实说来这个解释器实际意义并不大,但是通过阅读源代码我们可以深一步领悟程序语言执行内部机理。我觉得特别值得提的三点:
1、通过prog指针模拟CPU中的eip寄存器,巧妙地借鉴了世界最顶尖级的硬件工程师在处理程序运行问题上的思路。
2、模拟函数调用栈,这个在go_sub函数中得到了淋漓尽致地体现。
3、p_buf就相当于计算机内存,或者说是程序运行空间的text段,26个变量就相当于data段,而我们的模拟栈恰好就是程序中的栈空间。


最后我把主程序的代码贴出来,方便兄弟伙们:


  1. #include <stdio.h>
  2. #include <setjmp.h>
  3. #include <math.h>
  4. #include <ctype.h>
  5. #include <stdlib.h>

  6. #define NUM_LAB 100
  7. #define LAB_LEN 10
  8. #define FOR_NEST 25
  9. #define SUB_NEST 25
  10. #define PROG_SIZE 10000
  11. #define DELIMITER 1
  12. #define VARIABLE 2
  13. #define NUMBER 3
  14. #define COMMAND 4
  15. #define STRING 5
  16. #define QUOTE 6

  17. #define PRINT 1
  18. #define INPUT 2
  19. #define IF 3
  20. #define THEN 4
  21. #define FOR 5
  22. #define NEXT 6
  23. #define TO 7
  24. #define GOTO 8
  25. #define EOL 9
  26. #define FINISHED 10
  27. #define GOSUB 11
  28. #define RETURN 12
  29. #define END 13

  30. char *prog;      /* holds expression to be analyzed  */
  31. jmp_buf e_buf;   /* hold environment for longjmp() */

  32. int variables[26]= {  /* 26 user variables,A-Z  */
  33.     0,0,0,0,0,0,0,0,0,0,
  34.     0,0,0,0,0,0,0,0,0,0,
  35.     0,0,0,0,0,0
  36. };

  37. struct commands { /* keyword lookup table  */
  38.     char command[20];
  39.     char tok;
  40. } table[] = {  /* command must be entered lowercase  */
  41.     "print",PRINT,   /* in this table  */
  42.     "input",INPUT,
  43.     "if",IF,
  44.     "then",THEN,
  45.     "goto",GOTO,
  46.     "for",FOR,
  47.     "next",NEXT,
  48.     "to",TO,
  49.     "gosub",GOSUB,
  50.     "return",RETURN,
  51.     "end",END,
  52.     NULL,END
  53. };

  54. char token[80];     //注意token是数组类型
  55. char token_type,tok;

  56. struct label {
  57.     char name [LAB_LEN];
  58.     char *p;    /* point to place to go in source */
  59. };

  60. struct label label_table[NUM_LAB];
  61. char *find_label(),*gpop();

  62. struct for_stack {
  63.     int var;   /* counter variable  */
  64.     int target;  /* target value  */
  65.     char *loc;
  66. } fstack[FOR_NEST];  /* stack for FOR/NEXT loop  */
  67. struct for_stack fpop();

  68. char *gstack[SUB_NEST];  /* stack for gosub  */
  69. int ftos;  /* index to top of FOR stack  */
  70. int gtos;  /* index to top of GOSUB  */

  71. void print(),scan_labels(),find_eol(),exec_goto();
  72. void gosub(),greturn(),gpush(),label_init(),fpush();

  73. /* Load a program */
  74. load_program (char *p,char *fname)
  75. {
  76.     FILE *fp;
  77.     int i=0;
  78.    
  79.     if (!(fp=fopen(fname,"rb")))  return 0;

  80.     i=0;
  81.     do  {
  82.         *p = getc(fp);
  83.         p+&
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值