Chinaunix首页 | 论坛 | 博客
  • 博客访问: 675209
  • 博文数量: 156
  • 博客积分: 3402
  • 博客等级: 中校
  • 技术积分: 1639
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-13 14:06
个人简介

业余编程爱好者

文章分类

全部博文(156)

文章存档

2014年(1)

2013年(13)

2012年(46)

2011年(38)

2010年(58)

分类: LINUX

2012-03-29 20:49:52

cforth源代码更新,解决了DS栈、RS栈下溢出的问题。增加了取DS、RS长度的子函数。源代码如下:
 
cforth.c

点击(此处)折叠或打开

  1. /********************** cforth主程序 ************************/
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "code_words.h"
  5. #include "colon_words.h"

  6. /*定义数组inputBuff,申请一段空间用以存放键盘数入的字符串 */
  7. /*定义数组strBuff,用以存放字符串分解后的每一个cforth词 */
  8. char inputBuff[1024];
  9. char strBuff[30];

  10. int main()
  11. {
  12.     printf("Cforth 0.1.0, Copyright (C) 2008-2012 Free Software Foundation, Inc.\n");
  13.     printf("Cforth comes with ABSOLUTELY NO WARRANTY; for details type 'license'\n");
  14.     printf("Type 'bye' to exit\n");
  15.     
  16.     /*cforth主循环,从键盘接受输入的命令,调用对应的子程序并执行*/
  17.     while (1){
  18.         int i=0;
  19.         int j=0;
  20.         int k;
  21.         printf(">>>");
  22.         gets(inputBuff); //读取键盘输入的一行命令,存入inputBuff

  23.         /*以下一小段代码,用来解决必须在每行命令后加一个空格的缺陷 */
  24.         for(k=0;inputBuff[k]!='\0';k++);//取得inputBuff字符串的长度
  25.         inputBuff[k]=' '; //将inputBuff字符串结尾的'\0'换成一个空格
  26.         inputBuff[k+1]='\0'; //在字符串末尾空格后添一个'\0'

  27.         /*分解键盘输入的字符串,并执行每个cforth词,直到遇到inputBuff字符串的结尾'\0'*/
  28.         while(inputBuff[j] != '\0') {
  29.             if(inputBuff[j]!= ' ') {
  30.             strBuff[i] = inputBuff[j];
  31.             i++;
  32.             j++;
  33.             }
  34.             
  35.             else {
  36.             strBuff[i]='\0';
  37.             if( isNum() ) chgNum();
  38.             else if( !strcmp(".s",strBuff) )     showDS();
  39.             else if( !strcmp(".rs",strBuff) ) showRS();
  40.             else if( !strcmp(".",strBuff) ) showtopDS();
  41.             else if( !strcmp("swap",strBuff)) swap();
  42.             else if( !strcmp(">r",strBuff) ) tor();
  43.             else if( !strcmp("r>",strBuff) ) rto();
  44.             else if( !strcmp("dup",strBuff) ) dup();
  45.             else if( !strcmp("drop",strBuff) ) drop();
  46.             else if( !strcmp("2drop",strBuff) ) drop2();
  47.             else if( !strcmp("2dup",strBuff) ) dup2();
  48.             else if( !strcmp("over",strBuff) ) over();
  49.             else if( !strcmp("+",strBuff) ) add();
  50.             else if( !strcmp("-",strBuff) ) sub();
  51.             else if( !strcmp("*",strBuff) ) mul();
  52.             else if( !strcmp("/d",strBuff) ) ddiv();
  53.             else if( !strcmp("/",strBuff) ) div();
  54.             else if( !strcmp("%",strBuff) ) mod();
  55.             else if( !strcmp("say",strBuff) ) say();
  56.             else if( !strcmp("bye",strBuff) ) return 0;
  57.             else printf("\n[%s]?\n",strBuff);
  58.           
  59.             for(i=0;i<30;i++) strBuff[i]='\0';
  60.                 i=0;
  61.                 j++;
  62.             }

  63.         }
  64.         printf("OK\n");
  65.      }
  66.     return 0;
  67. }


  68. //判断键盘输入流中是否有数字
  69. int isNum()
  70. {
  71.     char *str=strBuff;
  72.     while(*str) {
  73.         if(*str<'0' || *str>'9') return 0;
  74.         str++;
  75.     }
  76.         return 1;
  77. }


  78. //转换键盘输入流中的数字,并压入数据栈DS
  79. int chgNum()
  80. {
  81.     char *str=strBuff;
  82.     int sum=0;
  83.     while(*str) {
  84.         sum=10*sum+(int)(*str-'0');
  85.         str++;
  86.     }
  87.     //如果这个数字字符串只有一个'\0',则直接返回0。
  88.     //用来解决多余的空格键误操作DS的BUG
  89.     if(str==&strBuff[0]) return 0;
  90.     push(sum);
  91.     return 0;
  92. }


  93. //接收键盘输入的字符串,并打印到屏幕
  94. int say()
  95. {
  96.     gets(strBuff);
  97.     printf("cforth: [%s]\n",strBuff);
  98.     return 0;
  99. }

