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

📄 3354533.txt

📁 词法分析器,pacal语言的词法分析器,用c语言编写的
💻 TXT
字号:
// PASCAL词法分析程序
// 2004369713 林建盛 13号
#include <iostream>
#include <fstream>
#include <string>
#include <string.h>
#include <ctype.h>
using namespace std;
// 保留字数组定义
char* ReserveWords[35] = {
  "and", "array", "begin", "case", "const", "div", "do", "downto", "else", "end", "file",
  "for", "function", "goto", "if", "in", "label", "mod", "nil", "not", "of", "or", "packed",
  "procedure", "program", "record", "repeat", "set", "then", "to", "type", "until", "var",
  "while", "with"
};
char arrow[] = " -----> ";
char enter[] = "\r\n";
// 读入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(const char* str)
{
  bool bRet = false;
  for (int i = 0; i < 35; 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 == '_')
    {
      Concat(strToken, ch);
      ch = GetChar(src);
    }
    ch = Retract(src);
    if (Reserve(strToken))
      dst << strToken << arrow << "Reserve Word" << enter;
    else
      dst << strToken << arrow << "Identifier" << enter;
  }
  // 判断数值的情况
  else if (isdigit(ch))
  {
    while (isdigit(ch))
    {
      Concat(strToken, ch);
      ch = GetChar(src);
    }
    Retract(src);
    dst << strToken << arrow << "Number" << 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);
      dst << strToken << arrow << "String" << enter;
    }
  }
  // 过滤注释
  else if (ch == '{')
  {
    while (GetChar(src) != '}')
      ;
  }
  // 判断所有没有歧义的单目运算符
  else if (ch == '+')
    dst << ch << arrow << "Plus" << enter;
  else if (ch == '-')
    dst << ch << arrow << "Minus" << enter;
  else if (ch == '*')
    dst << ch << arrow << "Multiply" << enter;
  else if (ch == '/')
    dst << ch << arrow << "Divide" << enter;
  else if (ch == '=')
    dst << ch << arrow << "Equal" << enter;
  else if (ch == '[')
    dst << ch << arrow << "Left Square Brackets" << enter;
  else if (ch == ']')
    dst << ch << arrow << "Right Square Brackets" << enter;
  else if (ch == ',')
    dst << ch << arrow << "Comma" << enter;
  else if (ch == '^')
    dst << ch << arrow << "Pointer" << enter;
  else if (ch == ';')
    dst << ch << arrow << "Semicolon" << enter;
  else if (ch == '(')
    dst << ch << arrow << "Left Parenthesis" << enter;
  else if (ch == ')')
    dst << ch << arrow << "Right Parenthesis" << enter;
  // 判断<、<>和<=
  else if (ch == '<')
  {
    ch = GetChar(src);
    if (ch == '>')
      dst << "<>" << arrow << "Unequal" << enter;
    else if (ch == '=')
      dst << "<=" << arrow << "Less or Equal" << enter;
    else
    {
      dst << '<' << arrow << "Less" << enter;
      Retract(src);
    }
  }
  // 判断>和>=
  else if (ch == '>')
  {
    ch = GetChar(src);
    if (ch == '=')
      dst << ">=" << arrow << "Greater or Equal" << enter;
    else
    {
      dst << '>' << arrow << "Greater" << enter;
      Retract(src);
    }
  }
  // 判断.和..
  else if (ch == '.')
  {
    ch = GetChar(src);
    if (ch == '.')
      dst << ".." << arrow << "Bound" << enter;
    else
    {
      dst << '.' << arrow << "Point" << enter;
      Retract(src);
    }
  }
  // 判断:和:=
  else if (ch == ':')
  {
    ch = GetChar(src);
    if (ch == '=')
      dst << ":=" << arrow << "Assign" << enter;
    else
    {
      dst << ':' << arrow << "Colon" << enter;
      Retract(src);
    }
  }
}
int main(int argc, char* argv[])
{
  string strSrc;
  // 命令行的支持
  if (argc == 1)
  {
    cout << "Please input PASCAL source file name: ";
    getline(cin, strSrc);
  }
  else
    strSrc = argv[1];
  // 打开文件
  ifstream src(strSrc.c_str());
  if (src.fail())
  {
    cerr << "\aFailed openning \"" << strSrc << "\"!" << endl;
    return 1;
  }
  ofstream dst("Result.txt");
  // 开始解析
  while (!src.eof())
    Analyzer(src, dst);
  // 收尾工作
  dst.close();
  src.close();
  cout << "The result of Analyzing is written into Result.txt." << endl;
  return 0;
}

⌨️ 快捷键说明

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