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

📄 词法注释版.txt

📁 编译的词法语法分析器 下载直接运行使用 有详细注释
💻 TXT
字号:
/*
1-关键字
2-标识符
3-常数(包括字符串)
4-运算符
5-界符
  */
#include   <iostream>   
  #include   <fstream>//文件流头文件无.h,以下有说明   
  #include   <string>   
  #include   <string.h>//字符串头文件   
  #include<stdio.h>  
  #include   <ctype.h>//包含了isalpha等,是字符分类宏   
  using   namespace   std;//在目前的版本中可以支持这样的,不用.h为后缀了   这是使用名字空间std的意思。因为STL的所有代码都被定义在了std的名字空间中,如果不使用这一条语句,那么应该在每一个stl的类、模版、算法等之前冠以std::前缀
    
  char*   ReserveWords[32]   =   {
      "auto","double","int","struct","break",     
  "else","long","switch","case","enum","register","typedef",   
  "char","extern","return","union","const","float","short",   
  "unsigned","continue","for","signed","void","default","goto",   
  "sizeof","volatile","do","if","while","static"};
  char   BlankSpace[]   =   "                     ";   
  char   enter[]   =   "\r\n";   
  //   读入字符ch   
  char   GetChar(ifstream&   src)   
  {   
      char   C;   
      src.get(C);//读入一个字符.get是ifstream中的一个函数   
      return   C;   
  }   
  //   读入空格   
  char   GetBC(ifstream&   src) 
  {   
      char   C;   
      src.get(C);
      while   (C  ==   '   ') 
          src.get(C);
      return   C;  
  }   
  //   连接单词符号   
  void   Connect(char   *str,   char   c)   
  {   
      size_t   n   =   strlen(str);//得到目前串长度   
      str[n++]   =   c;//作为连接的组合空间   
      str[n]   =   '\0';//结束标志   
  }   
  //   判断是否为保留字   
  bool   Ifreserve(const   char*   str)   //??????????????????????????????
  {   
      bool   flag  =   false;   
      for   (int   i   =   0;   i   <   32;   i++)   
      {   
          if   (strcmp(ReserveWords[i],   str)   ==   0)
          {   
              flag  =   true;
              break;   
          }   
      }   
      return   flag;   
  }   
  //   回调字符   
  char   Retract(ifstream&   src)   
  {   
      src.seekg(-1,   ios::cur);/*文件流中的一个函数,两种类型,两种参数!   
                                                      seekg(pos_type   _Pos);   
      seekg(off_type   _Off,ios_base::seekdir   _Way);   
                                                      _Off     
  An   offset   to   move   the   read   pointer   relative   to   way.     
      _Pos     
  The   absolute   position   in   which   to   move   the   read   pointer.     
      _Way     
  One   of   the   ios_base::seekdir   enumerations.     
      Return   Value   
          The   stream   (*this).   
                                                      //用于在文件流移动读指针   
      */   
      return   '\0';   
  }   
  void   Translate(ifstream&   src,   ofstream&   dst)   
  {   
      char   ch;   
      char   strToken[1024]   =   ""; 
      ch   =   GetBC(src);//定义ch字符初始空格   
    
      //   判断标识符的情况   
      if   (isalpha(ch))   
      {   
          while   (isalpha(ch)   ||   isdigit(ch)   ||   ch   ==   '_')   
          {   
              Connect(strToken,   ch); 
              ch   =   GetChar(src);   
          }   
          ch   =   Retract(src);
          if   (Ifreserve(strToken))   
              dst   <<   strToken   <<   BlankSpace   <<   "1"   <<   enter; 
          else   
              dst   <<   strToken   <<   BlankSpace   <<   "2"   <<   enter;
      }   
      //   判断数字的情况   
      else   if   (isdigit(ch))   
      {   
          while   (isdigit(ch))
          {   
              Connect(strToken,   ch);
              ch   =   GetChar(src);//从标准输入设备读取一个字符,若文件结束或出错,则返回-1   
          }   
          Retract(src);
          dst   <<   strToken   <<   BlankSpace   <<   "3"   <<   enter;
      }   
      //   判断转义字符与串的情况   
      else   if   (ch   ==   '\'') 
      {   
          Connect(strToken,   ch); 
          ch   =   GetChar(src);   
          while   (ch   !=   '\'')
          {   
              Connect(strToken,   ch);   
              ch   =   GetChar(src);   
          }   
          if   (ch   !=   '\'') 
              cout   <<   "error"   <<   endl;   
          else   
          {   
              Connect(strToken,   ch);   
              dst   <<   strToken   <<   BlankSpace   <<   "3"   <<   enter;//串   
          }   
      }   
      //   判断没有歧义的单目运算符   
      else   if   (ch   ==   '+')   
          dst   <<   ch   <<   BlankSpace   <<   "4"   <<   enter;
      else   if   (ch   ==   '-')   
          dst   <<   ch   <<   BlankSpace   <<   "4"   <<   enter;   
      else   if   (ch   ==   '*')   
          dst   <<   ch   <<   BlankSpace   <<   "4"   <<   enter;   
      else   if   (ch   ==   '/')   
          dst   <<   ch   <<   BlankSpace   <<   "4"   <<   enter;   
      else   if   (ch   ==   '=')   
          dst   <<   ch   <<   BlankSpace   <<   "4"   <<   enter;  
	  else   if   (ch   ==   '^')   
          dst   <<   ch   <<   BlankSpace   <<   "4"   <<   enter;   
      else   if   (ch   ==   '[')   
          dst   <<   ch   <<   BlankSpace   <<   "5"   <<   enter;   
      else   if   (ch   ==   ']')   
          dst   <<   ch   <<   BlankSpace   <<   "5"   <<   enter;   
      else   if   (ch   ==   ',')   
          dst   <<   ch   <<   BlankSpace   <<   "5"   <<   enter;   
      else   if   (ch   ==   ';')   
          dst   <<   ch   <<   BlankSpace   <<   "5"   <<   enter;   
      else   if   (ch   ==   '(')   
          dst   <<   ch   <<   BlankSpace   <<   "5"   <<   enter;   
      else   if   (ch   ==   ')')   
          dst   <<   ch   <<   BlankSpace   <<   "5"   <<   enter;   
      else   if   (ch   ==   '{')   
          dst   <<   ch   <<   BlankSpace   <<   "5"   <<   enter;   
      else   if   (ch   ==   '}')   
          dst   <<   ch   <<   BlankSpace   <<   "5"   <<   enter;   
      //   判断<、<>和<=   
      else   if   (ch   ==   '<')   
      {   
          ch   =   GetChar(src);   
          if   (ch   ==   '>')   
              dst   <<   "<>"   <<   BlankSpace   <<   "4"   <<   enter;   
          else   if   (ch   ==   '=')   
              dst   <<   "<="   <<   BlankSpace   <<   "4"   <<   enter;   
          else   
          {   
              dst   <<   '<'   <<   BlankSpace   <<   "4"   <<   enter;   
              Retract(src);
          }   
      }   
      //   判断>和>=   
      else   if   (ch   ==   '>')   
      {   
          ch   =   GetChar(src);   
          if   (ch   ==   '=')   
              dst   <<   ">="   <<   BlankSpace   <<   "4"   <<   enter;//类型4   
          else   
          {   
              dst   <<   '>'   <<   BlankSpace   <<   "4"   <<   enter;//类型4   
              Retract(src);//>=   
          }   
      }   
      //   判断.和..   
      else   if   (ch   ==   '.')   
      {   
          ch   =   GetChar(src);   
          if   (ch   ==   '.')   
              dst   <<   ".."   <<   BlankSpace   <<   "2"   <<   enter;
          else   
          {   
              dst   <<   '.'   <<   BlankSpace   <<   "2"   <<   enter;
              Retract(src);//.和..   
          }   
      }   
      //   判断:和:=   
      else   if   (ch   ==   ':')   
      {   
          ch   =   GetChar(src);   
          if   (ch   ==   '=')   
              dst   <<   ":="   <<   BlankSpace   <<   "4"   <<   enter;  
          else   
          {   
              dst   <<   ':'   <<   BlankSpace   <<   "2"   <<   enter; 
              Retract(src);
          }   
      }   
  }   
  int   main(int   argc,   char*   argv[])   
  {   
      string   strSrc;   
      cout   <<   "Please   input   source   file\nlike   in.txt...   \n\n";   
      getline(cin,   strSrc);   
  /*   
          if(cin=="in.txt"){   
  cout   <<   "the   source   program   below:\n";   
  while(ch=fopen("in.txt","r")!=NULL)     
    {   
    printf("%c",ch);   
    }   
  cout<<"\n\n"<<"The   result   has   created   to   out.txt\n";   
  }   
  */   
      system("pause");//系统暂停,让用户确定   
      ifstream   src(strSrc.c_str());     //   打开文件   
      if   (src.fail())   
      {   
          cerr   <<   "\aFailed   to   open   \""   <<   strSrc   <<   "\"!"   <<   endl;//cerr输出错误机制,有声音提示   
          return   1;   
      }   
      ofstream   dst("out.txt");   //?????????????????????????????????????
      while   (!src.eof()) 
          Translate(src,   dst);     
      src.close();  
      dst.close();   
      cout   <<   "The   result  is  in  the  out.txt."   <<   endl;   
      return   0;  
  }

⌨️ 快捷键说明

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