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

📄 wordcompile.h

📁 一个Pascal子集语言的编译器
💻 H
📖 第 1 页 / 共 5 页
字号:
      case 2070: switch(chin)
                {
                case 'l':State=2071;break;      
                default:if(((chin>='0')&&(chin<='9')&&(wordLength>=0))or((chin>='a')&&(chin<='z'))or(chin=='_'))  State=5000;     
                         else State=5500; break;
                }
                break;
      case 2071: switch(chin)
                {
                case 's':State=2072;break;      
                default: if(((chin>='0')&&(chin<='9')&&(wordLength>=0))or((chin>='a')&&(chin<='z'))or(chin=='_'))  State=5000;     
                         else State=5500; break;
                }
                break;
      case 2072: switch(chin)
                {
                case 'e':State=8888;break;         //"false" 
                default: if(((chin>='0')&&(chin<='9')&&(wordLength>=0))or((chin>='a')&&(chin<='z'))or(chin=='_'))  State=5000;     
                         else State=5500; break;
                }
                break;
                
                
      case 3000: switch(chin)                     //数字的输入 
                {
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':State=3000;break;
                case '.':State=3001;break;
                default: if(((chin>='0')&&(chin<='9')&&(wordLength>=0))or((chin>='a')&&(chin<='z'))or(chin=='_'))
                              {                     //字符是无效的 
                              /*
                                    提示错误信息:illegal variant
                              */
                                CatchErrors(7);
                                return -1;
                              }
                         else {
                                State=2000;         //字符是有效的 
                                return 1;
                              }
                }
                break;
       case 3001: switch(chin)                    //输入小数点以后的状态 
                {
                case '0':
                case '1':
                case '2':
                case '3':
                case '4':
                case '5':
                case '6':
                case '7':
                case '8':
                case '9':State=3001;break;
                default: State=2000;return 1;                   //
                }
                break;
       case 4001:                                 //冒号的输入 
                
                switch(chin)                      //":"
                {
                case '=':   State=2000; 
                                                  //用字符"="覆盖字符":"
                default: 
                           break;
                }
                return 1;
                break;
                
      case 4100: 
                State=2000;
                switch(chin)
                {
                case '=':break;                   //"<="
                case '>':break;                   //"<>"
                default: return 1;
                }
                break;
      case 4101: 
                State=2000;
                switch(chin)
                {
                case '=':break;                   //">="
                default: break;
                }
                break;
               
                                 
      case 5000:                                  //此状态为正在输入变量的状态  
                if(((chin>='0')&&(chin<='9')&&(wordLength>=0))or((chin>='a')&&(chin<='z'))or(chin=='_'))   
                       State=5000;     
                else
                       State=5500;         
                break; 
      
      case 5500:    //将此栈中的单词与单词表中的词相比较,如果匹配则是合法的,否则报出错误
                
                break;
      
      case 5080:                                   //此刻已在等待输入一个变量
      case 5081:                                   //此刻正在等待输入程序名 
      case 5082:                                   //此刻正在等待输入程序名 
      case 5083:                                   //此刻正在等待输入程序名 
               //cout<<wordLength<<endl;
               
               if(        
                    ((chin>='0')&&(chin<='9')&&(wordLength>=0)&&(TempWord[0]!=' ')&&(TempWord[0]!='\n'))
                    or                             //数字不能作为标识符的头 
                    ((chin>='a')&&(chin<='z'))
                    or
                    (chin=='_')
                    )                              //如果输入的是字符,就继续 
                {}  
               else 
                {
                    if(
                        (wordLength<0)
                        ||
                        (
                        (wordLength==0)&&
                                        ((TempWord[0]==' ')||(TempWord[0]=='\n'))
                        )
                      )
                                                        //即目前为止没有收到变量信息
                        {
                          if((chin==' ')||(chin=='\n')) //将所有空格和回车去掉 
                                            {
                                            //cout<<"kong"<<endl;
                                            //cout<<TempWord<<endl;
                                            return 1;   //将空字符输出 
                                            }
                          else          
                          {
                          //cout<<"wrong"<<endl;
                                                        //如果是其他字符,则显示错误信息 
                          CatchErrors(State-5078);
                          State=2000;
                          }
                        }
                    else                                //说明此变量已经输入完毕,则记录到变量表中 
                        {
                            TempWord[wordLength+1]='\0';
                            while(TempWord[0]==' ')         //左边的空格   
                            {
                                for(int i=0;i<=wordLength;i++)
                                    TempWord[i]=TempWord[i+1];
                                wordLength--;
                            } 
                            while(TempWord[wordLength]==' ')//消除右边的空格
                                TempWord[wordLength--]='\0';
                            //cout<<TempWord<<endl;
                            
                                    //首先要判断这个变量以前是否声明过
                            int flag=1;                     //临时的标志变量 
                            
                            int temp;
                            switch(State)
                            {
                                case 5080:temp=100;break;
                                case 5081:temp=900;break;
                                case 5082:temp=800;break;
                                case 5083:temp=700;break;
                                default:break;
                            }
                            
                            /*
                            for(int i=1;i<VariantCount;i++)
                                if(strcmp(TempWord,Variant[i])==0)
                                    if(temp+Phase==VariantType[i])  //类型和名称同时相同,说明重复定义 
                                     {flag=0;break;}
                            */         
                            
                            if(flag==0)
                            {
                                    
                                   //  输出错误信息:变量重复定义   
                                   State=2000;
                                   CatchErrors(6);
                                   
                            }
                            else
                            {                                                                  
                                switch(State)               //将此变量记录到变量表文件里
                                {
                                case 5080:      //变量名 
                                      fwordtable<<"100 ";
                                      VariantType[VariantCount]=100;
                                                            //记录变量是程序名、函数名还是过程名 
                                      break;    
                                case 5081:      //程序名
                                      fwordtable<<900+Phase<<" ";
                                      VariantType[VariantCount]=900+Phase;
                                      break;  
                                case 5082:      //过程名 
                                      fwordtable<<800+Phase<<" ";
                                      VariantType[VariantCount]=800+Phase;
                                      break; 
                                case 5083:      //函数名 
                                      fwordtable<<700+Phase<<" ";
                                      VariantType[VariantCount]=700+Phase;
                                      break; 
                                }
                                fwordtable<<TempWord<<endl; 
                                                            //还需要记录在自身类的数组里,以便查询
                                strcpy(Variant[VariantCount],TempWord);
                                VariantCount++;
                                                            //再在生成文件上记录
                                                            
                                TempWord[0]='i';TempWord[1]='d';TempWord[2]='\0';
                                wordLength=2;
                                                            //考虑这以后状态转移的问题 
                                if((chin==',')||(chin=='('))  //如果是逗号或左括号则继续向下分析
                                    {
                                    if(chin=='(') Phase=10;
                                    State+=100;             //状态分别变成5180,5181,5182,5183 
                                    }
                                else if(chin==' ')
                                    {
                                    }
                                else
                                    State=2000;             //如果是其他则恢复到正常状态
                                           
                                return 1;                   //将ID输出到目标文件        
                            }        
                             
                        }
                       
                }  
                
                break; 
      case 5180:                                  //此刻已在等待输入另一个变量
      case 5181:                                  //此刻正在等待输入另一个程序名 
      case 5182:                                  //此刻正在等待输入另一个过程名 
      case 5183:                                  //此刻正在等待输入另一个函数名 
                 if((TempWord[0]==',')||(TempWord[0]=='('))
                     {
                     State-=100;
                     return 1;
                     }
                 break;                                                                                       
      case 8880:                                  //var刚输入完成 
      case 8881:                                  //Program输入完成 
      case 8882:                                  //Procedure输入完成 
      case 8883:                                  //Function输入完成 
                                                  //判断是否为关键字的结尾   
                  if(        
                    ((chin>='0')&&(chin<='9'))
                    or
                    ((chin>='a')&&(chin<='z'))
                    or
                    (chin=='_')
                    )                             //如果这还不是结尾,则把它定义成变量 
                    {
                        State=5000;
                        
                    }
                  else 
                    {
                        State-=3800;              //完成了一个标识符的输入
                                                  //它们各自转到自己的对应状态
                        Phase=0;                  //分别为 5080  5081  5082  5083
                        return 1;
                    }        
                                          //首先确认此变量不是参数 
                  break;
      case 8888:                                  //判断是否为关键字的结尾   
                  if(((chin>='0')&&(chin<='9'))or((chin>='a')&&(chin<='z'))or(chin=='_'))                             //如果这还不是结尾,则把它定义成变量 
                    {
                        State=5000;
                    }
                  else
                    {
                        State=2000;               //完成了一个标识符的输入 
                        return 1;
                    }        
                    
                break;   
      
                
    default: break;
    }
    if(State==5500)                             //如果状态是5500,则需要马上进行处理,判断此标识符是否已经声明 
    {
                                                //首先将此单词进行改造 
                                                //单词比较之前,一定要进行去除空格的工作
                TempWord[wordLength+1]='\0';
                while(TempWord

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -