帮助小明翻译他的编程语言

翻译程序
小明初学C++,已明白了四则运算、关系运算、逻辑运算、赋值运算、输入输出、简单选择和循环结构的用法,但他的英语不太好,记不住太多的保留字,于是他利用汉语拼音做保留字,山寨C++,发明了一种表达自己思想的算法描述规则。
规则很简单:他将开始程序头部以一个拼音名字标记,C++程序中的"{,}"用拼音“kaishi,jieshu”直观表示;选择和循环只采用一种单一的结构,且保留字也分别用对应的拼音表示,不过在表示选择或循环条件时他去掉了多余的小括号;输入输出也用拼音表示;数据类型只保留了整型(int)和实型(float),并用拼音表示,且按他的习惯变量在前,类型在后。
现在小明想请熟悉C++的你帮他写一个程序,将用他设计的算法描述规则写成的算法,翻译成C++源码。输入文件扩展名为.ming,输出文件扩展名为.cpp,如下例:

小明算法(test.ming):
chengxu1
kaishi
i,j zhengxing;
k shixing;
i=1;j=0;
shuru k;
xunhuan i<10
kaishi
j=j+i;
i++;
jieshu
ruguo j>10
kaishi
k=j*1.0/i;
jieshu
shuchu k,j;
jieshu

翻译成的C++源码(test.cpp):
#include <iostream>
using namespace std;
int main()
{
int i,j;
float k;
i=1;j=0;
cin>>k;
while( i<10)
{
j=j+i;
i++;
}
if(j>10)
k=j*1.0/i;
cout<<k<<j;
return 0;

}

#include<stdio.h>
#include<string.h>
#define MaxSize 1000
static int point=0;                                    //记录执行到被翻译字符串位置
int pointBefore=0;
typedef struct
{
	char data[MaxSize];     //存放字符串
	int length;             //存放串长
}SqString;


//将伪代码中的标志字符转化成SqString的形式
SqString changeSign(char sign[])
{
	int i;
	SqString str;
	for(i=0;sign[i]!='\0';i++)
	{
		str.data[i]=sign[i];
	}
	str.length=i;
	return str;
}
void StrAssign(SqString &s,char cstr[])     //将一个字符串常量赋给串s(s为引用型参数)
{
	int i;
	for(i=0;cstr[i]!='\0';i++)
	{
		s.data[i]=cstr[i];
	}
	s.length=i;
}

int index(SqString s,SqString t)            //BF算法 串的模式皮匹配
{
	int i=0,j=0;
	while(i<s.length&&j<t.length)
	{
		if(s.data[i]==t.data[j])           //继续匹配下一个字符
		{
			i++;                           //主串和字串依次匹配下一个节点
			j++;
			point++;
		}
		else
		{
			i=i-j+1;
			j=0;
		}
	}
		if(j>=t.length)
			return (i-t.length);
		else
			return(-1);
	
}

/*******用于第一次匹配时出现while和if情况时对后面条件语句范围的确定*/
int indexKaishi(SqString s,SqString t)            //BF算法 串的模式皮匹配
{
	int i=point,j=0;
	while(i<s.length&&j<t.length)
	{
		if(s.data[i]==t.data[j])           //继续匹配下一个字符
		{
			i++;                           //主串和字串依次匹配下一个节点
			j++;
		}
		else
		{
			i=i-j+1;
			j=0;
		}
	}
		if(j>=t.length)
			return (i-t.length);
		else
			return(-1);
	
}

bool piPei(SqString s,SqString t)            //BF算法 串的模式皮匹配
{
	int i=point,j=0;int startAddres=point;
	while(i<s.length&&j<t.length)
	{
		if(s.data[i]==t.data[j])           //继续匹配下一个字符
		{
			i++;                           //主串和字串依次匹配下一个节点
			j++;
			point++;
		}
		else
		{
			point=startAddres;
			return false;
		}
	}
		if(j>=t.length)
			return true;// (i-t.length);下标
		else
			return false;
	
}

//主要用在第二种情况匹配时,获取分号的下标
int indexFenhao(SqString s)            
{
	int i=point;
    SqString ex;
	char exe[]={";"};
	StrAssign(ex,exe);
	while(i<s.length)
	{
		if(s.data[i]==ex.data[0])        
			break;                          
		else
			i++;
	}
    return i-1;
	
}
/*当在第一遍查找没有符合匹配规则的标志字符串时,开始从分号前面截取特定长度的字符串,进行第二次字符匹配*/
//返回串s中从下标为(1<=i<=StrLength(s))的字符开始的到下标为j的字符组成的子串。参数不正确时返回一个空串
SqString SubStr(SqString s,int i,int j)
{
	SqString str;
	int k,n;
	str.length=0;
	if(i<0||i>s.length||j<0)
		return str;
	for(n=0,k=i;k<=j;k++,n++)
		str.data[n]=s.data[k];
	str.length=n;
//	point=point+str.length+1;    //为修补第三次匹配时出现的BUG增加的语句,第二次匹配完成时没有此条语句,因为不止在第三种匹配时调用此函数所以结果修补错误,将语句放在了piPeiSame3中
	return str;
}

bool secondPiPei(SqString s,SqString t)            //BF算法 串的模式皮匹配
{
	int i=0,j=0;
	while(i<s.length&&j<t.length)
	{
		if(s.data[i]==t.data[j])           //继续匹配下一个字符
		{
			i++;                           //主串和字串依次匹配下一个节点
			j++;
		}
		else
		{
		return false;
		}
	}
		if(j>=t.length)
		{
			return true;
		}
		else
			return false;
	
}



