`
insertyou
  • 浏览: 900948 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

词法分析程序

 
阅读更多
/*************************************************************/
/*
/*词法分析程序
/*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语言编写的源程序中的每个单词符号,...

    pl/0 词法分析程序

    **pl/0 词法分析程序** pl/0是一种简单的编程语言,它是Pascal语言的一个简化版本,由Alfred V. Aho、Monica S. Lam、Ravi Sethi和Jeffrey D. Ullman在《编译器设计》一书中提出,用于教学目的。词法分析是编译器...

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

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

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

    "词法分析程序设计与实现" 在计算机科学中,词法分析是编译器或解释器的第一阶段,负责将源代码分割成单词符号(Token),然后将其传递给语法分析阶段。词法分析程序的设计与实现是计算机科学中一个非常重要的课题...

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

    在这个过程中,词法分析程序起着至关重要的作用。 首先,我们需要了解词法分析的基本原理。词法分析器通常由两部分组成:扫描器(scanner)和词汇表(lexicon)。扫描器读取源代码字符流,并基于预定义的模式或正则...

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

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

    java实现的基本词法分析程序

    本篇文章将深入探讨Java实现的基本词法分析程序及其原理,同时结合提供的实验说明,来理解这个过程。 首先,我们要了解词法分析的定义。词法分析(也称为扫描或lexing)是编译器前端的第一步,它的任务是将源代码...

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

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

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

    ### 实验一 词法分析程序设计与实现 #### 实验背景与目的 词法分析是编译原理中的一个重要组成部分,其主要任务是从源代码中提取出一个个具有独立意义的基本单位(即“单词”),并将这些单词转换为特定的种别码...

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

    ### 设计、编制并调试一个词法分析程序 #### 一、引言 词法分析是编译原理中的一个重要组成部分,其主要任务是将源代码转换为一系列的符号(tokens)。这一过程对于编译器来说至关重要,因为它为后续的语法分析、...

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

    ### C语言子集的词法分析程序知识点解析 #### 一、实验背景及目标 **实验目的:**通过设计并实现一个针对C语言子集的词法分析程序,旨在加深学生对词法分析原理的理解,并掌握如何从源程序中识别并提取出关键字、...

    手工构造简单词法分析程序

    手工构造简单词法分析程序,编译原理里面的,程序完美运行,是用VS2013写的 了解词法分析程序的基本构造原理,掌握简单词法分析程序的手工构造方法。 1、输入的常量说明串,要求最后以分号作结束标志; 2、根据输入...

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

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

    词法分析程序构造原理与实现技术

    本主题聚焦于如何构造词法分析程序,特别是针对Pascal语言子集的词法分析,基于给出的正则文法。 正则文法描述了Pascal语言中标识符的构成规则。这里的文法规则如下: 1. `&lt;标识符&gt;` → 字母 2. `&lt;标识符&gt;` → `...

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

    词法分析程序是编译器设计中的一个关键步骤,它主要负责从源代码中提取出一个个有意义的单元,称为“单词”或“记号”,这些单词可以是标识符、关键字、常量、运算符等。在编译原理中,词法分析是编译过程的第一阶段...

    编译原理词法分析程序设计

    编译原理词法分析程序设计 本资源详细介绍了编译原理中词法分析的概念和实现方法,并提供了一个简单语言的子集的词法分析程序的设计和实现。 词法分析是编译原理中的一种基本技术,用于将源程序代码分解成单个词法...

    编译原理课程的词法分析程序

    在本课程的词法分析程序中,我们主要关注的是编译器的第一个阶段——词法分析。** 词法分析,也称为扫描或标记,是编译过程的初步步骤。它的任务是从源代码文本中识别出一个个有意义的符号,这些符号被称为“记号”...

Global site tag (gtag.js) - Google Analytics