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