C语言词法分析器
C语言词法分析器
一,实验目的
1.加强对词法分析原理、方法和基本实现技术的理解;
2.灵活运用这学期所学的知识对词法分析,语法分析有进一步的理解; 3.强化对系统软件综合工程实现能力的训练;
二.实验内容
用C语言(或 C++ )作为宿主语言完成:
C语言(win-TC , ANSI C或turbo C 2.0)词法分析器的设计和实现。
三.实验要求
1. 编写C语言词法分析器的源程序并调试通过; 2. 通过测试程序的验收;
3. 提交简明扼要的书面实验报告,内容包括:属性字设计;源程序主要流程;主要数据结构设计,程序。
四,程序流程图
(1) main
(2)
判断并标志为 运算符或标点 符号 初始化数组,标志符
判断并标志是 否为关键字
判断并标志为 其它类型
Return 返回 sign 数值
五,原程序代码 #include<stdio.h> #include<string.h>
int i,j,k,sign,number,flag,run,sum,autuor;
/*flag which is use to judge the string is keywords or not!*/ char ch;
char words[10] = {" "}; char program[500];
int Scan(char program[]) { char * keywords[39] =
{ "auto","default","do", "extern","goto", "int","short","static","struct","switch", "typedef","void","break","case","char", "const","continue","double","else", "enum", "float","for","if","long", "register",
"return","signed","zhouhong","sizeof","union", "unsigned","volatile","while","main","printf", "scanf","include","define","string" };
number = 0; flag = 0; j = 0;
ch = program[i++];
/* To handle the lettle space ands tab*/
while ((ch == ' ') || (ch == '\t') || (ch == '\r')||(ch=='\n')) ch=program[i++]; /* 跳过不理睬 */
/*handle letters*/
if ((ch >= 'a') && (ch <= 'z' )) {
while ((ch >= 'a') && (ch <= 'z' )) {
words[j++]=ch; ch=program[i++]; } i--;
words[j++] = '\0'; for (k = 0; k < 39; k++)
if (strcmp (words,keywords[k]) == 0) {sign=k+1;flag=1; if(k==27) autuor=1; break; }
if (flag == 0)
{ sign = 100; /*为关键字*/ }
}/* if 是关键字*/ /*handle digits*/
else if ((ch >= '0') && (ch <= '9')) { number = 0;
while ((ch >= '0' ) && (ch <= '9' )) { number = number*10+(ch-'0'); ch = program[i++]; }
sign = 200; /*为数字*/ i--; }
/*opereation and edge handle*/ else switch (ch) {
case '=':{
if (ch == '=')
words[j++] = ch; words[j] = '\0';
ch = program[i++]; if (ch == '=')
{words[j++] = ch; words[j] = '\0';
sign= 401; /* = = */
} else
{ i--; /*退回一个字符*/
sign = 402; /* = */ } break; }
case'>':{ if (ch == '>')
words[j++] = ch; words[j] = '\0';
ch = program[i++]; if (ch == '=')
{words[j++] = ch; words[j] = '\0';
sign = 403; /* >= */
}
else if(ch=='>') { words[j++] =ch; words[j] ='\0';
sign =419; /* >> */
} else { i--;
sign = 404; /* >
*/
} break; }
case'<': {if (ch == '<')
words[j++] = ch;
words[j] = '\0'; ch = program[i++]; if (ch == '=')
{ words[j++] = ch; words[j] = '\0';
sign = 405; }
else if(ch=='<') { words[j++] = ch; words[j] = '\0';
sign = 420; } else { i--;
sign = 406; }break; } case'!':
{if (ch == '!')
words[j++] = ch; words[j] = '\0'; ch = program[i++]; if (ch == '=')
{words[j++] = ch; words[j] = '\0';
sign= 407; } else {i--;
sign= 408; } break; } case'+':{
if (ch == '+')
words[j++] = ch;
words[j] = '\0'; ch = program[i++]; if (ch == '=')
{ words[j++] = ch; words[j] = '\0';
sign= 409; }
else if (ch == '+') { words[j++] = ch; words[j] = '\0';
sign= 410; } else {i--;
sign = 411; }
break; }
case'-': {if (ch == '-')
words[j++] = ch; words[j] = '\0'; ch = program[i++];
if (ch == '=') { words[j++] = ch; words[j] = '\0';
sign= 412; }
else if( ch == '-') { words[j++] = ch; words[j] = '\0';
sign= 413; }
/* 负数的情况 */
else if((ch >= '0') && (ch <= '9')) {while( (ch >= '0') && (ch <= '9') ) {words[j++] = ch; ch = program[i++]; }
words[j] = '\0';
sign = 1000; /* 标志为1000 */ /* 负数 */ i--; break; } else { i--; …… 此处隐藏:4141字,全部文档内容请下载后查看。喜欢就下载吧 ……
- 基于PLC控制的航空电镀生产线自动输送
- 中考预测课内外文言文对比阅读2
- 2018-2023年中国商业智能(BI)产业市场
- 中国金融体制改革研究2011new
- 外窗淋水试验方案
- 精益生产(Lean Production)
- 学校安全事故处置和信息报送制度
- Chapter 5 Human Resources Management
- 【小学数学】人教版小学六年级上册数学
- 初中数学解题方法与技巧
- 山东省创伤中心建设与管理指导原则(试
- 函数与数列的极限的强化练习题答案
- 10分钟淋巴按摩消脂
- 网络应急演练预案
- 服装设计入门基础知识
- 初二数学分式计算题练习
- (人教新课标)高二数学必修5第二章 数列
- 最新自主创业项目
- 北京大学 无机化学课件 4第4章 配合物
- 贸易公司业务管理制度




