#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;
}
tyf.rar_四元组_语义分析_语义分析程序
版权申诉
172 浏览量
2022-09-23
23:00:26
上传
评论
收藏 2KB RAR 举报
JonSco
- 粉丝: 67
- 资源: 1万+
最新资源
- #P0015. 全排列 超级简单
- pta题库答案c语言之排序4统计工龄.zip
- pta题库答案c语言之树结构7堆中的路径.zip
- pta题库答案c语言之树结构3TreeTraversalsAgain.zip
- pta题库答案c语言之树结构2ListLeaves.zip
- pta题库答案c语言之树结构1树的同构.zip
- 基于C++实现民航飞行与地图简易管理系统可执行程序+说明+详细注释.zip
- pta题库答案c语言之复杂度1最大子列和问题.zip
- 三维装箱问题(Three-Dimensional Bin Packing Problem,3D-BPP)是一个经典的组合优化问题
- 以下是一些关于Linux线程同步的基本概念和方法.txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0