分享

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

 计算机知识杂谈 2021-06-01

一开始,不要想的太难,从最简单的开始,一点一点添加功能,到最后,你就会发现,结果就很像是一个完整的编程语言了。

首先,我们先抛开一切问题,先说说如何对这个编程语言进行编译或是解释。用编译型的语言实在是太麻烦了(因为要生成一个exe),所以就先按照解释型的语言来吧。

想要编译的话,肯定是用操作系统的命令行编译。输入类似于这样的指令。

提示符>编译器名 要编译的文件名

如何让程序读取这个要编译的文件名?首先,我们知道,在操作系统执行命令时,会运行整个指令中第一个程序名,然后,把后面的所有的参数通过参数的形式,传递到main函数里。

肯定又有人要问了,main函数不是int main(void)吗,哪里来的参数。但是,int main还有另外一种写法,int main(int argc,char** argv),其中,argc是参数的数量,argv是每一个参数。

这样,我们通过读取argv[1](argv[0]存放编译器的名字),就可以读取文件了。可以用类似的语句。freopen(argv[1],"r",stdin);

说回我们的编程语言。我们首先先做一个最简单的功能,也是几乎所有的编程语言都有的功能,输出功能。对于这个语言,我这里就这样定义了。

print xxx

其中,xxx可以放字符串(双引号括起来),数字常量,变量名,常量名。由于现在,还没有引入变量,我们先实现前两个功能,字符串和常数。

实现非常简单,我们读入一个字符串。如果字符串为"print",就再读一个,执行输出操作,否则视作错误。

print如果全部是数字,直接输出。(常数)

如果最前面的和最后面的都是双引号,就是字符串,去掉双引号输出。

#include<bits/stdc++.h>

using namespace std;

char s[100];

void get_word(char *s){//读入单词

scanf("%s",s);

}

void error(){

cout<<"Error in program.\n";

exit(0);//退出程序

}

int isnumber(const char *s){

for(int i=0;i<strlen(s);i++)

if(s[i]<='0' || s[i]>='9')return 0;//不是数字字符

return 1;

}

int main(int argc,char** argv){

if(argc!=2){//有一个要解释的文件参数

cout<<"Cannot find source file.\n";

return 0;

}

freopen(argv[1],"r",stdin);

for(;;){

get_word(s);

if(strcmp(s,"print")==0){//调用print输出

get_word(s);

if(isnumber(s))cout<<s;

else if(s[0]=='\"' && s[strlen(s)-1]=='\"'){

for(int i=1;i<strlen(s)-1;i++)putchar(s[i]);

}

else error();

}

else if(strcmp(s,"exit")==0){//退出程序

return 0;

}

else{

error();

}

}

}

其中,为了调试方便,增加了exit指令,为了退出程序,避免死循环。

当然,现在的程序还有一个问题,如果输出的内容有空格就不行。例如,

print "hello     world"

这样,因为scanf只读入了"hello,后面的没有读进来,后面的会在下一次读入中,不是print也不是exit,从而报错。下一次我们来解决这个问题。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多