C++寫的程式識別Pascal代碼

來源:互聯網
上載者:User

學習編譯技術,老師出了個題目:給我們一份簡單的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];
 }
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.