code_words.h

点击(此处)折叠或打开

  1. /********************** cforth核心词 ************************/
  2. /* 定义数组ds与rs,申请一段空间用作数据栈和DS返回栈RS */
  3. /* 定义指针*dsp与*rsp,分别指向dS数组与rS数组的首地址 */
  4. int ds[256],rs[256];
  5. int *dsp=ds,*rsp=rs;

  6. //push 将数压入数据栈DS栈顶
  7. void push(int a){ dsp++; *dsp=a; }

  8. //>r 将DS栈顶的数弹出,压入RS栈顶
  9. int tor(){if(dsLen() < 1) return 0; rsp++; *rsp=*dsp; dsp--; return 0;}

  10. //r> 将RS栈顶的数弹出,压入DS栈顶
  11. int rto(){ if(rsLen() < 1) return 0;dsp++; *dsp=*rsp; rsp--; return 0;}

  12. //drop 丢弃DS栈顶
  13. int drop(){if(dsLen() < 1) return 0; dsp--; return 0;}

  14. //dup 复制DS栈顶数
  15. int dup(){if(dsLen() < 1) return 0; dsp++; *dsp=*(dsp-1); return 0;}

  16. //swap 交换DS栈顶前两个数
  17. int swap(){if(dsLen() < 2) return 0; int tmp; tmp=*dsp,*dsp=*(dsp-1),*(dsp-1)=tmp;return 0;}

  18. //+ 将DS栈顶前两个数相加
  19. int add(){if(dsLen() < 2) return 0; *(dsp-1)=*(dsp-1) + *dsp; dsp--; return 0;}

  20. //- 将DS次栈顶数减DS栈顶数
  21. int sub(){if(dsLen() < 2) return 0; *(dsp-1)=*(dsp-1) - *dsp; dsp--;return 0;}

  22. //* 将DS次栈顶数乘以DS栈顶数
  23. int mul(){if(dsLen() < 2) return 0; *(dsp-1)=*(dsp-1) * *dsp; dsp--;return 0;}

  24. // /d 将DS次栈顶数除以DS栈顶数,舍弃余数
  25. int ddiv(){if(dsLen() < 2) return 0; *(dsp-1)=*(dsp-1) / *dsp; dsp--;return 0;}

  26. // % 将DS次栈顶数除以DS栈顶数,只留余数
  27. int mod(){if(dsLen() < 2) return 0; *(dsp-1)=*(dsp-1) % *dsp; dsp--;return 0;}

  28. //.s 显示数据栈DS
  29. void showDS()
  30. {
  31.     int *tmp=&ds[1];
  32.     while(tmp<=dsp) {
  33.         printf("%d ",*tmp);
  34.         tmp++;
  35.     }
  36.     printf(");
  37. }

  38. //.rs 显示返回栈RS
  39. void showRS()
  40. {
  41.     int *tmp=&rs[1];
  42.     while(tmp<=rsp) {
  43.         printf("%d ",*tmp);
  44.         tmp++;
  45.     }
  46.     printf(");
  47. }

  48. //showTop 显示DS栈顶,对DS栈无影响
  49. void showTop()
  50. {
  51.     printf("%d\n",*dsp);
  52. }

  53. //ifFlag0 若DS栈顶数为0,则丢弃DS栈顶,用于带余数除法
  54. void ifFlag0()
  55. {
  56.     int flag = *dsp;
  57.     if(flag == 0) drop();
  58. }

  59. //dsLen 返回DS栈的长度
  60. int dsLen()
  61. {
  62.     int *tmp=&ds[1];
  63.     int n;
  64.     for(n=0;tmp<=dsp;n++)
  65.         tmp++;
  66. //    printf("\n %d\n",n);
  67.     return n;
  68. }

  69. //rsLen 返回RS栈的长度
  70. int rsLen()
  71. {
  72.     int *tmp=&rs[1];
  73.     int n;
  74.     for(n=0;tmp<=rsp;n++)
  75.         tmp++;
  76.     return n;
  77. }

colon_words.h

点击(此处)折叠或打开

  1. /********************** cforth扩展词 ************************/

  2. //2drop
  3. void drop2(){ drop(); drop(); }

  4. //over
  5. void over(){ tor(); dup(); rto(); swap(); }

  6. //2dup
  7. void dup2(){ over(); over(); }

  8. //show top of DS
  9. void showtopDS(){ showTop(); drop(); }

  10. //带余数的除法
  11. void div() { dup2(); mod(); tor(); ddiv();rto(); ifFlag0(); }

阅读(820) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~