//输出串

void DispStr(SqString s)                    //输出串S中的所有值
{
	int i;
	if(s.length>0)
	{
		for(i=0;i<s.length;i++)
			printf("%c",s.data[i]);
	}
	return;
}


//伪代码中,输入输出语句的优化处理,如果出现“,”则将其转换成“<<”或者“>>”;
void input(SqString s)
{
	int i;
	SqString ex;
	char exe[]={","};
	StrAssign(ex,exe);
	for(i=0;i<s.length;i++)
	{
		if(s.data[i]==ex.data[0])
			printf(">>");
		else
			printf("%c",s.data[i]);
	}
	printf(";\n");
}
void output(SqString s)
{
	int i;
	SqString ex;
	char exe[]={","};
	StrAssign(ex,exe);
	for(i=0;i<s.length;i++)
	{
		if(s.data[i]==ex.data[0])
			printf("<<");
		else
			printf("%c",s.data[i]);
	}
	printf(";\n");
}

//遍历串
void BianLiTxt()
{

}

/*******************************匹配规则
chengxu1 => #include<iostream> using namespace std;
kaishi   => {
,        => ,
jieshu   => }
zhengxing=> int 
shixing  => float
xunhuan  => while      输出while之后,需要自行输出()和kaishi 之前的内容
ruguo    => if         输出if之后,需要自行输出()和kaishi 之前的内容
shuchu   => cout<<
***************************************************/
//实现翻译程序的主要部分的函数

void judgeSame3(SqString s){   //在第二次匹配失败的情况下,进行第三种方式匹配
   
    DispStr(SubStr(s,pointBefore,indexFenhao(s)));
    printf(";");
	printf("\n");
	point=indexFenhao(s)+2;                

}
void judgeSame2(SqString s)    //在第一次匹配失败的情况下,进行第二种方式匹配
{
    if(secondPiPei(SubStr(s,indexFenhao(s)-8,indexFenhao(s)),changeSign("zhengxing"))==true)      //截取分号前9个字符与zhengxing比较判断
	{
         printf("int ");
         DispStr(SubStr(s,pointBefore,indexFenhao(s)-9));
		  printf(";");
	      printf("\n");
   		 point=indexFenhao(s)+2;
	}
	else if(secondPiPei(SubStr(s,indexFenhao(s)-6,indexFenhao(s)),changeSign("shixing"))==true)
	{
         printf("float ");
         DispStr(SubStr(s,pointBefore,indexFenhao(s)-7));
		 printf(";");
	     printf("\n");
   		 point=indexFenhao(s)+2;
	}
    else
	  judgeSame3(s);

}
void judgeSame1(SqString s)    //第一次匹配
{
	
	while(point<s.length)
	{
     	if(piPei(s,changeSign("chengxu1"))==true)                       //chengxu1
		{
			pointBefore=point;                                          //用于记录匹配之后的point的位置,方便出现第二种情况时,输出数据类型与上一次匹配位置之间的字符串     
			printf("#include<iostream>\nusing namespace std;\nint main()\n");
			
		}
	   else if(piPei(s,changeSign("kaishi"))==true)                     //kaishi
		{
		    pointBefore=point;
			printf("{\n");
		
		}
	 /*  else if(piPei(s,changeSign(","))==true)                          //,      
	   {
		   printf(",");
               
	   }*/
	   else if(piPei(s,changeSign("xunhuan"))==true)                    //xunhuan
	   {
		   pointBefore=point;  
		   printf("while(");                                           //需要对while 和if情况单独处理
           DispStr(SubStr(s,pointBefore,indexKaishi(s,changeSign("kaishi"))-1));
		   printf(")\n");
		   point=indexKaishi(s,changeSign("kaishi"));
	   }
	   else if(piPei(s,changeSign("ruguo"))==true)                      //ruguo
	   {
		   pointBefore=point;  
		   printf("if(");
		   DispStr(SubStr(s,pointBefore,indexKaishi(s,changeSign("kaishi"))-1));
		   printf(")\n");
		   point=indexKaishi(s,changeSign("kaishi"));
	   }
	    else if(piPei(s,changeSign("shuru"))==true)                    //需要对输入后面的内容进行判断是否含有,   
	   {
	       pointBefore=point;  
		   printf("cin>>");
		   input(SubStr(s,pointBefore,indexFenhao(s)));
		   point=indexFenhao(s)+2;

	   }
	   else if(piPei(s,changeSign("shuchu"))==true)                    //需要对输出后面的内容进行判断是否含有,
	   {
		   pointBefore=point;  
		   printf("cout<<");
		   output(SubStr(s,pointBefore,indexFenhao(s)));
		   point=indexFenhao(s)+2;
	   }
	   else if(piPei(s,changeSign("jieshu"))==true)
	   {
		   pointBefore=point;  
		   if(pointBefore+2>s.length)
		   {
			   printf("return 0;\n}\n");
		   }
		   else
		     printf("}\n");
	   }
	   else
	   {
		   pointBefore=point;  
		   judgeSame2(s);
	   }
		   
    }
}

int main()
{
	SqString s;
    char cstr[MaxSize]={"chengxu1kaishii,j zhengxing;k shixing;i=1;j=0;shuru k;xunhuan i<10kaishij=j+i;i++;jieshuruguo j>10kaishik=j*1.0/i;jieshushuchu k,j;jieshu"};
	StrAssign(s,cstr);
    judgeSame1(s);
	
	return 0;
}


posted @ 2016-11-15 19:51  壹言  阅读(319)  评论(0编辑  收藏  举报