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

📄 lexicalanalysis.txt

📁 简单一点的用C++编写的词法分析的源代码
💻 TXT
字号:
#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 + -