简单的词法分析器

原创 2012年03月22日 18:21:43

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



相关文章推荐

深入浅出编译原理-4-一个简单词法分析器的C语言实现

引言 光说不练,假把式。 此小节来做一个实验,用c语言自己实现一个简单的词法分析器,来加深对词法分析的理解。感兴趣的就自己分析一下源码吧,挺简单的,就没画流程图,请见谅。闲言少叙,我们开始吧。 ...

java简单地实现Tiny语言的词法分析器

只是简单地编写,实现了一些简单的功能,没有考虑到代码优化等问题。 Tiny语言定义   一、 字符集定义 1.  → ││ 2.  → A│B│…│Z│a│b...

c语言词法分析器的简单实现

前不久编译原理学习了词法分析,自己实现了一个简单的c语言词法分析器,来加深对词法分析器原理,状态转换图,有限自动机的理解。当我们想在电脑上运行一个c语言程序时,都要将源程序进行编译。编译简单来说就是将...

java实现的简单词法分析器

下面是词法分析的核心代码 public class Analyze {  private String []keyWord = {"if" ,"int","while","else","then"...
  • ccf1226
  • ccf1226
  • 2012年04月27日 10:26
  • 289

用C语言实现简单的词法分析器

词法分析器又称扫描器。词法分析是指将我们编写的文本代码流解析为一个一个的记号,分析得到的记号以供后续语法分析使用。词法分析器的工作是低级别的分析:将字符或者字符序列转化成记号.。 要实现的词...

编译原理c++简单词法分析器

简单词法分析程序         编译原理课程词法分析程序,自己c++写的比较简单功能实现,需要的用户可以在此基础上进行自己思路的扩充修改。功能:读取一个自己设定路径下的txt文件中代码,然后将分析...

简单词法分析器的实现原理(编译原理)

开篇 编译,简单的说,就是把源程序转换为可执行程序。从hello world 说程序运行机制 里面简单的说明了程序运行的过程,以及一个程序是如何一步步变成可执行文件的。在这个过程中,编译器做了很多重...

词法分析器flex的简单用法

安装flex在Ubuntu下安装flex非常简单,只需要在终端中输入sudo apt-get install flex即可;如果说找不到flex,可能你需要更新系统的源,百度一下“Ubuntu更新源”...
  • wlym123
  • wlym123
  • 2017年01月14日 13:48
  • 193

【转载】简单词法分析器的实现

词法分析器的C++实现

一个简单词法分析器的C语言实现

一个简单词法分析器的C语言实现 1.1实验描述 例如:对源程序: begin x:=9: if x>9 then x:=2*x+1/3; end # 的源文件,...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单的词法分析器
举报原因:
原因补充:

(最多只允许输入30个字)