关闭

简单的词法分析器

标签: cios
1137人阅读 评论(0) 收藏 举报
分类:

此程序仅是简单练习,所含关键字,运算符等数量非常有限,仅限于示例中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”,数字)
(“;”,分隔符)
(“}”,分隔符)



1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:181203次
    • 积分:2146
    • 等级:
    • 排名:第18306名
    • 原创:37篇
    • 转载:13篇
    • 译文:0篇
    • 评论:55条
    文章分类
    最新评论