C++写的程序识别Pascal代码

学习编译技术,老师出了个题目:给我们一份简单的pascal代码,让我们用C语言识别代码中的单词,并分析出单词的类别,没学过C,我直接用C++写了一份!

用C++写代码的时候,感觉没用到什么编译技术里的知识,郁闷!老师出的是什么题目啊!

贴一下代码,希望给感兴趣的刚入门的朋友一些小小的帮助!

pascal代码:

Begin
  f:=1;
  lastf:=0;
  n:=0;
  For I:=1 To 20 Do
  Begin
   if(n mod 4 = 0) THEN WRITELN;
  End
End

 

C++程序源代码:

#include <iostream>
#include <fstream>
#include <string>
#include <cctype>
using namespace std;

// global var
const char * keywords [9] = {"begin", "end", "for", "to", "do", "if", "then", "writeln", "mod"}; // 关键字
const char op_signs [2] = {':', '='};  // 运算符
const char divid_signs[3] = {';', '(', ')'}; // 边界符

const char * szPath = "d:\code.txt"; // 文件路径

// function
bool IsEnd(char ch);
bool IsAlpha(char ch);
bool IsDigit(char ch);
bool IsDivid(char ch);
bool IsOprate(char ch);
void Back(fstream * f);
char * ToLower(char * str);
bool IsKeyWord(string strWord);
string Append(string str, char ch);
void StrToCharArr(char *pArr, string str);


void main()
{
 fstream fi(szPath, ios::in); // Read Style
 if(!fi)
 {
  cout << "file open faild!" << endl;
  return;
 }
 char ch;
 string strWord = "";
 char Word[100];
 ch = fi.get();
 while(ch != EOF)
 {
  
  if(IsAlpha(ch)) // 字母
  {
   while(!(IsEnd(ch) || IsOprate(ch) || IsDivid(ch)))
   {
    strWord = Append(strWord, ch);
    ch = fi.get();
    if(ch == EOF)
     return;
   }
   if(IsKeyWord(strWord))
    cout << strWord+"关键字" << endl;
   else
    cout << strWord+"标识符" << endl;
   if(IsOprate(ch) || IsDivid(ch))
    Back(&fi);
   strWord = "";
  }
  else if(IsOprate(ch)) // 运算符
  {
   while(!(IsEnd(ch) || IsDigit(ch) || IsDivid(ch) || IsAlpha(ch)))
   {
    strWord = Append(strWord, ch);
    ch = fi.get();
    if(ch == EOF)
     return;
   }

   cout << strWord+"运算符" << endl;

   if(IsDivid(ch) || IsAlpha(ch) || IsDigit(ch))
    Back(&fi);
   strWord = "";
  }
  else if(IsDigit(ch)) // 数值
  {
   while(!(IsEnd(ch) || IsOprate(ch) || IsDivid(ch) || IsAlpha(ch)))
   {
    strWord = Append(strWord, ch);
    ch = fi.get();
    if(ch == EOF)
     return;
   }

   cout << strWord+"数值" << endl;

   if(IsDivid(ch) || IsAlpha(ch) || IsOprate(ch))
    Back(&fi);
   strWord = "";
  }
  else if(IsDivid(ch)) // 边界符
  {
   while(!(IsEnd(ch) || IsOprate(ch) || IsDigit(ch) || IsAlpha(ch)))
   {
    strWord = Append(strWord, ch);
    ch = fi.get();
    if(ch == EOF)
     return;
   }

   cout << strWord+"边界符" << endl;

   if(IsDigit(ch) || IsAlpha(ch) || IsOprate(ch))
    Back(&fi);
   strWord = "";
  }

  ch = fi.get();
 } 
}

// 判断是否是字母
bool IsAlpha(char ch)
{
 if(ch>=65 && ch <= 122)
  return true;
 else
  return false;
}

// 判断是否是数字
bool IsDigit(char ch)
{
 if(ch >=48 && ch <=57)
  return true;
 else
  return false;
}

// 判断是否是空格、换行符
bool IsEnd(char ch)
{
 if(ch == 10 || ch == 32)
  return true;
 else
  return false;
}

// 判断是否是边界符
bool IsDivid(char ch)
{
 for(int i=0; i<3; i++)
 {
  if(ch == divid_signs[i])
   return true;
 }
 return false;
}

// 判断是否是关键字
bool IsKeyWord(string strWord)
{
 char pword [100];
 StrToCharArr(pword,strWord);
    for(int i=0; i<9; i++)
 {
  ToLower(pword);
  if(0==strcmp(keywords[i], pword))
   return true;
  else
   continue;
 }
 return false;
}

// 判断是否是运算符
bool IsOprate(char ch)
{
 for(int i=0; i<2; i++)
 {
  if(ch == op_signs[i])
   return true;
 }
 return false;
}

// 文件指针后移
void Back(fstream * f)
{
 f->seekg(-1, ios::cur);
}

// 组装单词
string Append(string str, char ch)
{
 str += ch;
 return str;
}

// 将字符串转换为小写
char * ToLower(char * str)
{
 int i=0;
 while(str[i] != '\0')
 {
  str[i] = tolower(str[i]);
  i++;
 }
 return str;
}

// 将字符串转换为字符数组
void StrToCharArr(char *pArr, string str)
{
 for(int i=0; i<= str.length(); i++)
 {
  pArr[i] = str[i];
 }
}

posted on 2010-03-30 14:22  思想在飞  阅读(539)  评论(1编辑  收藏  举报