简单的词法分析器

原创 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”,数字)
(“;”,分隔符)
(“}”,分隔符)



简单词法分析器的实现

这是我们的一次编程作业,要求用C编写一个简单的词法分析器。要求如下: 编制一个单词获取程序,从文件输入的源程序中,识别出各个具有独立意义的单词,即关键字、标识符、整数、小数、字符串、分隔符、运算符等...
  • abc12580
  • abc12580
  • 2016年04月05日 18:59
  • 379

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

一个简单词法分析器的C语言实现 1.1实验描述 例如:对源程序: begin x:=9: if x>9 then x:=2*x+1/3; end # 的源文件,...
  • chenglinhust
  • chenglinhust
  • 2013年06月13日 14:07
  • 7571

最简单的词法分析器

1、 实验目的: 设计、编制、调试一个词法分析程序,对单词进行识别和编码,加深对词法分析原理的理解。   2、 实验要求 (1) 允许用户自己输入源程序并保存为文件 (2) 系统能够输出经过...
  • weailily
  • weailily
  • 2016年05月09日 20:29
  • 3861

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

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

简易词法分析器

当我们写好一段代码之后,我们通常的操作是:编译,链接, 执行。 而在编译阶段,我们的编译器就会进行词法分析这个阶段,来分析有没有词法错误。 而单词符号一般分为五大类: 1.关键字,也称保留字,比...
  • turn__back
  • turn__back
  • 2016年06月12日 16:42
  • 2223

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

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

【编译原理】一个词法分析器源码的剖析

一,词法分析器         作用:读取源程序的输入字符、将他们组成词素,生成并输出一个词法单元序列 二,设计原理         1)C程序语言的符号分类:关键字、标识符、常数、运算符、界符...
  • tianshuai11
  • tianshuai11
  • 2012年05月01日 21:36
  • 3569

java实现简单的词法分析器

package com; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOExce...
  • u012188794
  • u012188794
  • 2014年11月17日 21:22
  • 945

[编译原理]词法分析器的分析与实现

词法分析概述:编译程序要对高级语言编写的源程序进行分析和合成,生成目标程序。词法分析是对源程序进行的首次分析,实现词法分析的程序成为词法分析程序(或词法分析器),也称扫描器。 像用自然语言书写的文章一...
  • u012848631
  • u012848631
  • 2015年06月16日 13:50
  • 11570

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

前不久编译原理学习了词法分析,自己实现了一个简单的c语言词法分析器,来加深对词法分析器原理,状态转换图,有限自动机的理解。当我们想在电脑上运行一个c语言程序时,都要将源程序进行编译。编译简单来说就是将...
  • hjh_walker
  • hjh_walker
  • 2016年11月04日 21:24
  • 3322
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:简单的词法分析器
举报原因:
原因补充:

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