我的这个程序的目的是在程序(.exe)内输入一种代码,让这段代码执行。
这是程序的运行图。
那句 End of Program 就是代码输入的结束,后面的是程序的运行结果。
代码规则:
- 支持int、double、string、long(就是long long)、char类型。
- 支持“句首关键字”newvar(创建新变量)、change(改变变量的值)、input(输入变量的值)、output(输出变量的值)。
- 支持其它的关键字int、double、string、long、char、value、var、语句 “ End of Program; ”。
- 变量名可以与关键字重名。
- 变量名不允许带空白字符,其它的名称均可。
- 字符串中不允许带空白字符。
- 代码以语句 “ End of Program; ” 结束。
- newvar语句使用规则: newvar 类型 变量名 值/另一个变量名 初始化为值/另一个变量的值 ;
- change语句使用规则: change 类型 变量名 值/另一个变量名 改变为值/另一个变量的值 ;
- input语句使用规则: input 类型 变量名 ;
- output语句使用规则: output 类型 变量名 ;
- 在newvar/change语句中,如果类型为char,值又是多个字符,以第一个字符为值。
- 字符和字符串不用加上引号。
我本来想加上表达式功能的,但是写到快结束时发现有问题。有人想到解决办法请在这篇文章中评论。
这是我的代码:
#include<iostream>
#include<vector>
#include<sstream>
#include<cmath>
using namespace std;
//==========for calculating expressions==========
template<typename T>
T fac(T Tx){
T ans=1;
for(;Tx>1;Tx--) ans*=Tx;
return ans;
}
template<typename Tans,typename T1,typename T2>
Tans calcu(T1 first_value,char op,T2 second_value){
T1 value1=&first_value;
T2 value2=&second_value;
switch(op){
case '+': return value1+value2;
case '-': return value1-value2;
case '*': return value1*value2;
case '/': return value1/value2;
case '%': return value1%value2;
case '^': return pow(value1,value2);
case '!': return fac(value1);
case '&': return value1&value2;
case '|': return value1|value2;
case '#': return value1^value2;
case '<': return value1<<value2;
case '>': return value1>>value2;
}
}
//==============for using sentences==============
void getline(string &strx,char endline='\n'){ // not including endline
strx="";
for(;;){
char c=getchar();
if(c==endline) break;
else strx+=c;
}
cout.flush();
}
template<typename Tfrom,typename Tto>
Tto typecast(Tfrom from){
stringstream temp;
temp<<from;
Tto to;
temp>>to;
return to;
}
void erase_space(string &strx){ //use it to erase parts' space(s)
if(strx.empty()) return;
for(int i=0;i<strx.size();i++){
while(strx[i]==' '||strx[i]=='\t'||strx[i]=='\n'){
strx.erase(i,1);
}
}
}
struct expre_2{
string first,second;
char oper;
};
bool isoper(char c){
return c=='+'||c=='-'||c=='*'||c=='/'||c=='%'||c=='^'||c=='!' //'^'==pow '!'==fac
||c=='&'||c=='|'||c=='#'||c=='<'||c=='>'; //'#'==xor '<'=="<<" '>'==">>"
}
expre_2 depart_expre(string strx){
expre_2 ans;
int pos=0;
while(!isoper(strx[pos])){
ans.first+=strx[pos++];
}
ans.oper=strx[pos++];
while(pos<strx.size()){
ans.second+=strx[pos++];
}
return ans;
}
struct vecs{
vector<int> pint;
vector<double> pdou;
vector<string> pstr;
vector<long long> pll;
vector<char> pchar;
vector<string> nameint,namedou,namestr,namell,namechar;
// vector<bool> pbool;
};
vecs vars;
template<typename T>
T* find_var(string varname,vector<T> &p_,vector<string> &name_){
for(int i=0;i<name_.size();i++){
if(name_[i]==varname){
return &p_[i];
}
}
return 0;
}
int main(){
for(;;){
vecs inputs,outputs;
vector<string> program;
cout<<"\nProgram:\n";
for(;;){
string temp;
getline(temp,';');
program.push_back(temp);
if(temp=="End of Program"||temp=="\nEnd of Program") break;
}
// cout<<program.size()<<"\n";
for(int i=0;i<program.size();i++){
//depart the sentences:
string &proi=program[i];
vector<string> parts;
parts.push_back("");
for(int j=0,nowpart=0;j<proi.size();j++){
if(proi[j]==' '||proi[j]=='\t'||proi[j]=='\n'){
if(j==0) continue;
erase_space(parts[nowpart]);
parts.push_back("");
nowpart++;
}
else parts[nowpart]+=proi[j];
}
//use the parts:
#define tc typecast
#define fv find_var
#define ifp(strname) if(parts[1]==strname)
#define pn(type) vars.p##type,vars.name##type //for find_var
if(parts[0]=="newvar" && parts[4]=="value"){
#define var_pb(type) vars.p##type.push_back
#define newname(type,new_name) vars.name##type.push_back(new_name)
typedef string s;
ifp("int") newname(int,parts[2]),var_pb(int)(tc<s,int>(parts[3]));
ifp("double") newname(dou,parts[2]),var_pb(dou)(tc<s,double>(parts[3]));
ifp("string") newname(str,parts[2]),var_pb(str)(parts[3]);
ifp("long") newname(ll,parts[2]),var_pb(ll)(tc<s,long long>(parts[3]));
ifp("char") newname(char,parts[2]),var_pb(char)(parts[3][0]);
}
if(parts[0]=="change" && parts[4]=="value"){
typedef string s;
ifp("int") *fv<int>(parts[2],pn(int))=tc<s,int>(parts[3]);
ifp("double") *fv<double>(parts[2],pn(dou))=tc<s,double>(parts[3]);
ifp("string") *fv<string>(parts[2],pn(str))=parts[3];
ifp("long") *fv<long long>(parts[2],pn(ll))=tc<s,long long>(parts[3]);
ifp("char") *fv<char>(parts[2],pn(char))=parts[3][0];
}
if(parts[0]=="input"){
cout<<"NOW INPUT THE VAR "<<parts[2]<<" : ";
ifp("int") cin>>*fv<int>(parts[2],pn(int));
ifp("double") cin>>*fv<double>(parts[2],pn(dou));
ifp("string") cin>>*fv<string>(parts[2],pn(str));
ifp("long") cin>>*fv<long long>(parts[2],pn(ll));
ifp("char") cin>>*fv<char>(parts[2],pn(char));
cout<<"The end of input.\n";
}
if(parts[0]=="output"){
cout<<"YOUR OUTPUT FOR VAR "<<parts[2]<<" : ";
ifp("int") cout<<*fv<int>(parts[2],pn(int));
ifp("double") cout<<*fv<double>(parts[2],pn(dou));
ifp("string") cout<<*fv<string>(parts[2],pn(str));
ifp("long") cout<<*fv<long long>(parts[2],pn(ll));
ifp("char") cout<<*fv<char>(parts[2],pn(char));
cout<<"\nThe end of output.\n";
}
if(parts[0]=="newvar" && parts[4]=="var"){
#define var_pb(type) vars.p##type.push_back
#define nn(type,new_name) vars.name##type.push_back(new_name)
typedef string s;
ifp("int") nn(int,parts[2]),var_pb(int)(*fv<int>(parts[3],pn(int)));
ifp("double") nn(dou,parts[2]),var_pb(dou)(*fv<double>(parts[3],pn(dou)));
ifp("string") nn(str,parts[2]),var_pb(str)(*fv<string>(parts[3],pn(str)));
ifp("long") nn(ll,parts[2]),var_pb(ll)(*fv<long long>(parts[3],pn(ll)));
ifp("char") nn(char,parts[2]),var_pb(char)(*fv<char>(parts[3],pn(char)));
}
if(parts[0]=="change" && parts[4]=="var"){
typedef string s;
ifp("int") *fv<int>(parts[2],pn(int))=*fv<int>(parts[3],pn(int));
ifp("double") *fv<double>(parts[2],pn(dou))=*fv<double>(parts[3],pn(dou));
ifp("string") *fv<string>(parts[2],pn(str))=*fv<string>(parts[3],pn(str));
ifp("long")*fv<long long>(parts[2],pn(ll))=*fv<long long>(parts[3],pn(ll));
ifp("char") *fv<char>(parts[2],pn(char))=*fv<char>(parts[3],pn(char));
}
if(parts[0]=="newvar" && parts[4]=="expre"){ //expression //how can I finish it?
#define var_pb(type) vars.p##type.push_back
#define nn(type,new_name) vars.name##type.push_back(new_name)
typedef string s;
expre_2 expre=depart_expre(parts[3]);
struct{
int vint; double vdou; string vstr; long long vll; char vchar;
}cast1,cast2,ans;
if(parts[5]=="int"){
cast1.vint=tc<s,int>(expre.first);
typedef int type5;
}
if(parts[5]=="double"){
cast1.vdou=tc<s,double>(expre.first);
typedef double type5;
}
if(parts[5]=="string") cast1.vstr=expre.first;
if(parts[5]=="long") cast1.vll=tc<s,long long>(expre.first);
if(parts[5]=="char") cast1.vll=expre.first[0];
if(parts[6]=="int") cast2.vint=tc<s,int>(expre.second);
if(parts[6]=="double") cast2.vdou=tc<s,double>(expre.second);
if(parts[6]=="string") cast2.vstr=expre.second;
if(parts[6]=="long") cast2.vll=tc<s,long long>(expre.second);
if(parts[6]=="char") cast2.vll=expre.second[0];
// ifp("int") nn(int,parts[2]),var_pb(int)(calcu<int,type5,type6>(cast1.???));
// ifp("double") nn(dou,parts[2]),var_pb(dou)(*fv<double>(parts[3],pn(dou)));
// ifp("string") nn(str,parts[2]),var_pb(str)(*fv<string>(parts[3],pn(str)));
// ifp("long") nn(ll,parts[2]),var_pb(ll)(*fv<long long>(parts[3],pn(ll)));
// ifp("char") nn(char,parts[2]),var_pb(char)(*fv<char>(parts[3],pn(char)));
// #define (up) into if(parts[6]=="type") sentences
}
}
vars.namechar.clear(),vars.namedou.clear(),vars.nameint.clear(),
vars.namell.clear(),vars.namestr.clear(),vars.pchar.clear(),vars.pdou.clear(),
vars.pint.clear(),vars.pll.clear(),vars.pstr.clear();
}
return 0;
}
欢迎转载,但请在文章中附加上本文链接: https://blog.csdn.net/weixin_41461277/article/details/84851046 。