⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 赋值翻译.cpp

📁 赋值语句的翻译的实验之一,算符优先的方法
💻 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 + -