[编译原理]一个词法分析器源码的剖析

一,词法分析器

作用:读取源程序的输入字符、将他们组成词素,生成并输出一个词法单元序列

二,设计原理

1)C程序语言的符号分类:关键字、标识符、常数、运算符、界符

2)词法分析器的二元输出:

3)正规式和状态转换图

4)程序说明:

1>main 中打开源码文件,从第一个字符流读取

2>如果第一个是字符,则交给letterprocess(str); 处理

3>如果第一个是数字,则交给numberprocess(str); 处理

4>如果第一个是数字,则交给otherprocess(str); 处理

5>注意上述过程中,File *fp每读取一个词素,fp都会移动到下一个词素。对于空格的处理:isspace(ch)检查参数c是否为空格字符,也就是判断是否为空格('')、定位字符

('\t')、CR('\r')、换行('\n')、垂直定位字符('\v')或翻页('\f')的情况

这个程序输出结果情况汇总:关键字、算术运算符、关系运算符、分割符号、特殊符号、注释符号、逻辑运算符、非法符号

三,程序源码

[html] view plaincopy?

#include

#include

#include

#include

#include

#include

#define NULL 0

FILE *fp;

char ch;

char *keyword[34]={"auto","break","case","char","const","continue","default","do","double",

"else","enum","extern","float","for","goto","if","int","long","register",

"return","short","signed","sizeof","static","struct","switch","typedef", "printf",

"union","unsigned","void","volatile","while","main"};

char *operatornum[6]={"+","-","*","/","++","--"};

char *comparison[8]={"",">=","","==","!="};

char *interpunction[8]={",",";",":=",".","(",")","{","}"};

char *biaoshifu[6]={"%","$","^","&","_","#"};//特殊标识符

char *zhushifu[3]={"//","/*","*/"};//注释符

char *luoji[3]={"&&","||","!"};//逻辑运算符

bool search(char searchstr[],int wordtype)//符号匹配

{

int i;

switch (wordtype)

{

case 1:

for(i=0;i

{

if(strcmp(keyword[i],searchstr)==0)

return(true);

}

break;

case 2:

for(i=0;i

{

if(strcmp(operatornum[i],searchstr)==0)

return(true);

}

break;

case 3:

for(i=0;i

{

if(strcmp(comparison[i],searchstr)==0)

return(true);

}

break;

case 4:

for(i=0;i

{

if(strcmp(interpunction[i],searchstr)==0)

return(true);

}

break;

case 5:

for(i=0;i

{

if(strcmp(biaoshifu[i],searchstr)==0)

return(true);

}

break;

case 6:

for(i=0;i

{

if(strcmp(zhushifu[i],searchstr)==0)

return(true);

}

break;

case 7:

for(i=0;i

{

if(strcmp(luoji[i],searchstr)==0)

return(true);

}

break;

}

return false;

}

char letterprocess (char ch)//字母处理函数

{

int i=-1;

char letter[20];

while (isalnum(ch)!=0)

{

letter[++i]=ch;

ch=fgetc(fp);

}

letter[i+1]='\0';

if (search(letter,1))

{

printf("\n",letter);

//strcat(letter,"\n");

//fputs('\n',outp);

}

else

{

printf("\n",letter);

//strcat(letter,"\n");

//fputs(letter,outp);

}

return(ch);

}

char numberprocess(char ch)//数字处理程序

{

int i=-1;

char num[20];

while (isdigit(ch)!=0)

{

num[++i]=ch;

ch=fgetc(fp);

}

if(isalpha(ch)!=0)//数字后面是字符

{

while(isspace(ch)==0)

{

num[++i]=ch;

ch=fgetc(fp);

}

num[i+1]='\0';

printf("错误!非法标识符:%s\n",num);

goto u;

}

num[i+1]='\0';

printf("\n",num);

u: return(ch);

}

char otherprocess(char ch)//其他处理程序

{

int i=-1;

char other[20];

if (isspace(ch)!=0)

{

ch=fgetc(fp);

goto u;

}

while ((isspace(ch)==0)&&(isalnum(ch)==0))

{

other[++i]=ch;

ch=fgetc(fp);

}

other[i+1]='\0';

if (search(other,2))

printf("\n",other);

else if (search(other,3))

printf("\n",other);

else if (search(other,4))

printf("\n",other);

else if (search(other,5))

printf("\n",other);

else if (search(other,6))

printf("\n",other);

else if (search(other,7))

printf("\n",other);

else

printf("错误!非法字符:%s\n",other);

u: return (ch);

}

int main ()

{

char str;

printf("**********************************词法分析器************************************\n");

if ((fp=fopen("源程序.txt","r"))==NULL)

printf("源程序无法打开!\n");

else

{

str =fgetc(fp);//从流中读取字符

while (str!=EOF)

{

if (isalpha(str)!=0)//如果是字符    isalpha包含在#include

str=letterprocess(str);

else

{

if (isdigit(str)!=0)

str=numberprocess(str);

else

str=otherprocess(str);

}

};

printf("词法分析结束,谢谢使用!\n");

//printf("点任意键退出!\n");

}

//c=getch();

return 0;

}

一,词法分析器

作用:读取源程序的输入字符、将他们组成词素,生成并输出一个词法单元序列

二,设计原理

1)C程序语言的符号分类:关键字、标识符、常数、运算符、界符

2)词法分析器的二元输出:

3)正规式和状态转换图

4)程序说明:

1>main 中打开源码文件,从第一个字符流读取

2>如果第一个是字符,则交给letterprocess(str); 处理

3>如果第一个是数字,则交给numberprocess(str); 处理

4>如果第一个是数字,则交给otherprocess(str); 处理

5>注意上述过程中,File *fp每读取一个词素,fp都会移动到下一个词素。对于空格的处理:isspace(ch)检查参数c是否为空格字符,也就是判断是否为空格('')、定位字符

('\t')、CR('\r')、换行('\n')、垂直定位字符('\v')或翻页('\f')的情况

这个程序输出结果情况汇总:关键字、算术运算符、关系运算符、分割符号、特殊符号、注释符号、逻辑运算符、非法符号

三,程序源码

[html] view plaincopy?

#include

#include

#include

#include

#include

#include

#define NULL 0

FILE *fp;

char ch;

char *keyword[34]={"auto","break","case","char","const","continue","default","do","double",

"else","enum","extern","float","for","goto","if","int","long","register",

"return","short","signed","sizeof","static","struct","switch","typedef", "printf",

"union","unsigned","void","volatile","while","main"};

char *operatornum[6]={"+","-","*","/","++","--"};

char *comparison[8]={"",">=","","==","!="};

char *interpunction[8]={",",";",":=",".","(",")","{","}"};

char *biaoshifu[6]={"%","$","^","&","_","#"};//特殊标识符

char *zhushifu[3]={"//","/*","*/"};//注释符

char *luoji[3]={"&&","||","!"};//逻辑运算符

bool search(char searchstr[],int wordtype)//符号匹配

{

int i;

switch (wordtype)

{

case 1:

for(i=0;i

{

if(strcmp(keyword[i],searchstr)==0)

return(true);

}

break;

case 2:

for(i=0;i

{

if(strcmp(operatornum[i],searchstr)==0)

return(true);

}

break;

case 3:

for(i=0;i

{

if(strcmp(comparison[i],searchstr)==0)

return(true);

}

break;

case 4:

for(i=0;i

{

if(strcmp(interpunction[i],searchstr)==0)

return(true);

}

break;

case 5:

for(i=0;i

{

if(strcmp(biaoshifu[i],searchstr)==0)

return(true);

}

break;

case 6:

for(i=0;i

{

if(strcmp(zhushifu[i],searchstr)==0)

return(true);

}

break;

case 7:

for(i=0;i

{

if(strcmp(luoji[i],searchstr)==0)

return(true);

}

break;

}

return false;

}

char letterprocess (char ch)//字母处理函数

{

int i=-1;

char letter[20];

while (isalnum(ch)!=0)

{

letter[++i]=ch;

ch=fgetc(fp);

}

letter[i+1]='\0';

if (search(letter,1))

{

printf("\n",letter);

//strcat(letter,"\n");

//fputs('\n',outp);

}

else

{

printf("\n",letter);

//strcat(letter,"\n");

//fputs(letter,outp);

}

return(ch);

}

char numberprocess(char ch)//数字处理程序

{

int i=-1;

char num[20];

while (isdigit(ch)!=0)

{

num[++i]=ch;

ch=fgetc(fp);

}

if(isalpha(ch)!=0)//数字后面是字符

{

while(isspace(ch)==0)

{

num[++i]=ch;

ch=fgetc(fp);

}

num[i+1]='\0';

printf("错误!非法标识符:%s\n",num);

goto u;

}

num[i+1]='\0';

printf("\n",num);

u: return(ch);

}

char otherprocess(char ch)//其他处理程序

{

int i=-1;

char other[20];

if (isspace(ch)!=0)

{

ch=fgetc(fp);

goto u;

}

while ((isspace(ch)==0)&&(isalnum(ch)==0))

{

other[++i]=ch;

ch=fgetc(fp);

}

other[i+1]='\0';

if (search(other,2))

printf("\n",other);

else if (search(other,3))

printf("\n",other);

else if (search(other,4))

printf("\n",other);

else if (search(other,5))

printf("\n",other);

else if (search(other,6))

printf("\n",other);

else if (search(other,7))

printf("\n",other);

else

printf("错误!非法字符:%s\n",other);

u: return (ch);

}

int main ()

{

char str;

printf("**********************************词法分析器************************************\n");

if ((fp=fopen("源程序.txt","r"))==NULL)

printf("源程序无法打开!\n");

else

{

str =fgetc(fp);//从流中读取字符

while (str!=EOF)

{

if (isalpha(str)!=0)//如果是字符    isalpha包含在#include

str=letterprocess(str);

else

{

if (isdigit(str)!=0)

str=numberprocess(str);

else

str=otherprocess(str);

}

};

printf("词法分析结束,谢谢使用!\n");

//printf("点任意键退出!\n");

}

//c=getch();

return 0;

}


相关内容

  • 编译原理论文
  • 编译原理心得体会 编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法,在计算机本科教学中占有十分重要的地位. 该课程理论性与实践性都很强,我们在学习 是普遍感到内容非常抽象,不易理解,内容多且繁琐,难以完整.全面地掌握编译原理的有关知识,更不用说灵活运用编译原理知识从事相 ...

  • 编译原理--教学大纲
  • <计算机编译原理>课程大纲 一.适用对象 本课程适用于计算机科学与技术以及相关专业的网络教育.成人教育学生. 二.课程性质 本课程是计算机科学与技术专业学生的专业基础课. 编译原理课程是计算机专业的一门主干课程.课程介绍程序设计语言编译程序构造的一般原理.基本设计方法.主要实现技术和一些 ...

  • 基于LLVM的编译原理简明教程 (1)
  • 基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了 字数2507 阅读192 评论0 喜欢3 收藏文章 分享 基于LLVM的编译原理简明教程 (1) - 写编译器越来越容易了 进入21世纪,新的编程语言如雨后春笋一样不停地冒出来.需求当然是重要的驱动力量,但是在其中起了重要作用的就是工 ...

  • 张瑞编译原理实验报告
  • 黑龙江大学 "编译原理课程设计"读书报告 学院 年级 专业 学号 姓名 报告日期 成绩 软件学院 2012级 软件工程 20122515 张瑞 2014年6月28日 黑龙江大学计算机科学技术学院 黑龙江大学软件学院 概述 "编译原理"课程是计算机专业中一门重要 ...

  • VSC#词法分析程序设计-编译原理课程设计说明书(含程序)
  • 课 程 设 计 说 明 书 设计题目: 词法分析程序设计 课 程 设 计 任 务 书 一.课程设计题目: 词法分析程序设计 二.课程设计主要参考资料 (1) 韩太鲁等,编译原理. 石油大学出版社.2007.9 (2) C#程序设计--Windows项目开发 清华大学出版社 三.课程设计应解决的主要问 ...

  • 词法分析程序的构造
  • 通达学院 题 专 学 班 指 指 日II 词法分析程序的构造 业 生 姓 名 级 学 号 导 教 师 导 单 位 计算机学院计算机科学与技术系 期 专业课程设计目: 词法分析程序的构造 一. 课题内容和要求 通过状态转换图构造C或者PASCAL语言子集的词法分析程序. 原理解析:选取语言,例如选取了 ...

  • 编译原理课程设计c版
  • 本文由leishensc贡献 doc文档可能在WAP端浏览体验不佳.建议您优先选择TXT,或下载源文件到本机查看. 2008-2009 学年第二学期 学年第二 <编译原理> 课程设计报告 学院(系) : 班 级: 计算机科学与技术学院 08 级 学生姓名: 学 号: 指导教师: 时间: ...

  • 编译原理_词法分析器_实验报告
  • 词法分析器实验报告 实验目的: 设计.编制.调试一个词法分析子程序-识别单词,加深对词法分析原理的理解. 功能描述: 该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字.标识符.常数.运算符.分隔符五大类.并依次输出各个单词的内部编码及单词符号自身值.(遇到 ...

  • 编译原理实验指导书(2015)
  • LIAOCHENG UNIVERSITY 编译原理 实验指导书 聊城大学计算机学院 2011年3月 目 录 <编译原理>课程实验教学大纲 ............................. 1 实验一 词法分析器的设计 .............................. ...