【原创】自制编程语言-1 最小编程语言
一开始,不要想的太难,从最简单的开始,一点一点添加功能,到最后,你就会发现,结果就很像是一个完整的编程语言了。
首先,我们先抛开一切问题,先说说如何对这个编程语言进行编译或是解释。用编译型的语言实在是太麻烦了(因为要生成一个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,从而报错。下一次我们来解决这个问题。