【原创】自制编程语言-6 输入语句

现在我们的编程语言功能越来越多了,干劲也更足了,趁着这势头,我们继续写下去吧。这次我们来尝试编写输入语句。有了一个功能,加上运算符,我们就可以实现A+B问题了,真不错。输入语句的样式用很多,例如:

C++:cin>>a;
C:scanf("%d",&a);
PASCAL:read(a)
PYTHON:a=input()
我们就使用PYTHON的方式吧。这样写起来可以和赋值语句结合在一起。我们的输入就写成这样:
a = input()
好了,开始编写代码。关键点在于,我们如何从屏幕进行读入。因为之前为了读取代码,我们使用了freopen修改了读入的默认对象stdin。所以,我们需要重新将读入流修改回控制台。
有的人会问,“除了freopen,还有什么方式可以修改文件流?老师只说过这一种方法,还说其它的方式没必要知道那么多,知道一个freopen就够了。”现在看来,这个完全是错误的。(当然,如果是编程竞赛而不是工程设计,一个freopen是完全足够的)
C++可以用fstream来实现,C语言可以用FILE*指针实现。这里为了简单一点,我们直接用fstream实现了。
ifstream cons("CON")表示制作一个叫做cons的输入流,输入目标文件为"CON",实际就是将输入文件设置为控制台,就可以从控制台输入数据。此时就可以用cons>>n的语句来从cons读入。cons其实就是之前定义的变量。
多说一句, 这里的ifstream不是一个函数,而是构造函数。更多关于构造函数的知识可以去网上搜索。笔者这里的自制string类型以后也可能会往里面放一些构造函数和析构函数的东西。(不过可能会咕一阵子)
好了,我们尝试运行A+B PROBLEM的代码。激动人心的时刻到了。(笑)
话说print不可以连续输出很不方便,到时候抽时间改掉就是了。但是这还不是最难受的,最难受的在于,1和2中间必须使用换行符分割。(如果想知道用空格会发生什么,自己运行一下吧)
所以,我们需要查错误。其实只需要移动一行代码就解决了。
没错,把cons设定为全局变量。
完。附上完整版代码。
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. char s[100];
  4. ifstream cons("CON");
  5. struct VALUE{
  6. char name[30];//变量名
  7. int type;//类型,0表示int,1表示string
  8. int vnum;//int类型的数值
  9. char vstring[255];//string类型
  10. };
  11. int value_ptr=0;
  12. struct VALUE value[1000];
  13. void get_word(char *s){//读入单词
  14. scanf("%s",s);
  15. }
  16. void get_string(char *s){
  17. int i=0,flag=0;
  18. for(i=0;i<100;i++){
  19. next:
  20. s[i]=getchar();
  21. if(flag==0 && s[i]==' ')goto next;
  22. else flag=1;
  23. if(s[i]=='\n')break;
  24. }
  25. s[i]='\0';//结束掉字符串
  26. }
  27. void error(){
  28. cout<<"Error in program.\n";
  29. exit(0);//退出程序
  30. }
  31. int isnumber(const char *s){
  32. for(int i=0;i<strlen(s);i++)
  33. if(s[i]<='0' || s[i]>='9')return 0;//不是数字字符
  34. return 1;
  35. }
  36. int isvalue(const char *s){
  37. for(int i=0;i<value_ptr;i++){
  38. if(strcmp(value[i].name,s)==0)return 1;
  39. }
  40. return 0;
  41. }
  42. int getpos(const char *vname){
  43. for(int i=0;i<value_ptr;i++){
  44. if(strcmp(value[i].name,vname)==0)return i;//下标
  45. }
  46. return -1;//未找到
  47. }
  48. void put_value(const char *name){
  49. int i=getpos(name);
  50. if(i==-1)error();
  51. if(value[i].type==0)printf("%d",value[i].vnum);
  52. else printf("%s",value[i].vstring);
  53. }
  54. int getnum_sub(const char *s){
  55. if(isvalue(s))return value[getpos(s)].vnum;//是变量
  56. int i;
  57. sscanf(s,"%d",&i);
  58. return i;//是数字
  59. }
  60. int getnum(const char *s){
  61. if(strcmp(s,"input()")==0){
  62. int n;
  63. cons>>n;
  64. return n;
  65. }
  66. char *p;
  67. char op;
  68. for(p=(char*)s;*p!='+'&&*p!='-'&&*p!='*'&&*p!='/'&&*p!='\0';p++);//找到运算符
  69. if(*p=='\0')return getnum_sub(s);//只有一个数的情况
  70. op=*p;*p='\0';//第一个数字到运算符结束
  71. char s1[100],s2[100];
  72. int n1,n2;
  73. strcpy(s1,s);strcpy(s2,p+1);
  74. n1=getnum_sub(s1);n2=getnum_sub(s2);
  75. if(op=='+')return n1+n2;
  76. else if(op=='-')return n1-n2;
  77. else if(op=='*')return n1*n2;
  78. else if(op=='/')return n1/n2;
  79. }
  80. int main(int argc,char** argv){
  81. if(argc!=2){//有一个要解释的文件参数
  82. cout<<"Cannot find source file.\n";
  83. return 0;
  84. }
  85. freopen(argv[1],"r",stdin);
  86. for(;;){
  87. get_word(s);
  88. if(strcmp(s,"print")==0){//调用print输出
  89. get_string(s);
  90. if(isnumber(s))cout<<s;
  91. else if(s[0]=='\"' && s[strlen(s)-1]=='\"'){
  92. for(int i=1;i<strlen(s)-1;i++){
  93. if(s[i]=='\\' && s[i+1]=='n'){
  94. printf("\n");i++;
  95. }
  96. else printf("%c",s[i]);
  97. }
  98. }
  99. else if(isvalue(s)){
  100. put_value(s);
  101. }
  102. else error();
  103. }
  104. else if(strcmp(s,"exit")==0){//退出程序
  105. return 0;
  106. }
  107. else if(strcmp(s,"dim")==0){//声明变量
  108. char sa[255],sb[255],sc[255];
  109. get_word(sa);get_word(sb);get_word(sc);
  110. if(strcmp(sb,"as")!=0)error();
  111. strcpy(value[value_ptr].name,sa);
  112. if(strcmp(sc,"int")==0)value[value_ptr].type=0;
  113. else if(strcmp(sc,"string")==0)value[value_ptr].type=1;
  114. else error();
  115. value_ptr++;
  116. }
  117. else if(isvalue(s)){//变量的赋值语句
  118. char sa[255],sb[255];
  119. get_word(sa);get_string(sb);
  120. if(strcmp(sa,"=")!=0)error();
  121. if(value[getpos(s)].type==0)value[getpos(s)].vnum=getnum(sb);
  122. else {
  123. sb[strlen(sb)-1]='\0';//去掉最后的双引号
  124. strcpy(value[getpos(s)].vstring,sb+1);//复制的时候去掉前面的双引号
  125. }
  126. }
  127. else{
  128. error();
  129. }
  130. }
  131. }
