`
huobengle
  • 浏览: 863787 次
文章分类
社区版块
存档分类
最新评论

词法分析程序

 
阅读更多
/*************************************************************/
/*
/*词法分析程序
/*maker:张建波
/*date:2005-10-26
/*
/*************************************************************/
#include "stdio.h"
#include "ctype.h"
#include "string.h"

/*保留字数量*/
#define keywordSum 8
char *keyword[keywordSum]={"if","else","for","while","do","int","read","write"};

/*纯但单分界符*/
#define singlewordSum 10
char singleword[singlewordSum]="+-*(){};,:";

/*双分界符*/
#define doublewordSum 4
char doubleword[doublewordSum]="<>=!";

#define wordlen 40 /*单词最大长度*/


char ScanInFile[300]; /*待分析的源程序文件*/
char ScanOutFile[305]; /*词法分析后的输出文件*/

FILE *fin,*fout; /*输入输出文件的指针*/

int LoadCodeFile()
{
/* 打开待分析的 源代码文件*/

printf("请输入源程序文件名:");
scanf("%s",ScanInFile);
if((fin=fopen(ScanInFile,"r"))==NULL)
{
printf("/n找不到文件:%s/n文件打开失败!/n");
return 0;
}
else
return 1;
}

int CreatWordFile()
{
/*创建次词法分析后结果的输出 文件*/
int len=0;
int i=0;
strcpy(ScanOutFile,ScanInFile);
while(ScanOutFile[i++]!='.');
ScanOutFile[i+1]='s';
ScanOutFile[i+2]='c';
ScanOutFile[i+3]='n';
ScanOutFile[i+4]='/0';
if((fout=fopen(ScanOutFile,"w"))==NULL)
{
/*文件创建失败*/
return 0;
}
else
return 1;

}

/*词法分析程序*/
int TScan()
{

char ch,token[wordlen]; /*ch 为每次读入的字符,token 为识别出来的单词*/

char ch1; /*处理注释时 用的临时变量*/

int err=0; /* 设置错误代码为 0, 表示没有错误 */
int j,n; /*临时变量,控制组合单词时的数组下标*/


if(LoadCodeFile()==0)
return 1; /*源代码文件读取失败*/
if(CreatWordFile()==0)
return 2; /*文件创建失败*/

ch=getc(fin);
while(ch!=EOF)
{
while(ch==' '||ch=='/n'||ch=='/t')
{
ch=getc(fin);
}
if(isalpha(ch))
{
/*输入的是字母,进行 标示符 处理*/
token[0]=ch;
j=1;
while(isalnum(ch))
{
token[j++]=ch;
ch=getc(fin);
}/*如果是字母数字则组合,否则结束*/
token[j]='/0';
/*查找保留字*/
n=0;
while((n<keywordSum) && strcmp(token,keyword[n]))
n++;
if(n>=keywordSum)
{
/*输出标示符*/
fprintf(fout,"%s/t%s/n","ID",token);
printf("%s/t%s/n","ID",token);
}
else
{
/*输出保留字*/
fprintf(fout,"%s/t%s/n",token,token);
printf("%s/t%s/n",token,token);
}
}
else if(isdigit(ch))
{
/*输入的是数字,进行 数字处理*/
token[0]=ch;
j=1;
ch=getc(fin);/*读下一字符*/
while(isdigit(ch))
{/*如果是数字则整合数字*/
token[j++]=ch;
ch=getc(fin);
}
token[j]='/0';/*整数整合结束*/
fprintf(fout,"%s/t%s/n","NUM",token);
printf("%s/t%s/n","NUM",token);
}
else if(strchr(singleword,ch)>0)
{
/*输入的是单分界符*/
token[0]=ch;
token[1]='/0';
ch=getc(fin);
fprintf(fout,"%s/t%s/n",token,token);
printf("%s/t%s/n",token,token);
}
else if(strchr(doubleword,ch)>0)
{
/*输入的是双分界符*/
token[0]=ch;
ch=getc(fin);
if(ch=='=') /*如果是 = 则组合双分界符*/
{
token[1]=ch;token[2]='/0';
ch=getc(fin);
}
else
{
token[1]='/0';
}
fprintf(fout,"%s/t%s/n",token,token);
printf("%s/t%s/n",token,token);
}
else if(ch=='/')
{
/*注释处理*/
ch=getc(fin);
if(ch=='*')
{
ch1=getc(fin);
do
{
ch=ch1;
ch1=getc(fin);
}while((ch!='*'||ch1!='/')&&ch1!=EOF);
ch=getc(fin);
}
else
{
token[0]='/';
token[1]='/0';
fprintf(fout,"%s/t%s/n",token,token); /*输出单词分界符*/
printf("%s/t%s/n",token,token);
}
}
else
{
/*无法识别的字符 */
token[0]=ch;
token[1]='/0';
ch=getc(fin);
err=3;
fprintf(fout,"%s/t%s/n","ERROR",token); /*输出错误符号*/
printf("%s/t%s/n","ERROR",token);
}
}
return err;
}

void main()
{
int e=0;
e=TScan();
if(e>0)printf("编译错误!");
else
printf("词法分析成功!");

}
分享到:
评论

相关推荐

    实验一 源程序的预处理及词法分析程序设计等.zip

    实验一 源程序的预处理及词法分析程序设计等.zip实验一 源程序的预处理及词法分析程序设计等.zip实验一 源程序的预处理及词法分析程序设计等.zip实验一 源程序的预处理及词法分析程序设计等.zip实验一 源程序的...

    词法分析程序的设计与实现

    词法分析程序的示例,仅供参考。 使用LEX编写。 北邮 大三 编译原理 词法分析 词法分析程序的设计与实现 实验内容设计并实现C语言的词法分析程序,要求如下: 1)可以识别出用C语言编写的源程序中的每个单词符号,...

    一个小语言的词法分析程序

    前些天写了个小语言的词法分析程序,因为前些天在VC知识库看到一个pascal词法分析的程序,觉得写得挺复杂的。其实词法分析程序的原理都是一样的,所以我想只 要搞明白了简单的词法分析程序,再写复杂的就不难了,...

    实验一 词法分析程序设计与实现

    能够采用一种编程语言实现简单的词法分析程序;能够使用自己编写的分析程序对简单的程序段进行词法分析。 1.关键字:if、int、for、while、do、return、break、continue;单词种别码为1。 2.标识符;单词种别码为2。...

    PL0词法分析程序_PL0词法分析_

    从 PL/0 编译程序源码中抽出词法分析部分,构建 PL/0 独立词法分析程序。功能:输入为 PL/0 源程序, 输出为单词符号的序列;对于标识符和无符号整数,显示单词种别和单词自身的值两项内容;对于其他单词符 号,仅...

    pl0词法分析程序词法分析程序的任务

    pi1. 词法分析程序的任务 词法分析程序扫描源程序,也称之为扫描程序,提供一个个符号给语法分析程序,语法分析程序以此为基础进行语法分析。 词法分析程序设计为一个子程序,由语法分析程序调用。PL/0编译程序中,...

    编译原理实验:词法分析程序

    设计完成正则文法所描述的Pascal 语言子集单词符号的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。 编制一个读单词过程,从输入的源程序...

    pl/0 词法分析程序

    pl/0的词法分析程序。偶观网上这部分学习内容很少,特上传之以供大学学习之用,尤其是初学者使用^^^

    词法分析程序流程图

    词法分析程序流程图

    c语言编译原理实验-课设-词法分析程序-代码+报告

    设计并实现一个C语言词法分析程序(1)可以识别出用C语言编写的源程序中的每个单词符号,以记号的形式输出每个单词符号。 (2)可以识别并跳过源程序中的注释。 (3)可以统计源程序中的语句行数、各类单词的个数、以及字符...

    介绍词法分析程序的编程与调试。

    通过设计调试词法分析程序,实现从源程序中分出各种单词的方法:加深对课堂教学的理解;提高词法分析方法的实践能力。

    词法分析程序设计与实现.pdf

    词法分析程序设计与实现.pdf

    编译原理课程设计--词法分析程序.doc

    以开始定义的C语言子集的源程序作为词法分析程序的输入数据。在词法分析中,自文件头开始扫描源程序字符,一旦发现符合“单词”定义的源程序字符串时,将它翻译成固定长度的单词内部表示,并查填适当的信息表。经过...

    编译原理实践——词法分析程序的自动生成器LEX

    词法分析程序的自动生成器LEX相关知识介绍。

    设计,编制并调试一个词法分析程序

    设计,编制并调试一个词法分析程序,加深对词法分析原理的理解。主要使用C/C++语言实现。新算法,新思维。

    词法分析程序java版

    编译原理实验写的一份小型词法分析程序,具体掌握基本分析方法,此程序是对源代码的一次分析,可能输出的有点多.

    编写词法分析程序

    通过设计、调试词法分析程序,掌握词法分析程序的设计工具,即有穷自动机,进一步理解自动机理论;掌握文法转换成自动机的技术及有穷自动机实现的方法;会确定词法分析器的输出形式及标识符与关键字的区分方法;加深...

    设计、编制并调试一个词法分析程序

    实验目的:设计、编制并调试一个词法分析程序,加深对词法分析程序的理解。 2、实验要求: (1)能识别关键字、运算符号、界符、标识符、数字(无符号整数、实数(4分)、科学计数法表示的数(5分)) (2)要求建立...

    C语言子集的词法分析程序

    目的:通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法.

    编译原理实验词法分析程序

    成扩展的PL0 词法分析程序,掌握词法分析实现机制。 二.实验要求 1. 完成实验的要求 (1)条件语句改为: &lt;条件语句&gt; ::= IF &lt;条件&gt; THEN &lt;语句&gt; [ELSE &lt;语句&gt;] 即增加保留字 ELSE (2)增加注释: .. 单行注释: 单行...

Global site tag (gtag.js) - Google Analytics