📄 function.h
字号:
//function.h
//单词识别器,input为原串,des存放识别出的单词,len为des的长度,
//pos为原串的识别位置,返回单词种类:1--数字,2--变量,0--操作符和保留字
#include "stack.h"
int isnum(char ch)
{
return (ch>='0'&&ch<='9');
}
int isop(char ch)
{
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='^')
return 1;
return 0;
}
int issmallchar(char ch)
{
return (ch>='a'&&ch<='z');
}
int isbigchar(char ch)
{
return (ch>='A'&&ch<='Z');
}
int ischar(char ch)
{
return issmallchar(ch)||isbigchar(ch);
}
int getword(char input[],char des[],int &len,int &pos)
{
if(isop(input[pos]))
{
len=1;
des[0]=input[pos];
des[1]='\0';
pos++;
return 0;
}
if(isnum(input[pos]))
{
len=1;
des[len-1]=input[pos];
pos++;
while(isnum(input[pos]))
{
len++;
des[len-1]=input[pos];
pos++;
}
des[len]='\0';
return 1;
}
if(ischar(input[pos]))
{
len=1;
des[len-1]=input[pos];
pos++;
while(isnum(input[pos])||ischar(input[pos]))
{
len++;
des[len-1]=input[pos];
pos++;
}
des[len]='\0';
return 2;
}
if(input[pos]=='#')
{
len=1;
des[len-1]=input[pos];
des[len]='\0';
pos++;
return 3;// input到结尾了!
}
if(input[pos]==' ')
{
len=0;
pos++;
return 4;//过滤空格
}
len=0;
pos++;
return 5;//遇到不能够识别字符,报错并且跳过
}
int getwordrank(char ch1,char ch2)//只能比较两个字符
{
if(isnum(ch1)||issmallchar(ch1))
ch1='i';
if(isnum(ch2)||issmallchar(ch2))
ch2='i';
if(ch1=='+'||ch1=='-')
{
if(ch2=='+'||ch2=='#'||ch2==')'||ch2=='-')
return 1;
else
return -1;
}
if(ch1=='*'||ch1=='^'||ch1=='/')
{
if(ch2=='^'||ch2=='('||ch2=='i')
return -1;
else
return 1;
}
if(ch1=='i'||ch1==')')
{
if(ch2=='i'||ch2=='(')
return 2;
else
return 1;
}
if(ch1=='(')
{
if(ch2=='#')
return 2;//error
else
if(ch2==')')
return 0;
return -1;
}
if(ch1=='#')
{
if(ch2=='#')
return 0;
else
if(ch2==')')
return 2;
else
return -1;
}
return 2;
//0表示等于,1表示大于,-1表示小于,2表示没有优先关系
}
int getrank(char str1[],char str2[])
{
char ch1=str1[0],ch2=str2[0];
return getwordrank(ch1,ch2);
}
int newtemp(char str[],int i)
{ //这里产生的变量不会超过999
str[0]='T';
int j=1;
if(i>=100)
{
str[1]=i/100+'0';
i/=10;
str[2]=i/10+'0';
str[3]=i%10+'0';
str[4]='\0';
return 4;
}
else
if(i>9)
{
str[1]=i/10+'0';
str[2]=i%10+'0';
str[3]='\0';
return 3;
}
else
{
str[1]=i+'0';
str[2]='\0';
return 2;
}
}
void transnode(node nod,char str[])
{
for(int i=0;i<nod.namelen;i++)
str[i]=nod.name[i];
str[i]='\0';
}
void transblock(block bl,char str[],int type)
{
int i;
if(type==1)
{
for(i=0;i<int(strlen(bl.v1));i++)
str[i]=bl.v1[i];
}
else
if(type==2)
{
for(i=0;i<int(strlen(bl.v2));i++)
str[i]=bl.v1[i];
}
else
if(type==3)
{
for(i=0;i<int(strlen(bl.result));i++)
str[i]=bl.result[i];
}
str[i]='\0';
}
int chisvt(char str[])
{
return isnum(str[0])||isop(str[0])||str[0]=='#';
}
int nodeisvt(node nod)
{
return chisvt(nod.name);
}
void out(int num,char ch)
{
for(int i=0;i<num;i++)
cout<<ch;
}
node guiyue(node ch[],int len,stack1 &snum,stack1 &svar,stack1 &s,int &num)
{
if(len<1||len>3)
{
cout<<"规约出错!"<<endl;
exit(0);
}
char str[4];
node tem;
int leng,flag=1,i;
if(len==1)
{
leng=newtemp(str,num);
num++;
tem.encode=2;
tem.namelen=leng;
for(int i=0;i<leng;i++)
tem.name[i]=str[i];
tem.name[i]='\0';
tem.value=snum.search(ch[0].name,len,flag);
s.push(tem);
svar.push(tem);
out(35,' ');
cout<<ch[0].name<<" 规约为:"<<tem.name<<"="<<tem.value<<" 不产生代码!"<<endl;
}
else
if(len==3)
{
if(chisvt(ch[1].name))
{
int num1,num2;
leng=newtemp(str,num);
num++;
tem.encode=2;
tem.namelen=leng;
for(int i=0;i<leng;i++)
tem.name[i]=str[i];
tem.name[i]='\0';
num1=svar.search(ch[0].name,ch[0].namelen,flag);
flag=1;
num2=svar.search(ch[2].name,ch[2].namelen,flag);
if(ch[1].name[0]=='+')
tem.value=num1+num2;
else
if(ch[1].name[0]=='-')
tem.value=num1-num2;
else
if(ch[1].name[0]=='*')
tem.value=num1*num2;
else
if(ch[1].name[0]=='/')
tem.value=num1/num2;
else
if(ch[1].name[0]=='^')
{
int t=1;
for(i=0;i<num2;i++)
t*=num1;
tem.value=t;
}
s.push(tem);
svar.push(tem);
out(35,' ');
for(i=0;i<3;i++)
cout<<ch[i].name;
cout<<" 规约为:"<<tem.name<<"="<<tem.value<<" 产生代码:"<<"('"<<ch[1].name[0]<<"',"<<ch[0].name<<","<<ch[2].name<<","<<tem.name<<")"<<endl;
}
else
{
leng=newtemp(str,num);
num++;
tem.encode=2;
tem.namelen=leng;
for(i=0;i<leng;i++)
tem.name[i]=str[i];
tem.name[i]='\0';
flag=1;
tem.value=svar.search(ch[1].name,ch[1].namelen,flag);
s.push(tem);
svar.push(tem);
out(35,' ');
for(i=0;i<3;i++)
cout<<ch[i].name;
cout<<" 规约为:"<<tem.name<<"="<<tem.value<<" 不产生代码!"<<endl;
}
}
return tem;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -