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

📄 编译原理.cpp

📁 编译原理--此程序实现在词法分析
💻 CPP
字号:
//pascal词法分析器   (turboc编)

#define VAR 1   
  #define               INT 2   
  #define TEMP 3   
  #define UNKOWN 4   
    
  #define               ID_OVERFLOW         1   
  #define     NO_OVERFLOW 2   
  #define                 NOTEND 3   
    
  #define                 NO_PROGRAM 4   
  #define                 NO_PROGRAM_NAME 5   
  #define                 NO_SEMICOLON 6   
  #define                 NO_BEGIN 7   
  #define                 NO_END 8   
  #define                 NO_VAR 9   
  #define                 NO_INTEGER 10   
  #define                 NO_COLON 11   
  #define                 NO_ID 12   
  #define                 MULTIPLE_DECLEAR     13   
  #define                 NO_EVALUATE               14   
  #define                 NO_LEFT 15   
  #define                 NO_RIGHT 16   
  #define                 NO_ID_OR_PRINT 17   
  #define                 NO_SEMICOLON_OR_RIGHT           18   
  #define                 NO_SEMICOLON_OR_ADD_OR_SUB_OR_RIGHT         19   
  #define                 NOT_DECLEAR 20   
  #define                 WRONG_ID 21   
  #define NOT_DEFINED 22   
    
    
  #define PROGRAM     -1   
  #define SPACE     -2   
  #define                 EVALUATE                     1   
  #define                 ADD 2   
  #define SUB 3   
  #define MUL 4   
  #define DIV 5   
  #define PRINT 6   
  #define END 7   
    
    
    
  int   iAnyEorro=0;   
    
  int   iRowCount;   
  int   iTierCount;   
    
  char   cLine[1024];   
  int   iCurrentChar;   
  int   iCharCount;   
    
  char   *pWord[]={"and",   "array",   "begin",   "bool",   "call",   "case",   "char",   
  "constant",   "do",   "else",   "end",   "false",   "for",   "if",   
  "input",   "integer",   "not",   "of",   "or",   "output",   "procedure",   
  "program",   "read",   "real",   "repeat",   "set",   "then",   "to",   
  "true",   "until",   "var",   "while",   "write"};   
  const   int   iKeyWordCount=33;   
    
    
    
  //Definition   of   the   Token   and   the   SignTable   
  typedef   struct   
  {   
  int   iTypeCode;   
  int   iAddress;   
  }Token;   
    
  typedef   struct   
  {   
  CString   strName;   
  int   iAddress;   
  int   iLength;   
  int   iKind;   
  int   iValue;   
  }SignTable;   
    
  typedef   struct   
  {   
  int   iCode;   
  int   iAddressA;   
  int   iAddressB;   
  int   iAddressC;   
  }FourCode;   
    
    
  Token   stcToken[512],   stcNextToken;   
  int   iCurrentToken=0;   
  int   iTokenAmount;   
    
  SignTable   stcSignTable[512],   stcNextSignTable;   
  int   iCurrentSignTable=0;   
  int   iSignTableAmount;   
    
  char   cSignList[1024];   
  int   iCurrentSignList=0;   
  int   iSignListAmount;   
    
  FourCode   stcFourCode[512];   
  int   iCurrentFourCode=0;   
    
    
  typedef   struct   
  {   
  int   iRow;   
  int   iLine;   
  }   WHERE;   
  WHERE   stcWhere[512],   stcWhereWrong;   
    
    
    
  //Declare   function..   
  //Belong   to   the   Scanner..   
  int   Scanner(char   *pSourceFileName);   
  char   GetNextChar(void);   
  int   Sort(char   cChar);   
  int   GetID(char   cChar);   
  int   IsKeyWord(CString   strWord,   int   &iPosition);   
  int   LookUpSignTable(CString   strWord,   int   iTypeCode,   int   &iAddress);   
  int   GetNumber(char   cChar);   
  int   HandleCom(void);   
  int   GetDel(char   cChar);   
  int   FillToken(int   iTypeCode,   int   iAddress);   
  //int   FillFile(void);















int   Scanner(char   *pSourceFileName)   
  {   
  FILE   *pSourceFile;   
  if((pSourceFile=fopen(pSourceFileName,   "r"))==NULL)   
  {   
  printf("Open   file   error");   
  exit(1);   
  }   
    
    
  iRowCount=0;   
    
  char   cFirstChar;   
  while((cFirstChar=fgetc(pSourceFile))!=EOF)   
  {   
  iCharCount=0;   
  iRowCount++;   
    
  while(cFirstChar!='\n')   
  {   
  cLine[iCharCount++]=cFirstChar;   
  cFirstChar=fgetc(pSourceFile);   
  }   
    
  cLine[iCharCount]=0;   
  iCurrentChar=0;   
    
  //gotoxy(iRowCount,   1);   
  printf("%s               ",   cLine);   
    
  while(iCurrentChar<iCharCount)   
  Sort(cLine[iCurrentChar]);   
    
  printf("\n");   
  }   
    
  fclose(pSourceFile);   
    
  //FillFile();   
    
  if(iAnyEorro)   return   0;   
  else   return   1;   
  }   
    
    
    
  //Function.GetNextChar   
  char   GetNextChar(void)   
  {   
  return   cLine[++iCurrentChar];   
  }   
    
    
  //Function.Sort   
  int   Sort(char   cChar)   
  {   
  int   iType=0;   
    
  if(cChar>='a'   &&   cChar<='z'   ||   cChar>='A'   &&   cChar<='Z')   iType=1;//GetID(cChar);   
  if(cChar=='/')   iType=3;//HandleCom();   
  if(cChar>='0'   &&   cChar<='9')   iType=2;//GetNumber(cChar);   
    
  switch(iType)   
  {   
  case   0:   
  GetDel(cChar);   
  break;   
  case   1:   
  GetID(cChar);   
  break;   
  case   2:   
  GetNumber(cChar);   
  break;   
  case   3:   
  HandleCom();   
  break;   
  }   
    
  iCurrentChar++;   
  //printf("{%d}",   iCurrentChar);   
    
  return   1;   
  }   
    
    
  //Function.GetID   
  int   GetID(char   cChar)   
  {   
  CString   strWord="";   
  strWord=strWord+cChar;   
  //printf("%c",   cChar);   
    
  int   iContinue=1;   
  int   iCharLength=1;   
  while(iContinue)   
  {   
  char   cNextChar=GetNextChar();   
    
  if(cNextChar>='a'   &&   cNextChar<='z'   ||   cNextChar>='A'   &&   cNextChar<='Z'   
  ||   cNextChar>='0'   &&   cNextChar<='9')   
  {   
  iCharLength++;   
  strWord=strWord+cNextChar;   
  //printf("%c",   cNextChar);   
  }   
  else   
  {   
  iContinue=0;   
  iCurrentChar--;   
  }   
  }   
    
  //if(cNextChar=='feihazifu')   printf("Wrong");   
    
  int   iTypeCode;   
  if(IsKeyWord(strWord,   iTypeCode))   
  {   
  //printf("[KeyWord]");   
  FillToken(iTypeCode,   -1);   
  }   
  else   
  {   
  if(iCharLength>8)   PrintEorro(ID_OVERFLOW);   
    
  //printf("[ID]");   
    
  int   iAddress;   
  LookUpSignTable(strWord,   iTypeCode,   iAddress);   
  FillToken(iTypeCode,   iAddress);   
  }   
    
    
      // printf("\n");   
  return   1;   
  }   
    
    
  //Function.IsWrongChar   
  /*   
  int   IsWrongChar(void)   
  {   
    
  return   1;   
  }   
  */   
    
    
  //Function.IsWrongChar   
  int   IsKeyWord(CString   strWord,   int   &iPosition)   
  {   
  iPosition=1;   
  for(int   i=0;   i<iKeyWordCount;   i++,   iPosition++)   
  if(strWord==pWord[i])   return   1;   
    
  iPosition=iKeyWordCount+1;   
  return   0;   
  }   
    
    
    
  int   LookUpSignTable(CString   strWord,   int   iTypeCode,   int   &iAddress)   
  {   
  int   iExistTheSameName=0;   
  int   iWhereTheSameName;   
  for(int   i=0;   i<iCurrentSignTable;   i++)   
  {   
  if(strWord==stcSignTable[i].strName)   
  {   
  iExistTheSameName=1;   
  iWhereTheSameName=i;   
  }   
  }   
    
    
  if(iTypeCode==34)   
  {   
  if(iExistTheSameName)   
  {   
  iAddress=iWhereTheSameName;   
  }   
  else   
  {   
  iAddress=iCurrentSignTable++;   
  stcSignTable[iAddress].iAddress=iCurrentSignList;//del   
    
  int   iLimit=strWord.GetLength();   
  for(int   i=0;   i<iLimit;   i++)   
  {   
  cSignList[iCurrentSignList++]=strWord.GetAt(i+1);   
  //printf("<%c,   %d>",   cSignList[iCurrentSignList-1],   iCurrentSignList);   
  }   
    
  stcSignTable[iAddress].iLength=iLimit;   
  stcSignTable[iAddress].iKind=UNKOWN;//VAR;   
  stcSignTable[iAddress].iValue=-1;   
  stcSignTable[iAddress].strName=strWord;   
  }   
  }   
    
    
  if(iTypeCode==35)   
  {   
  if(iExistTheSameName)   
  {   
  iAddress=iWhereTheSameName;   
  }   
  else   
  {   
  iAddress=iCurrentSignTable++;   
  stcSignTable[iAddress].iAddress=-1;     //del   
  stcSignTable[iAddress].iLength=-1;   
  stcSignTable[iAddress].iKind=INT;   
    
  int   iNumber=0;   
  int   iLimit=strWord.GetLength();   
  for(i=1;   i<=iLimit;   i++)   
  {   
  iNumber*=10;   
  iNumber+=strWord.GetAt(i)-'0';   
  }   
  stcSignTable[iAddress].iValue=iNumber;   
  stcSignTable[iAddress].strName=strWord;   
  }   
  }   
    
  return   1;   
  }   
    
    
    
  void   DI(void)   
  {   
  int   i;   
    
    
  printf("\nToken[%d]:",   iCurrentToken);   
  for(i=0;   i<iCurrentToken;   i++)   
  printf("<%d,%d>   ",   stcToken[i].iTypeCode,   stcToken[i].iAddress);   
  printf("\n");   
  /*   
  printf("\nList:");   
  puts(cSignList);   
  */   
  printf("SignTable[%d]:",   iCurrentSignTable);   
  for(i=0;   i<iCurrentSignTable;   i++)   
  {   
  char   *p;   
  stcSignTable[i].strName.ToChars(&p);   
    
  printf("[%d:\"%s\"<%d,%d,%d,%d>]         ",   i,   p,   stcSignTable[i].iAddress,   
  stcSignTable[i].iLength,   stcSignTable[i].iKind,   
  stcSignTable[i].iValue);   
    
  delete   p;   
  }   
  printf("\n");   
  }   
    
    
    
  int   GetNumber(char   cChar)   
  {   
  CString   strWord="";   
  strWord=strWord+cChar;   
  //printf("%c",   cChar);   
    
  int   iContinue=1;   
  while(iContinue)   
  {   
  char   cNextChar=GetNextChar();   
    
  if(cNextChar>='0'   &&   cNextChar<='9')   
  {   
  strWord=strWord+cNextChar;   
  //printf("%c",   cNextChar);   
  }   
  else   
  {   
  iContinue=0;   
  iCurrentChar--;   
  }   
  }   
      // printf("\n");   
    
  //Change   the   strWord   into   Number   
  CString   strNumber="";   
  int   iDoing=0;   
  int   iLimit=strWord.GetLength();   
  for(int   i=0;   i<iLimit;   i++)   
  {   
  if(strWord.GetAt(i+1)!='0')   iDoing=1;   
  if(iDoing)   strNumber=strNumber+strWord.GetAt(i+1);   
  }   
    
  long   lNumber=0;   
  iLimit=strNumber.GetLength();   
  for(i=1;   i<=iLimit;   i++)   
  {   
  lNumber*=10;   
  lNumber+=strNumber.GetAt(i)-'0';   
  }   
    
  if(lNumber>32767   ||   iLimit>5)   PrintEorro(NO_OVERFLOW);//printf("=Eorro:over   flow!\n");   
  else   
  {   
  int   iAddress;   
  LookUpSignTable(strNumber,   35,   iAddress);   
  FillToken(35,   iAddress);   
  }   
    
  return   1;   
  }   
    
    
    
  int   HandleCom(void)   
  {   
    
  char   cNextChar=GetNextChar();   
  if(cNextChar!='*')   
  {   
  iCurrentChar--;   
  FillToken(48,   -1);   
  }   
  else   
  {   
  int   iEorro=1;   
    
  if(iCharCount-iCurrentChar>2)   
  {   
  cNextChar=GetNextChar();   
    
  while(iCurrentChar<iCharCount-1)   
  {   
  char   cCurrentChar=cNextChar;   
  cNextChar=GetNextChar();   
    
  if(cCurrentChar=='*'   &&   cNextChar=='/')   
  {   
  iEorro=0;   
  break;   
  }   
  }   
    
  if(iEorro)   PrintEorro(NOTEND);//printf("+Eorro:not   over+");   
  }   
  }   
    
  return   1;   
  }   
    
    
    
  int   GetDel(char   cChar)   
  {   
  switch(cChar)   
  {   
  case   '+':   
  FillToken(43,   -1);   
  break;   
  case   '-':   
  FillToken(45,   -1);   
  break;   
  case   '*':   
  FillToken(41,   -1);   
  break;   
  case   '(':   
  FillToken(39,   -1);   
  break;   
  case   ')':   
  FillToken(40,   -1);   
  break;   
  case   ',':   
  FillToken(44,   -1);   
  break;   
  case   ';':   
  FillToken(52,   -1);   
  break;   
  case   '   ':   
  while(GetNextChar()=='   ');   
  iCurrentChar--;   
  break;   
  case   '\t':   
  while(GetNextChar()=='\t');   
  iCurrentChar--;   
  break;   
  case   ':':   
  char   cNextChar=GetNextChar();   
  if(cNextChar=='=')   FillToken(51,   -1);   
  else   
  {   
  iCurrentChar--;   
  FillToken(50,   -1);   
  }   
  break;   
  case   '<':   
  cNextChar=GetNextChar();   
  if(cNextChar=='<')   FillToken(61,   -1);   
  else   
  {   
  iCurrentChar--;   
  FillToken(100,   -1);   
  }   
  break;   
  default:   
  FillToken(100,   -1);   
  }   
    
  return   1;   
  }   
    
    
    
  int   FillToken(int   iTypeCode,   int   iAddress)   
  {   
  stcWhere[iCurrentToken].iRow=iRowCount;   
  stcWhere[iCurrentToken].iLine=iCurrentChar+1;   
    
  stcToken[iCurrentToken].iTypeCode=iTypeCode;   
  stcToken[iCurrentToken++].iAddress=iAddress;   
    
  return   1;   
  }  

⌨️ 快捷键说明

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