?? 110.txt
字號:
#include <iostream>
#include <fstream>
#include <string>
//#include <string.h>
#include <ctype.h>
using namespace std;
// 保留字?jǐn)?shù)組定義
char* ReserveWords[33] = {
"and", "array", "begin", "case","char" "constant", "do", "else", "end", "false",
"for", "if", "input", "integer", "not", "of", "or", "output","packed",
"procedure", "program", "read", "real","repeat", "set", "then", "to", "type", "until",
"var","while", "with","write"
};
char arrow[] = " -----> ";
char enter[] = "\r\n";
// 讀入ch
char Get_char(ifstream& src)
{
char cRet;
// src.get(cRet);
for(int i=0;i<src.size();i++)
src.get(cRet);
return cRet;
}
// 讀入空格
char Get_blank_char(ifstream& src)
{
char cRet;
// src.get(cRet);
while (cRet == ' ')
src.get(cRet);
return cRet;
}
// 連接單詞符號
void Contact(char *str, char c)
{
size_t n = strlen(str);
str[n++] = c;
str[n] = '\0';
}
// 判斷是否為保留字
bool Reserve_words(const char* str)
{
bool bRet = false;
for (int i = 0; i < 33; i++)
{
if (_stricmp(ReserveWords[i], str) == 0)
{
bRet = true;
break;
}
}
return bRet;
}
// 回調(diào)字符
char Retract(ifstream& src)
{
src.seekg(-1, ios::cur);
return '\0';
}
// 分析函數(shù)
void Analyzer(ifstream& src, ofstream& dst)
{
char ch;
char strToken[1024] = " ";
ch = GetBC(src);
// 判斷標(biāo)識符的情況
if (isalpha(ch))
{
while (isalpha(ch) || isdigit(ch) || ch == '_')
{
Contact(strToken, ch);
ch = Get_char(src);
}
ch = Retract(src);
if (Reserve_words(strToken))
dst << strToken << arrow << "Reserve Word" << enter;
else
dst << strToken << arrow << "Identifier" << enter;
}
// 判斷數(shù)值的情況
else if (isdigit(ch))
{
while (isdigit(ch))
{
Contact(strToken, ch);
ch = GetChar(src);
}
Retract(src);
dst << strToken << arrow << "Number" << enter;
}
// 判斷字符串的情況
else if (ch == '\'')
{
Contact(strToken, ch);
ch = Get_char(src);
while (ch != '\'')
{
Contact(strToken, ch);
ch = Get_char(src);
}
if (ch != '\'')
cerr << "String is too long - more than 1024 bytes!" << endl;
else
{
Contact(strToken, ch);
dst << strToken << arrow << "String" << enter;
}
}
// 過濾注釋
else if (ch == '{')
{
while (Get_char(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 = Get_char(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 = Get_char(src);
if (ch == '=')
dst << ">=" << arrow << "Greater or Equal" << enter;
else
{
dst << '>' << arrow << "Greater" << enter;
Retract(src);
}
}
// 判斷.和..
else if (ch == '.')
{
ch = Get_char(src);
if (ch == '.')
dst << ".." << arrow << "Bound" << enter;
else
{
dst << '.' << arrow << "Point" << enter;
Retract(src);
}
}
// 判斷:和:=
else if (ch == ':')
{
ch = Get_char(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;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -