简单的词法分析器

此程序仅是简单练习,所含关键字,运算符等数量非常有限,仅限于示例中infile.c程序中的保留字和运算符,完全不具有通用性。

//简易的词法分析器

//编译环境 Visual Studio 2008 C++ win32控制台程序


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

using namespace std;

char* guanjianzi[9]={"if","int","for","while","do","return","break","continue","main"};//把关键字放到数组里,用于一会儿比较

char GetChar(ifstream& infile)//
{
char _ch;
infile.get(_ch);
return _ch;
}

char GetBC(ifstream& infile)
{
char _ch;
infile.get(_ch);
while(_ch==' ')
   infile.get(_ch);
return _ch;
}

void Concat(char* str,char ch)
{
size_t n=strlen(str);
str[n++]=ch;
str[n]='\0';
}

bool Reserve(const char* str)
{
bool flag=false;
for(int i=0;i<9;i++)
{
   if(_stricmp(guanjianzi[i],str)==0)//如果是关键字,则修改标志,跳出比较循环
   {
    flag=true;
    break;
   }
}
return flag;//返回类型为bool
}

char Retract(ifstream& infile)
{
infile.seekg(-1,ios::cur);//该函数将文件指针从当前位置回退一位
return '\0';
}

void Analysis(ifstream& src,ofstream& result)
{
char ch;
char strToken[10]="";
ch=GetChar(src);

if(isalpha(ch))//如果ch是字母,则可能组成关键字或标识符
{
   while(isalpha(ch)||isdigit(ch))//超前搜索
{
   Concat(strToken,ch);
   ch=GetChar(src);
}
ch=Retract(src);//下一个字符不是字母或数字,就回退一位
if(Reserve(strToken))
   result<<"("<<"“"<<strToken<<"”"<<","<<" 关键字)"<<endl;//如果是关键字,则在结果中输出该关键字,并指出是关键字
else
   result<<"("<<"“"<<strToken<<"”"<<","<<"标识符)"<<endl;//如果在关键字表中找不到,就说明是标识符
}

else if(isdigit(ch))//如果ch是数字,则有可能继续和后面的其他数字相连
{
while(isdigit(ch))//超前搜索
{
   Concat(strToken,ch);
   ch=GetChar(src);
}
Retract(src);
result<<"("<<"“"<<strToken<<"”"<<","<<"数字)"<<endl;//输出数字
}

else if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='=')//如果ch是运算符
{
result<<"("<<"“"<<ch<<"”"<<","<<"运算符)"<<endl;
}

else if(ch==';'||ch=='('||ch==')'||ch=='{'||ch=='}'||ch==',')//如果ch是分隔符

{
result<<"("<<"“"<<ch<<"”"<<","<<"分隔符)"<<endl;
}


}

void main()
{
ifstream _infile("C:\\infile.c");//将待分析的.C文件定义为一个输入流
ofstream _oufile("C:\\result.txt");//将输出结果的.txt文件定义为一个输出流
while(!_infile.eof())
   Analysis(_infile,_oufile);//文件没有结束,就调用分析函数
_infile.close();
_oufile.close();
cout<<"词法分析结果已经放入C:\result.txt下"<<endl;
system("pause");
}


示例用的 infile.c(放在C盘根目录下):

main()
{
int a,b;
a=10;
b=a+20;
}

输出结果:(输出到C盘根目录下)

(“main”,标识符)
(“(”,分隔符)
(“)”,分隔符)
(“{”,分隔符)
(“int”, 关键字)
(“a”,标识符)
(“,”,分隔符)
(“b”,标识符)
(“;”,分隔符)
(“a”,标识符)
(“=”,运算符)
(“10”,数字)
(“;”,分隔符)
(“b”,标识符)
(“=”,运算符)
(“a”,标识符)
(“+”,运算符)
(“20”,数字)
(“;”,分隔符)
(“}”,分隔符)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值