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

📄 scanner.h

📁 完成一个完整的编译程序
💻 H
字号:
#ifndef scanner_comp
#define scanner_comp
#include <iostream>
#include <fstream>
#include <string>
#include <string.h>
#include <ctype.h>
#include <stdio.h>
#define AL 10
#define TXMAX 1000
using namespace std;
//------------------------------词法分析程序----------------------
//符号表
struct table1
{
  char name[AL];
  int kind;
  int val;
};
struct table1 table[TXMAX+1];
int tab=0;

// 保留字数组定义
char* ReserveWords[34] = {
  "flout","and", "array", "begin","boll", "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"
};
char arrow[] = ",";
char enter[] = "\n";
//填写符号表
void entertable(char name1[],int kind1,int val1)
{
  if (tab<TXMAX)
  {
    strcpy(table[tab].name,name1);
    table[tab].kind=kind1;
    table[tab].val=val1;
	tab++;
  }

}
// 读入ch
char GetChar(ifstream& src)
{
  char cRet;
  src.get(cRet);
  return cRet;
}
// 读入空格
char GetBC(ifstream& src)
{
  char cRet;
  src.get(cRet);
  while (cRet == ' ')
    src.get(cRet);
  return cRet;
}
// 连接单词符号
void Concat(char *str, char c)
{
  size_t n = strlen(str);
  str[n++] = c;
  str[n] = '\0';
}
// 判断是否为保留字
bool Reserve( char* str)
{
  bool bRet = false;
  for (int i = 0; i < 34; i++)
  {
    if (_stricmp(ReserveWords[i], str) == 0)
    {
      bRet = true;
      break;
	
    }
  }
  return bRet;
}
// 回调字符
char Retract(ifstream& src)
{
  src.seekg(-1, ios::cur);
  return '\0';
}
// 词法分析函数
void Analyzer(ifstream& src, ofstream& dst)
{
  char ch;
  char strToken[1024] = "";
  ch=GetBC(src);
  // 判断标识符的情况
  if (isalpha(ch))
  {
    while (isalpha(ch) || isdigit(ch) || ch =='_')
    {
     //     cout<<ch;
      Concat(strToken, ch);
      ch = GetChar(src);
    }
  //  if(ch==' ')cout<<strToken;
    ch = Retract(src);                       //回退一个字符
    if (Reserve(strToken))
	{
		for (int i = 0; i < 34; i++)
		{
          if (_stricmp(ReserveWords[i], strToken) == 0)
	     {
         	dst << i << arrow << -1 << enter;
         	 // cout<<strToken;
         	break;
         }	
		}
	}
    else
	{
	  entertable(strToken,34,0);
      dst << 34 << arrow <<tab-1<< enter;
	}
}
  // 判断数值的情况
  else if (isdigit(ch))
  {
	float num=0.0;
	float i=0;
    while (isdigit(ch))
    {
	  num=num*10+ch-'0';
      Concat(strToken, ch);
      ch = GetChar(src);
    }
	if(ch=='.')
	{
	
	  Concat(strToken, ch);
	  ch = GetChar(src);
	  while (isdigit(ch))
	  {
       ++i;
	   num=num+(ch-'0')/(i*10);
       Concat(strToken, ch);
       ch = GetChar(src);
	  }
	}
    Retract(src);
    if(i==0)
	{
	 entertable(strToken,35,num);
     dst << 35 << arrow  <<(tab-1)<< enter;
	}
	else
	{
	 entertable(strToken,36,num);
     dst << 36<< arrow <<tab-1<< enter;
	}
  }
  // 判断字符串的情况
  else if (ch == '\'')
  {
    Concat(strToken, ch);
    ch = GetChar(src);
    while (ch != '\'')
    {
      Concat(strToken, ch);
      ch = GetChar(src);
    }
    if (ch != '\'')
      cerr << "String is too long - more than 1024 bytes!" << endl;
    else
    {
      Concat(strToken, ch);
	  entertable(strToken,37,0);
      dst << 37<< arrow << (tab-1) << enter;
    }
  }
  // 过滤注释
  else if (ch == '{')
  {
    while (GetChar(src) != '}')
      ;
  }
  // 判断所有没有歧义的单目运算符
  else if (ch == '+')
    dst << 43 << arrow << -1 << enter;
  else if (ch == '-')
    dst << 45<< arrow << -1 << enter;
  else if (ch == '*')
    dst << 41<< arrow << -1 << enter;
  else if (ch == '/')
    dst << 48 << arrow << -1 << enter;
  else if (ch == '=')
    dst << 56<< arrow << -1 << enter;
  else if (ch == '[')
    dst << 59 << arrow << -1 << enter;
  else if (ch == ']')
    dst << 60<< arrow << -1 << enter;
  else if (ch == ',')
    dst << 44<< arrow << -1 << enter;
  else if (ch == '^')
    dst << 42 << arrow << -1 << enter;
  else if (ch == ';')
    dst << 52<< arrow << -1 << enter;
  else if (ch == '(')
    dst << 39<< arrow << -1 << enter;
  else if (ch == ')')
    dst << 40<< arrow << -1 << enter;
  // 判断<、<>和<=
  else if (ch == '<')
  {
    ch = GetChar(src);
    if (ch == '>')
      dst << 55 << arrow << -1 << enter;
    else if (ch == '=')
      dst << 54<< arrow << -1<< enter;
    else
    {
      dst << 53 << arrow << -1 << enter;
      Retract(src);
    }
  }
  // 判断>和>=
  else if (ch == '>')
  {
    ch = GetChar(src);
    if (ch == '=')
      dst << 58 << arrow << -1 << enter;
    else
    {
      dst << 57 << arrow << -1 << enter;
      Retract(src);
    }
  }
  // 判断.和..
  else if (ch == '.')
  {
    ch = GetChar(src);
    if (ch == '.')
      dst << 47 << arrow << -1 << enter;
    else
    {
      dst << 46<< arrow << -1 << enter;
      Retract(src);
    }
  }
  // 判断:和:=
  else if (ch == ':')
  {
    ch = GetChar(src);
    if (ch == '=')
      dst << 51 << arrow << -1 << enter;
    else
    {
      dst << 50<< arrow << -1 << enter;
      Retract(src);
    }
  }

}

int scanner()
{
  string strSrc;
  //读入文件名

    cout << "Please input PCL source file name: ";
    getline(cin, strSrc);

  // 打开文件
  ifstream src(strSrc.c_str());
  if (src.fail())
  {
    cerr << "\aFailed openning \"" << strSrc << "\"!" << endl;
    return 1;
  }
  ofstream dst("token.txt");
  // 开始解析
  while (!src.eof())
    Analyzer(src, dst);
  // 收尾工作
  dst.close();
  src.close();
  cout << "The result of Lexical Analyzing is written into token.txt." << endl;
  return 0;
}
#endif


⌨️ 快捷键说明

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