| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 814 人关注过本帖
标题:关于词法分析器
只看楼主 加入收藏
zhangyou1010
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-7-23
收藏
 问题点数:0 回复次数:1 
关于词法分析器

该程序模拟小型词法分析器,读入的文件从in.txt。输出到 out.txt 。对输入的程序做如下转化:
如果是关键字 象 void ,if,while 这些,。如果不是关键字,这考虑是否为标志符。
同样其他的象运算符,分界符,分别输出到out.txt文件。
假设in.txt中为 :
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a,b;
float c,d;
return 0;
}

out.txt中应为(# , sign)
(include , identifier)
(< , op)
(stdio , identifier)
(. , seprator)
(h , identifier)
(> , op)
(# , sign)
(include , identifier)
(< , op)
(stdlib , identifier)
(. , seprator)
(h , identifier)
(> , op)
(int , keyword)
(main , identifier)
(( , seprator)
() , seprator)
({ , seprator)
(int , keyword)
(a , identifier)
(, , seprator) 等 等,当然该程序还存在好多不足与缺陷,


现在我想问的问题是,为什么in.txt中如果 内容很多的话会出现 调试窗口, 内容很少时不会出现 。内存为512M,跟内存应该没多大关系吧。。。麻烦哪位知道的 帮帮忙,谢了。
请回复到邮箱zhangyou1010@126.com ,QQ382973481 非常感谢。


同时祝您 新年快乐!


#include<iostream>
#include<fstream>
#include<string.h>
#include<stdlib.h>

using namespace std;

bool iskeyword(char *str); //为关键字
bool is_digit(char ch); //判断是否为数字
bool is_letter(char ch ); //判断字母
bool is_identifier(char *type); //为标志符
bool is_operator(char ch); //运算符
bool is_seprator(char ch); //分界符
char getstr(fstream & src); //读入一个字符
char get(fstream src) ; //读入空格符


// 判断是否为关键字
bool iskeyword(char *str)
{
bool b = false; //做标记用
char *key[]=

{"true","break","case","char","const","continue","default","do","double",

"else","false","extern","float","for","goto","if","int","long","register",

"return","short","signed","sizeof","static","struct","switch","typedef",

"union","unsigned","void","volatile","while","printf"};//C语言所有关键字

for(int i=0;i<33;i++)
{
if(strcmp(key[i],str)==0)
{
b=true;
break;
}
}
return b;
}

//判断是否为数字
bool is_digit(char ch)
{

if('0'<=ch&&ch<='9')
return true;

else return false;
}


//判断字母
bool is_letter(char ch )
{
if('a'<=ch&&ch<='z'||'A'<=ch&&ch<='Z')
return true;

else return false;
}

//运算符
bool is_operator(char ch)
{
if(strchr("+-*/%><=",ch))
return true;

else false;
}


//分界符
bool is_seprator(char ch)
{
if(strchr(";:'{},.()",ch))
return true;

else return false;
}

//读入下一个字符
char getstr(ifstream &src)
{
char c;
src.get(c);
return c;
}

// 读入空格
char get(ifstream &src)
{
char c=' ';
src.get(c);
while(c==' ')
src.get(c);
return c;
}

// 光标后退一个字符
void back(ifstream& src)
{
src.seekg(-1, ios::cur);

}

//分析函数
void lex(ifstream &src, ofstream &dst)
{
char ch,token[10],*temp;
int i=0;
src.get(ch);
while(ch==' ')
src.get(ch);

if(is_letter(ch))//判断为关键字形式或标志符
{
while(isalpha(ch)||is_digit(ch)||ch=='_')
{
token[i++]=ch;
ch=getstr(src);
}
temp=new char[i];
memcpy(temp,token,i);
temp[i]='\0';
back(src);

if(iskeyword(temp)) dst<<"("<<temp<<" , "<<"keyword"<<")"<<endl;
else dst<<"("<<temp<<" , "<<"identifier"<<")"<<endl;
}

//判断为整数或实数形式
else if(is_digit(ch))
{
while(is_digit(ch)||ch=='.')
{
token[i++]=ch;
ch=getstr(src);

}
temp=new char[i+1];
memcpy(temp,token,i);
temp[i]='\0';
back(src);
dst<<"("<<temp<<" , "<<"num"<<")"<<endl;
}

//判断字符串的情况
else if(ch=='\"')
{ src.get(ch);
if(ch=='%')
{
token[i++]=ch;
src.get(ch);
while(ch!='\"')
{
token[i++]=ch;
src.get(ch);
}
temp=new char[i+1];
memcpy(temp,token,i);
temp[i]='\0';
back(src);
dst<<"("<<temp<<" , "<<"convert"<<")"<<endl;
}

else
{
token[i++]=ch;
while(ch!='\"')
{
src.get(ch);
token[i++]=ch;
}
temp=new char[i+1];
memcpy(temp,token,i);
temp[i]='\0';
back(src);
dst<<"("<<temp<<" , "<<"string"<<")"<<endl;
}

}

//消除注释
else if(ch=='/')
{if((ch=getstr(src))=='/')
while(ch!='\n') ch=getstr(src);

}

//判断单目运算符情形
else if(is_operator(ch))
{
dst<<"("<<ch<<" , "<<"op"<<")"<<endl;

}

//为分界符情形
else if(is_seprator(ch))
{
dst<<"("<<ch<<" , "<<"seprator"<<")"<<endl;

}
else if(ch=='#')
dst<<"("<<ch<<" , "<<"sign"<<")" <<endl;
else if(ch=='~')
dst<<"("<<ch<<" , "<<")"<<"sign" <<endl;
else if(ch=='!')
dst<<"("<<ch<<" , "<<")"<<"sign" <<endl;
else if(ch=='$')
dst<<"("<<ch<<" , "<<"sign"<<")" <<endl;
else if(ch==' ') while(ch==' ') src.get(ch);
else if(ch=='\n') ;

else dst<<"error"<<endl;
}


int main()
{

ifstream src("in.txt",ios::in);
ofstream dst("Result.txt",ios::out);
if(!src) cout<<"can't open the file !"<<endl;

else {
cout<<"******************************词法分析器***********************************"<<endl;
while(!src.eof())
lex(src,dst);

dst.close();
src.close();
cout<<"The Program running success !"<<endl;
}
return 0;
}

搜索更多相关主题的帖子: 词法 分析器 
2006-12-29 23:02
smartwind
Rank: 1
等 级:新手上路
威 望:1
帖 子:277
专家分:0
注 册:2006-11-13
收藏
得分:0 
内容少时不是不出现而是一闪而过

2006-12-30 08:26
快速回复:关于词法分析器
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015924 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved