📄 赋值翻译.cpp
字号:
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<search.h>
#include<iostream.h>
#include<stdlib.h>
struct stackNode
{
char data;
struct stackNode *nextptr;
};
typedef struct stackNode STACKNODE;
typedef STACKNODE * STACKNODEPTR;
STACKNODEPTR topPtr=NULL;
void convertToPostfix(char *infix, char *postfix); //把中缀表达式转化成后缀表达式
int isOperator(char c); //判断c是否是一个运算符
int precedence(char operator1, char operator2); /*判断
operator1(栈顶)的优先级是低于、等于还是高于
operator2(当前)的优先级,对应的函数的返回值分别是-1,0和1*/
void push(STACKNODEPTR *topPtr, char value); //把一个值压入堆栈
char pop(STACKNODEPTR *topPtr); //从堆栈中弹出一个值
char stackTop(STACKNODEPTR topPtr); //返回栈顶的值但不把这个值从堆栈中弹出
int isEmpty(STACKNODEPTR topPtr); //判断堆栈是否为空,返回1代表空.0代表非空
void printStack(STACKNODEPTR topPtr); //打印堆栈
extern int reserve(char*);
extern void output(int,char*);
char token[20];
static char infix[30];
char ch;
int i,c,f;
void scanner(FILE *fp)
{
ch=fgetc(fp); //fgetc()是用来从文件中读取内容的。它可不管读到的内容是什么东西
if(isalpha(ch)) //isalpha()如果是字母,返回真
{
token[0]=ch;
i=1;
ch=fgetc(fp);
while(isalpha(ch)||isalnum(ch)) //isalnum()函数当参数是数字或者字母的时候返回非0值,其它是0
{
token[i]=ch;
i++;
ch=fgetc(fp);
}
fseek(fp,-1,1); //移动
token[i]='\0';
c=reserve(token);
if(c!=-1)
output(c,token);
else
output(10,token);
}
else if(isdigit(ch)) //isdigit() 如果参数是0,1,...,9中的一个字符,返回真,否则返回假,就是判断字符是否数字
{
token[0]=ch;
ch=fgetc(fp); //fgetc()是用来从文件中读取内容的。它可不管读到的内容是什么东西。
i=1;
while(isdigit(ch))
{
token[i]=ch;
i++;
ch=fgetc(fp);
}
token[i]='\0';
fseek(fp,-1,1);
output(1,token);
}
else
switch(ch)
{
case'=':ch=fgetc(fp);
if(ch=='=')
output(39,"==");
else
{
fseek(fp,-1,1);
output(21,"=");
}
break;
case'+':output(22,"+");break;
case'-':output(23,"-");break;
case'*':output(24,"*");break;
case'/':output(25,"/");break;
case'(':output(26,"(");break;
case')':output(27,")");break;
case'[':output(28,"[");break;
case']':output(29,"]");break;
case'{':output(30,"{");break;
case'}':output(31,"}");break;
case',':output(32,",");break;
case':':output(33,":");break;
case';':output(34,";");break;
case'>':ch=fgetc(fp);
if(ch=='=')
output(37,">=");
else
{
fseek(fp,-1,1);
output(35,">");
}
break;
case'<':ch=fgetc(fp);
if(ch=='=')
output(38,"<=");
else
{
fseek(fp,-1,1);
output(36,"<");
}
break;
case'!':ch=fgetc(fp);
if(ch=='=')
output(40,"!=");
else
{
fseek(fp,-1,1);
output(-1,"ERROR!");
}
break;
}
}
/**************************search.h*********************************/
extern struct table
{
int id;
char code[10];
};
struct table key[31] = {{1,"main"},{2,"int"},{3,"char"},{4,"if"},{5,"else"},{6,"for"},{7,"while"},{8,"case"},{9,"break"},{10,"ID"},{20,"NUM"},{-1,"ERROR"}};
int reserve(char* p)
{ int i=0;
for(i=0;i<9;i++)
{
if(strcmp(p,key[i].code)==0) //strcmp(s1,s2) 对字符串s1和s2进行比较,返回比较结果--相等返回0,s1>s2时返回正数,s1<s2时返回负数
return(key[i].id);
}
return(-1);
}
void output(int t,char *s)
{ int i;
printf("[ %-2d , %-6s ]\n",t,s);
ch=*s;
if(ch!=' ')
infix[f]=ch;
f++;
}
void main()
{
FILE *fp;
char wenjian[30];
int i;
cout<<"1表示数字和关键字的main;2表示int;3表示char;4表示if;5表示else;6表示for;"<<endl;
cout<<"7表示while;8表示case;9表示break10表示ID;20表示NUM;-1表示ERROR;22表示+;"<<endl;
cout<<"23表示-;24表示*;25表示/;26表示(;27表示);28表示[;29表示];30表示{;31表示};"<<endl;
cout<<"32表示,;33表示:;34表示;;35表示>;36表示<;37表示>=;38表示<=;39表示==;40!=;"<<endl;
printf("Please input the file you want to transform:");
scanf("%s",&wenjian);
fp=fopen(wenjian,"r"); //打开一个文件
while(!feof(fp))
{
scanner(fp);
}
//char infix[30];
char postfix[30];
//printf("Enter the expression.\n");
//scanf("%s", infix);
//for(i=0;i<30;i++)
//cout<<infix[i];
convertToPostfix(infix, postfix);
cout<<f<<endl;
}
void convertToPostfix(char *infix, char *postfix)//把中缀表达式转化成后缀表达式
{
int n, i=0,count=0;
n=strlen(infix);
for(i=0;i<n;i++)
{
if(isOperator(infix[i])==1)
{
if(infix[i]=='(')
push(&topPtr, infix[i]);
else
{
if(infix[i]==')')
{
while((isEmpty(topPtr)!=1)&&stackTop
(topPtr)!='(')
{
postfix[count]=pop(&topPtr);
count++;
}
pop(&topPtr);
}
else
{
if(isEmpty(topPtr)==1)
push(&topPtr, infix[i]);
else
{
while((isEmpty(topPtr)!=1)&&
(precedence(stackTop(topPtr), infix[i])>=0))
{
postfix[count]=pop(&topPtr);
count++;
}
push(&topPtr, infix[i]);
}
}
}
}
else
{
postfix[count]=infix[i];
count++;
}
}
while(isEmpty(topPtr)!=0)
{
postfix[count]=pop(&topPtr);
count++;
}
for(i=0;i<count;i++)
printf("%c", postfix[i]);
printStack(topPtr);
}
int isOperator(char c)//判断c是否是一个运算符
{
switch(c)
{
case '+': case '-': case '*': case '/': case '^': case '%':
case '(': case')':
return 1;
break;
default:
return 0;
break;
}
}
int precedence(char operator1, char operator2) /*判断
operator1(栈顶)的优先级是低于、等于还是高于
operator2(当前)的优先级,对应的函数的返回值分别是-1,0和1*/
{
switch(operator1)
{
case '^':
if(operator2=='^')
return 0;
else
return -1;
break;
case '*': case'/': case'%':
if(operator2=='^'||operator2=='(')
return -1;
if(operator2=='*'||operator2=='/'||operator2=='%')
return 0;
if(operator2=='+'||operator2=='-')
return 1;
break;
case '+': case '-':
if
(operator2=='^'||operator2=='*'||operator2=='/'||operator2=='%'
)
return -1;
if(operator2=='+'||operator2=='-')
return 0;
if(operator2=='(')
return -1;
break;
}
}
void push (STACKNODEPTR *topPtr, char value)//把一个值压入堆栈
{
STACKNODEPTR newPtr;
newPtr=(struct stackNode *)malloc(sizeof(STACKNODE));
if(newPtr!=NULL)
{
newPtr->data=value;
newPtr->nextptr=* topPtr;
*topPtr=newPtr;
}
else
printf("%d not inserted. No memory available.\n",
value);
}
char pop (STACKNODEPTR *topPtr)//从堆栈中弹出一个值
{
STACKNODEPTR tempPtr;
char popValue;
tempPtr=*topPtr;
popValue=(*topPtr)->data;
*topPtr=(*topPtr)->nextptr;
free(tempPtr);
return popValue;
}
char stackTop(STACKNODEPTR topPtr)//返回栈顶的值但不把这个值从堆栈中弹出
{
char popValue;
popValue=topPtr->data;
return popValue;
}
int isEmpty(STACKNODEPTR topPtr)//判断堆栈是否为空,返回1代表空.0代表非空
{
if(topPtr!=NULL)
return 0;
else
return 1;
}
void printStack(STACKNODEPTR topPtr)//打印堆栈
{
if(topPtr==NULL)
printf("The stack is empty.\n");
else
{
while(topPtr!=NULL)
{
printf("%c", topPtr->data);
topPtr=topPtr->nextptr;
}
printf("NULL\n\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -