云文档网 - 专业文章范例文档资料分享平台

编译原理 设计c语言的词法分析器

来源:网络收集 时间:2024-05-02 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xuecool-com或QQ:370150219 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

编译原理课程设计报告

题目: 学院: 教师: 姓名: 学号: 班级:

评分: 签字:

编译原理课程设计一:设计c语言的词法分析器

一、实验目的

了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程,加深对词法原理的理解。

二、实验要求

了解高级语言单词的分类,了解状态图以及如何表示并识别单词规则,掌握状态图到识别程序的编程。

三、实验设计 3.1.单词分类及表示

3.1.1 C语言的子集分类

(1)标识符:以字母开头的字母数字串 (2)整数或浮点型。

(3)保留字:for,while,do,else,if,static,int,sizeof,break,continue (4)运算符:+,-,*,/,%,>,<,=,!=,==,<=,>=,!,&,&&,||; (5)界符:\

3.1.2单词二元组(单词分类号、单词自身值)

单词 标识符 整数或浮点型 保留字 运算符 界符 分类号 1 2 3 4 5 3.2 词法分析器的设计

3.2.1算法设计

3.2.1.1概要设计

从文件中逐个读取字符,只要这五大类的状态序列则继续读取,否则回退字符,在对应

类别进行查找,输出单元二次组至另一文件夹。

开始打开txt文件读取c语言代码扫描Y是否读取到相应字符YY常数?标识符保留字运算符界符?记录标号结束

3.2.1.2状态图设计

3.2.2输入输出设计

输入:通过文件指针从文件中一个一个读取字符 输出:输出单词二元组至文件。格式为(种别码,值)

3.2.3主要函数

void Getchar(FILE *fp ) //读入一个字符 void GetBC(FILE *fp)//读入一个非空字符 void contacat()//连接字符 int letter()//判断是否为字母 int digit()//判断是否为字母 void retract(FILE *fp,char *c)//回退 int reserve (char **k)//处理保留字

int sysmbol(identifier *id)//处理标识符,查找符号表并存放位置若没有则添加 int constant(constnumber *con)//存入常数表,并返回它在常数表中的位置 void Tofile(int num, int val, identifier *id, constnumber *con, FILE *fw)//写到文件

void WordAnalyze(char **k,char *c, char **CODE, identifier *id, constnumber *con, FILE *fp, FILE *fw)//词法分析函数

四、结果测试

文件输入 int main() {

int a=1,b=3; if(a>1) b=b-2; }

输出结果:

结论:程序输出结果与期望输出结果相符。

四、收获与感想

通过我本次课程设计掌握了词法分析器设计的基本方法与相关知识。词法分析的关键是明确各类字符的状态转换过程。同时辅助标识符、常量结构体与保留字表用于查找返回值。 同时我也对分析问题解决问题有了更深入全面的认识与理解。面对一个大的问题,需要理清解决的步骤再将其分解成小的模块逐个解决最后再串联在一起,问题就会变得更容易,思路也会更加清晰。

五、实验代码

#include using namespace std; #define LENGTH 10 char ch; char

*CODE[]

=

{

\

*/,\

char *k[] = { \保留字 char token[16];//存放处理后的字符串

//标识符结构体 typedef struct {

typedef struct

char *I[256]; int len;

}identifier;

{

int cont[300]; int len;

}constnumber; //读入一个字符 void Getchar(FILE *fp ) { }

//读入一个非空字符 void GetBC(FILE *fp) { }

//连接字符 void contacat() { }

//判断是否为字母 int letter() { } int digit() { } //回退

void retract(FILE *fp,char *c) { }

//处理保留字 int reserve (char **k)

int a=ftell(fp); fseek(fp,0,SEEK_SET); fprintf_s(fp, \ch = ' ';

fseek(fp, a, SEEK_SET); return isdigit(ch); return

isalpha(ch);

char * cht = &(ch); strcat_s(token, cht);

while (ch == ' ' || ch == '\\n' || ch == 9)

Getchar(fp);

if ((ch = getc(fp)) == EOF)

exit(1);

{ }

//处理标识符,查找符号表并存放位置若没有则添加 int sysmbol(identifier *id) { }

//数字字符串转化为整数 int str_to_num() { }

//存入常数表,并返回它在常数表中的位置 int constant(constnumber *con) { }

//写到文件

void Tofile(int num, int val, identifier *id, constnumber *con, FILE *fw)

con->cont[con->len] = str_to_num(); con->len++;return con->len; int i=0;

int k = token[i]-'0';

for (i = 1;token[i] != '\\0';i++) { } return k;

k = k * 10 + token[i] - '0'; int i;

for (i = 0;i < id->len;i++) { }

id->I[id->len] = token; id->len++; return id->len;

cout << \

if (strcmp(token, id->I[i]) == 0) return i + 1; int i;

for (i = 0;i < LENGTH;i++) { } return 0;

if (strcmp(token, k[i]) == 0)

return (i + 1);

if (id->len > 256)

{ }

void error(FILE *fw) { }

//词法分析函数

void WordAnalyze(char **k,char *c, char **CODE, identifier *id, constnumber *con, FILE *fp, FILE *fw) {

int num, val;

strcpy_s(token, \初始化为空字符串 Getchar(fp); GetBC(fp);

if ((ch >= 'A'&&ch <= 'Z') || (ch >= 'a'&&ch <= 'z')) //分析标识符和保留字 {

//若字符为A~Z或0~9,则继续读取 while (letter() || digit()) { }

retract(fp, c); num = reserve(k); if (num != 0) else {

val = sysmbol(id); Tofile(3, num, id, con,fw); contacat(); Getchar(fp);

cout << \fprintf_s(fw, \int num_ = num; fprintf_s(fw, \if (num >= 4) { }

fprintf_s(fw, \

switch (num) {

case 1:fprintf_s(fw, \case 2:fprintf_s(fw, \case 3:fprintf_s(fw, \}

fprintf_s(fw,\if (num < 4)

}

}

Tofile(1, val, id, con,fw);

else if (digit())//处理常数 { }

else //分析符号 {

switch (ch) { case'<':

Getchar(fp); if (ch == '=') else { } break; Getchar(fp); if (ch == '=') else { } break; Getchar(fp); if (ch == '=') else {

Tofile(13, 0, id, con,fw); retract(fp,c);

Tofile(10, 0, id, con,fw); Tofile(11, 0, id, con,fw); retract(fp,c);

Tofile(8, 0, id, con,fw); Tofile(9, 0, id, con,fw);

while (digit()) { }

retract(fp,c); val = constant(con); Tofile(2, val, id, con,fw);

contacat(); Getchar(fp);

case'>':

case'=':

}

retract(fp,c);

Tofile(14, 0, id, con,fw);

break; Getchar(fp); if (ch == '=') else

error(fw); break;

Tofile(4, 0, id, con,fw); break;

Tofile(5, 0, id, con,fw); break;

Tofile(6, 0, id, con,fw); break;

Tofile(7, 0, id, con, fw); break;

Tofile(15, 0, id, con, fw); break;

Tofile(16, 0, id, con, fw); break;

Tofile(17, 0, id, con, fw); break;

Tofile(18, 0, id, con, fw); break;

Tofile(19, 0, id, con, fw); break;

Tofile(20, 0, id, con, fw); break;

Tofile(21, 0, id, con, fw); break;

Tofile(12, 0, id, con,fw);

case'!':

case'+':

case'-':

case'*':

case'/':

case'(':

case')':

case',':

case':':

case';':

case'{':

case'}':

}

}

default: }

error(fw);

int main() { }

char c[100] = \FILE *fp,*fw; errno_t err;

err = fopen_s(&fp, c, \if (err != 0) { }

errno_t err1;

err1 = fopen_s(&fw, \if (err1 != 0) { }

identifier *id=(identifier *)malloc(sizeof(identifier));id->len = 0;

constnumber *con=(constnumber *)malloc(sizeof(constnumber));con->len = 0; WordAnalyze(k, c, CODE, id, con, fp, fw); while (1) { } fclose(fw); fclose(fp); return 0;

WordAnalyze(k, c, CODE, id, con, fp, fw); if (feof(fp))break;

printf(\exit(0);

printf(\exit(0);

}

}

default: }

error(fw);

int main() { }

char c[100] = \FILE *fp,*fw; errno_t err;

err = fopen_s(&fp, c, \if (err != 0) { }

errno_t err1;

err1 = fopen_s(&fw, \if (err1 != 0) { }

identifier *id=(identifier *)malloc(sizeof(identifier));id->len = 0;

constnumber *con=(constnumber *)malloc(sizeof(constnumber));con->len = 0; WordAnalyze(k, c, CODE, id, con, fp, fw); while (1) { } fclose(fw); fclose(fp); return 0;

WordAnalyze(k, c, CODE, id, con, fp, fw); if (feof(fp))break;

printf(\exit(0);

printf(\exit(0);

百度搜索“yundocx”或“云文档网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,云文档网,提供经典综合文库编译原理 设计c语言的词法分析器在线全文阅读。

编译原理 设计c语言的词法分析器.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.yundocx.com/wenku/205095.html(转载请注明文章来源)
Copyright © 2018-2022 云文档网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:370150219 邮箱:370150219@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:7 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:xuecool-com QQ:370150219