(0)

相关推荐

  • VS2019的调试功能学习(烫烫烫)

    我编写了个大数减法的程序但是会出现很奇怪的报错,然后我就一路百度... 现在我们尝试对以下代码用VS2019进行调试修改bug: //源文件main.cpp #include<stdio.h&g ...

  • 无符号整型数的反转

    在编写这道题的程序时,费了老大劲才写出了这样的程序:(小白求轻拍) unsigned char reverse_bit_char(unsigned char y) { int i = 0; unsig ...

  • 【原创】自制编程语言-8 if语句

    隔了几天,我们继续.上次说的get_string的问题,暂时放在一边,我们到时候会专门开一章做修改的. 今天我们的目标是if语句,这还是有点难度的,尤其是嵌套if语句,现在笔者已经不知道怎么去做了.算 ...

  • 【原创】自制编程语言-7 注释&if语句初步

    这次我们尝试制作注释的功能.注释是几乎所有编程语言都有的功能.不同语言的注释符号也不尽相同.汇编语言的注释符号为":".C++的注释符号为"//".PYTHON ...

  • 【原创】自制编程语言-9 嵌套if语句(1)

    今天我们继续if语句的制作.在开始之前,我们先来分析一下. 我们可以用一个变量存放当前if的值.如果当前if为0,我们不执行任何东西,直到endif使得当前if为1.事实上,如果是嵌套的if,我们同样 ...

  • 【原创】自制编程语言-9 嵌套if语句(2)

    昨天干了一晚上的调试工作,这嵌套if可是真的烦. 首先先报告一些昨天的错误.(貌似昨天做的栈整个全部是错的)不运行不知道,一运行吓一跳. 这才是真正正确的代码.结构体指针的引用不可以用".& ...

  • 【原创】自制编程语言-1 最小编程语言

    一开始,不要想的太难,从最简单的开始,一点一点添加功能,到最后,你就会发现,结果就很像是一个完整的编程语言了. 首先,我们先抛开一切问题,先说说如何对这个编程语言进行编译或是解释.用编译型的语言实在是 ...

  • 【原创】自制编程语言-2 添加新功能

    现在我们可以添加一些新功能了.首先,我们现在的print无法输出换行,所以,我们需要增加一个转义字符\n来进行换行. else if(s[0]=='\"' && s[strl ...

  • 【原创】自制编程语言-3 变量定义

    这一次,我们来尝试制作变量.变量是基本上所有编程语言都有的功能.为了编辑起来方便,这里我制作的编程语言就必须先声明再使用,否则在赋值语句的时候可能会很麻烦. 定义变量的语句,每一个编程语言都是有不同的 ...

  • 【原创】自制编程语言-4 变量的输出

    这次我们来输出变量.输出变量需要两个函数,判断字符串是否为变量名,以及根据type来输出变量. int isvalue(const char *s){ for(int i=0;i<value_p ...

  • 【原创】自制编程语言-5 变量的赋值(1)

    首先我们先看这个函数: void put_value(const char *name){ for(int i=0;i<value_ptr;i++){ if(strcmp(value[i].na ...