📄 词法注释版.txt
字号:
/*
1-关键字
2-标识符
3-常数(包括字符串)
4-运算符
5-界符
*/
#include <iostream>
#include <fstream>//文件流头文件无.h,以下有说明
#include <string>
#include <string.h>//字符串头文件
#include<stdio.h>
#include <ctype.h>//包含了isalpha等,是字符分类宏
using namespace std;//在目前的版本中可以支持这样的,不用.h为后缀了 这是使用名字空间std的意思。因为STL的所有代码都被定义在了std的名字空间中,如果不使用这一条语句,那么应该在每一个stl的类、模版、算法等之前冠以std::前缀
char* ReserveWords[32] = {
"auto","double","int","struct","break",
"else","long","switch","case","enum","register","typedef",
"char","extern","return","union","const","float","short",
"unsigned","continue","for","signed","void","default","goto",
"sizeof","volatile","do","if","while","static"};
char BlankSpace[] = " ";
char enter[] = "\r\n";
// 读入字符ch
char GetChar(ifstream& src)
{
char C;
src.get(C);//读入一个字符.get是ifstream中的一个函数
return C;
}
// 读入空格
char GetBC(ifstream& src)
{
char C;
src.get(C);
while (C == ' ')
src.get(C);
return C;
}
// 连接单词符号
void Connect(char *str, char c)
{
size_t n = strlen(str);//得到目前串长度
str[n++] = c;//作为连接的组合空间
str[n] = '\0';//结束标志
}
// 判断是否为保留字
bool Ifreserve(const char* str) //??????????????????????????????
{
bool flag = false;
for (int i = 0; i < 32; i++)
{
if (strcmp(ReserveWords[i], str) == 0)
{
flag = true;
break;
}
}
return flag;
}
// 回调字符
char Retract(ifstream& src)
{
src.seekg(-1, ios::cur);/*文件流中的一个函数,两种类型,两种参数!
seekg(pos_type _Pos);
seekg(off_type _Off,ios_base::seekdir _Way);
_Off
An offset to move the read pointer relative to way.
_Pos
The absolute position in which to move the read pointer.
_Way
One of the ios_base::seekdir enumerations.
Return Value
The stream (*this).
//用于在文件流移动读指针
*/
return '\0';
}
void Translate(ifstream& src, ofstream& dst)
{
char ch;
char strToken[1024] = "";
ch = GetBC(src);//定义ch字符初始空格
// 判断标识符的情况
if (isalpha(ch))
{
while (isalpha(ch) || isdigit(ch) || ch == '_')
{
Connect(strToken, ch);
ch = GetChar(src);
}
ch = Retract(src);
if (Ifreserve(strToken))
dst << strToken << BlankSpace << "1" << enter;
else
dst << strToken << BlankSpace << "2" << enter;
}
// 判断数字的情况
else if (isdigit(ch))
{
while (isdigit(ch))
{
Connect(strToken, ch);
ch = GetChar(src);//从标准输入设备读取一个字符,若文件结束或出错,则返回-1
}
Retract(src);
dst << strToken << BlankSpace << "3" << enter;
}
// 判断转义字符与串的情况
else if (ch == '\'')
{
Connect(strToken, ch);
ch = GetChar(src);
while (ch != '\'')
{
Connect(strToken, ch);
ch = GetChar(src);
}
if (ch != '\'')
cout << "error" << endl;
else
{
Connect(strToken, ch);
dst << strToken << BlankSpace << "3" << enter;//串
}
}
// 判断没有歧义的单目运算符
else if (ch == '+')
dst << ch << BlankSpace << "4" << enter;
else if (ch == '-')
dst << ch << BlankSpace << "4" << enter;
else if (ch == '*')
dst << ch << BlankSpace << "4" << enter;
else if (ch == '/')
dst << ch << BlankSpace << "4" << enter;
else if (ch == '=')
dst << ch << BlankSpace << "4" << enter;
else if (ch == '^')
dst << ch << BlankSpace << "4" << enter;
else if (ch == '[')
dst << ch << BlankSpace << "5" << enter;
else if (ch == ']')
dst << ch << BlankSpace << "5" << enter;
else if (ch == ',')
dst << ch << BlankSpace << "5" << enter;
else if (ch == ';')
dst << ch << BlankSpace << "5" << enter;
else if (ch == '(')
dst << ch << BlankSpace << "5" << enter;
else if (ch == ')')
dst << ch << BlankSpace << "5" << enter;
else if (ch == '{')
dst << ch << BlankSpace << "5" << enter;
else if (ch == '}')
dst << ch << BlankSpace << "5" << enter;
// 判断<、<>和<=
else if (ch == '<')
{
ch = GetChar(src);
if (ch == '>')
dst << "<>" << BlankSpace << "4" << enter;
else if (ch == '=')
dst << "<=" << BlankSpace << "4" << enter;
else
{
dst << '<' << BlankSpace << "4" << enter;
Retract(src);
}
}
// 判断>和>=
else if (ch == '>')
{
ch = GetChar(src);
if (ch == '=')
dst << ">=" << BlankSpace << "4" << enter;//类型4
else
{
dst << '>' << BlankSpace << "4" << enter;//类型4
Retract(src);//>=
}
}
// 判断.和..
else if (ch == '.')
{
ch = GetChar(src);
if (ch == '.')
dst << ".." << BlankSpace << "2" << enter;
else
{
dst << '.' << BlankSpace << "2" << enter;
Retract(src);//.和..
}
}
// 判断:和:=
else if (ch == ':')
{
ch = GetChar(src);
if (ch == '=')
dst << ":=" << BlankSpace << "4" << enter;
else
{
dst << ':' << BlankSpace << "2" << enter;
Retract(src);
}
}
}
int main(int argc, char* argv[])
{
string strSrc;
cout << "Please input source file\nlike in.txt... \n\n";
getline(cin, strSrc);
/*
if(cin=="in.txt"){
cout << "the source program below:\n";
while(ch=fopen("in.txt","r")!=NULL)
{
printf("%c",ch);
}
cout<<"\n\n"<<"The result has created to out.txt\n";
}
*/
system("pause");//系统暂停,让用户确定
ifstream src(strSrc.c_str()); // 打开文件
if (src.fail())
{
cerr << "\aFailed to open \"" << strSrc << "\"!" << endl;//cerr输出错误机制,有声音提示
return 1;
}
ofstream dst("out.txt"); //?????????????????????????????????????
while (!src.eof())
Translate(src, dst);
src.close();
dst.close();
cout << "The result is in the out.txt." << endl;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -