分享
 
 
 

我写的一个C语言词法分析器的代码,可以直接运行.一起分享下 嘿嘿~~~ 欢迎批评

王朝c/c++·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

我自己写的个词法分析程序 可以完成一个非常非常基本的C语言词法分析.自己鼓励下自己 :-)

#include <iostream>

#include <vector>

#include <utility>

#include <string>

#include <fstream>

#include <algorithm>

#include <cstdlib>

using namespace std;

//用来存储目标文件名

string file_name;

//提取文本文件中的信息。

string GetText();

//获得一个单词符号,从位置i开始查找。

//并且有一个引用参数j,用来返回这个单词最后一个字符在str的位置。

string GetWord(string str,int i,int& j);

//这个函数用来除去字符串中连续的空格和换行

//第一个参数为目标字符串,第二个参数为开始位置

//返回值为连续的空格和换行后的第一个有效字符在字符串的位置

int DeleteNull(string str,int i);

//判断i当前所指的字符是否为一个分界符,是的话返回真,反之假

bool IsBoundary(string str,int i);

//判断i当前所指的字符是否为一个运算符,是的话返回真,反之假

bool IsOperation(string str,int i);

//此函数将一个pair数组输出到一个文件中

void OutFile(vector<pair<int,string> > v);

//此函数接受一个字符串数组,对它进行词法分析,返回一个pair型数组

vector<pair<int,string> > analyst(vector<string> vec);

//此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假

bool IsKey(string str);

int main()

{

cout<<"###########################\n";

cout<<"###copyright: Giftedbird###\n";

cout<<"###########################\n";

string com1=" ";

string com2="\n";

string fileline=GetText();

int begin=0,end=0;

vector<string> array;

do

{

begin=DeleteNull(fileline,begin);

string nowString;

nowString=GetWord(fileline,begin,end);

if(end==-1)

break;

if(nowString.compare(com1)&&nowString.compare(com2))

array.push_back(nowString);

begin=end+1;

}while(true);

vector<pair<int,string> > mid_result;

mid_result=analyst(array);

OutFile(mid_result);

cout<<"**********************************************************************\n";

cout<<"***程序已完成词法分析,分析结果已经存储在文件"<<file_name<<"中!!!***\n";

cout<<"**********************************************************************\n";

system("pause");

return 0;

}

//提取文本文件中的信息

string GetText()

{

string file_name1;

cout<<"请输入源文件名(包括路径和后缀名):";

cin>>file_name1;

ifstream infile(file_name1.c_str(),ios::in);

if (!infile)

{

cerr<<"哦!无法打开文件 "<<file_name1.c_str()<<" !!!"<<endl;

exit(-1);

}

cout<<endl;

char f[1000];

infile.getline(f,1000,EOF);

infile.close();

return f;

}

//获得一个单词符号,从位置i开始查找。

//并且有一个引用参数j,用来返回这个单词最后一个字符在原字符串的位置。

string GetWord(string str,int i,int& j)

{

string no_use("(){} , ; \n+=*/-<>\"");

j=str.find_first_of(no_use,i);

if(j==-1)

return "";

if(i!=j)

j--;

return str.substr(i,j-i+1);

}

//这个函数用来除去字符串中连续的空格和换行

//第一个参数为目标字符串,第二个参数为开始位置

//返回值为连续的空格和换行后的第一个有效字符在字符串的位置

int DeleteNull(string str,int i)

{

for(;;i++)

if(str[i]!=' '&&str[i]!='\n')

return i;

}

//判断i当前所指的字符是否为一个分界符,是的话返回真,反之假

bool IsBoundary(string str,int i)

{

int t;

char arr[7]={',',';','{','}','(',')','\"'};

for (t=0;t<7;t++)

if(str[i]==arr[t])

return true;

return false;

}

//判断i当前所指的字符是否为一个运算符,是的话返回真,反之假

bool IsOperation(string str,int i)

{

int t;

char arr[7]={'+','-','*','/','=','<','>'};

for (t=0;t<7;t++)

if(str[i]==arr[t])

return true;

return false;

}

//此函数将一个个字符串数组输出到一个文件中

void OutFile(vector<pair<int,string> > v)

{

cout<<"请输入目标文件名(包括路径和后缀名):";

cin>>file_name;

ofstream outfile(file_name.c_str(),ios::out);

if (!outfile)

{

cerr<<"哦!无法打开文件 "<<file_name.c_str()<<" !!!"<<endl;

exit(-1);

}

cout<<endl;

int i;

outfile<<"###########################\n";

outfile<<"###copyright: Giftedbird###\n";

outfile<<"###########################\n\n";

for(i=0;i<v.size();i++)

outfile<<"<"<<v[i].first<<" , \""<<v[i].second<<"\">"<<endl;

outfile<<"\n\n*********************************\n";

outfile.close();

return;

}

//此函数接受一个字符串数组,对它进行词法分析,返回一个pair型数组

vector<pair<int,string> > analyst(vector<string> vec)

{

vector<pair<int,string> > temp;

int i;

for(i=0;i<vec.size();i++)

{

if(vec[i].size()==1)

{

if((vec[i]==">"||vec[i]=="<"||vec[i]=="!")&&vec[i+1]=="=")

{

string jk=vec[i];

jk.append(vec[++i],0,1);

pair<int,string> pp(4,jk);

temp.push_back(pp);

continue;

}

if((vec[i]=="+"&&vec[i+1]=="+")||(vec[i]=="-"&&vec[i+1]=="-"))

{

string jk=vec[i];

jk.append(vec[++i],0,1);

pair<int,string> pp(4,jk);

temp.push_back(pp);

continue;

}

if(IsBoundary(vec[i],0))

{

pair<int,string> pp(5,vec[i]);

temp.push_back(pp);

}

else if(IsOperation(vec[i],0))

{

pair<int,string> pp(4,vec[i]);

temp.push_back(pp);

}

else if(vec[i][0]<='9'&&vec[i][0]>='0')

{

pair<int,string> pp(3,vec[i]);

temp.push_back(pp);

}

else

{

pair<int,string> pp(2,vec[i]);

temp.push_back(pp);

}

}

else if(vec[i][0]<='9'&&vec[i][0]>='0')

{

pair<int,string> pp(3,vec[i]);

temp.push_back(pp);

}

else if(IsKey(vec[i]))

{

pair<int,string> pp(1,vec[i]);

temp.push_back(pp);

}

else

{

pair<int,string> pp(2,vec[i]);

temp.push_back(pp);

}

}

return temp;

}

//此函数判断传递的参数是否为关键字,是的话,返回真,反之返回假

bool IsKey(string str)

{

string p[16]={"char","double","int","long","double","float","for","while","do","break","continue","switch","short","case","return","if"};

vector<string> ppp(p,p+16);

int u;

for(u=0;u<ppp.size();u++)

if(!str.compare(ppp[u]))

return true;

return false;

}

//finished

欢迎和我交流哦 QQ:252828618

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有