### 汇编语言中的词法分析程序设计与实现 #### 一、引言 词法分析是编译原理中的一个重要环节,它负责将源代码分解成一系列的符号(token),为后续的语法分析和语义分析提供基础。本文通过一个具体的词法分析程序实例,帮助读者理解词法分析的基本原理,并掌握如何设计与实现一个简单的词法分析器。 #### 二、词法分析器的设计目标与功能 本词法分析器的目标是识别出汇编语言源代码中的各种词汇单位,如关键字、标识符、数字等,并将其转换为相应的符号类型。具体而言,该词法分析器具有以下功能: 1. **关键字识别**:能够识别出汇编语言中的关键字,如`PROGRAM`、`VAR`、`PROCEDURE`等。 2. **标识符识别**:能够识别出用户自定义的标识符。 3. **常量识别**:能够识别出数字常量。 4. **操作符识别**:能够识别出基本的操作符,如赋值(`=`)、加号(`+`)等。 5. **分隔符识别**:能够识别出分隔符,如逗号(`,`)、分号(`;`)等。 #### 三、实现细节 ##### 1. 关键字表 程序中定义了一个字符串数组`table`用于存储汇编语言的关键字列表。每个关键字与其对应的整型数值关联起来,便于后续的处理。 ```c char*table[16]={"","PROGRAM","VAR","PROCEDURE","BEGIN","END","IF","THEN","ELSE","REPEAT","UNTIL","READ","WRITE","WRITELN","FOR","DO"}; ``` ##### 2. 关键字查找函数 `lookup`函数用于在`table`数组中查找传入的字符串是否为关键字。如果找到匹配,则返回关键字在数组中的索引位置;否则返回0表示不是关键字。 ```c int lookup(char*TOKEN){ int m, i; for (i = 1; i < 16; i++) { if ((m = strcmp(TOKEN, table[i])) == 0) return(i); } return(0); } ``` ##### 3. 输出函数 `out`函数用于输出识别到的词汇单位及其对应的类型。 ```c void out(int c, char* TOKEN){ count++; if (count % 4 == 0) printf("(%d,%s)\n", c, TOKEN); else printf("(%d,%s)\t", c, TOKEN); } ``` ##### 4. 字符识别函数 - `zimu`函数用于判断字符是否为字母。 - `shuzi`函数用于判断字符是否为数字。 ```c int zimu(char ch){ if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') return 1; else return 0; } int shuzi(char ch){ if (ch >= '0' && ch <= '9') return 1; else return 0; } ``` ##### 5. 词法分析器主函数 `scanner`函数实现了词法分析的核心逻辑,逐个读取输入文件中的字符,并根据不同的规则识别词汇单位。 ```c void scanner(FILE* fp){ char TOKEN[20] = {'\0'}; char ch; //... } ``` 在此基础上,程序通过一系列条件分支结构来识别不同的词汇单位,包括标识符、关键字、数字以及操作符等,并调用`out`函数输出结果。 #### 四、总结 通过本词法分析器的设计与实现,我们不仅加深了对词法分析原理的理解,还掌握了如何在实际编程中应用这些理论知识。对于初学者来说,这是一个很好的学习案例,有助于更好地理解编译原理的基础概念和技术实现。此外,这个例子也展示了如何利用C语言的基础语法和标准库函数来完成一个实用的程序开发任务。
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int count=0;
char *table[16]={" ","PROGRAM","VAR","PROCEDURE","BEGIN","END","IF","THEN","ELSE","REPEAT","UNTIL","READ","WRITE","WRITELN","FOR","DO"},TOKEN[20],ch; //定义关键字
int lookup(char *TOKEN){ //关键字匹配函数
int m,i;
for(i=1;i<16;i++){
if((m=strcmp(TOKEN,table[i]))==0)
return(i);
}
return(0);
}
void out(int c,char *TOKEN){ //输出函数
count++;
if(count%4==0)
{
printf("(%d,%s)\n",c,TOKEN); //c指的是编号,TOKEN指的是存放构成单词符号的字符串。
}
else
printf("(%d,%s)\t",c,TOKEN);
}
int zimu(char ch){
if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
return 1;
else
return 0;
}
int shuzi(char ch){
if(ch>='0'&&ch<='9')
return 1;
else
return 0;
}
void scanner(FILE *fp){ //扫描函数
char TOKEN[20]={'\0'};
char ch;
int i,c;
int $ID=2;
int $INT=3;
int $ASSIGN=4,$PLUS=4,$POWER=4,$STAR=4;
int $POINT=5,$SEMICOLON=5,$LPAE=5,$RPAR=5,$LBRACE=5,$RBRACE=5;
ch=fgetc(fp); //获取字符,指针fp并自动指向下一个字符
if(zimu(ch)){ //判断该字符是否是字母
TOKEN[0]=ch;
ch=fgetc(fp);//从数据流中读下一个字符
i=1;
while(shuzi(ch)|| zimu(ch)){ //判断该字符是否是字母或数字
//strcat(TOKEN[i],ch);
TOKEN[i]=ch;//拼接 Concat(),不断将ch所指的值添加到TOKEN中;
//getchar();
ch=fgetc(fp);
i++;
}
剩余5页未读,继续阅读
- 粉丝: 34
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Redis 的 Redis Kafka 连接器(源和接收器).zip
- Flowfield Canvas.zip
- SAP Getway and OData 电子书
- Redis 的 node.js 连接管理器.zip
- 基于Python实现的决策树源代码+使用说明
- Redis 的 JDBC 驱动程序.zip
- 2001-2022年各省农作物总播种面积、粮食作物播种面积数据
- 竹竿检测7-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar
- 非常好的电源开关设计秘笈30例100%好用.zip
- Redis 模块的 Java 客户端.zip