编译原理上机实验 1

华中科技大学文华学院

编译原理上机实验报告

专 业:软件工程 姓 学 号: 班 级: 学 时 间:

1.实验目的

设计,编制并调试一个词法分析程序,加深对词法分析原理的理解。

2.实验要求

3.程序结构

程序用C 语言编写,编译环境是win-tc 。 Syn,整形,记录单词符号的种别编码。

tmp ,字符数组,长度为256,可以缓存用户输入的字符串。

token ,字符数组,长度为32,存放识别出来的单词符号。 ch ,字符型,存放当前所取的字符。

4.程序源代码

#include

#include #include #include

#define LEN sizeof(struct Node) struct Node { };

char data; struct Node *next;

struct Node *head,*p; char ch;

char *key[9]={"main","int","char","if","else","for","while","float","void"}; char token[20];

void getch() //读字符函数,从输入缓冲区读入下一个字符放在ch 中,并指向下一个字符。 { ch=p->data; p=p->next; }

void output(struct Node *head) //打印指针所指向的字符串 { if(!head)

{ }

printf("Something wrong with head node!"); exit(1);

p=head->next;

while(p->next!=NULL) {

printf("%c",p->data); p=p->next;

}

printf("\n");

}

void getbc() //检查ch 中的字符是否为空白字符,如果是则调用getch (),直到ch 中读入

{ 一个非空白字符为止。 }

while(ch==' ') getch();

void concat() //把当前ch 中的字符与token 中的字符串连接 { }

int letter(char ch) //判定ch 中的字符是否为字母 { }

return isalpha((int)ch); unsigned int i; i=strlen(token); token[i]=ch; token[i+1]='\0';

int digit(char ch) //判定ch 中的字符是否为数字 { return isdigit((int)ch);

}

int reserve() //对token 中的字符串查关键字表,若是则返回关键字,否则返回10 {

int k;

for(k=0;k

if(strcmp(key[k],token)==0) return(k+1);

}

return 10; }

void retract() {

struct Node *Q; Q=head->next; while(Q->next!=p) Q=Q->next; p=Q;

}

void back(int a,char *b) {

printf("(%d,%s)\n",a,b);

}

void scaner() {

token[0]=NULL; getch(); getbc(); if(letter(ch)) {

while(letter(ch)||digit(ch)) { } retract(); c=reserve(); if(c!=10)

back(c,token); else

concat(); getch();

back(10,token); }

else if(digit(ch)) {

while(digit(ch)) { }

concat(); getch();

retract();

printf("(20,%d)\n",atoi(token));

} else switch(ch)

{

case'&':

back(18,"&"); break;

case'?': back(19,"?");

break; case'+': back(22,"+"); break; case'-':

back(23,"-"); break; case'*':

break; case'/': back(25,"/"); break; case'(': back(26,"("); break; case')':

break;

back(27,")"); case'{':

back(28,"{"); break; case'}':

back(29,"}"); break; case',':

back(30,","); break; case';':

back(31,";"); break; case':':

back(32,":"); break; case'=':

getch(); if(ch=='=') back(37,"=="); else {

retract(); back(21,"=");

}

break; getch(); if(ch=='=') back(35,">="); else {

retract(); back(33,">");

case'>':

}

break; case'

if(ch=='=') back(36,"

retract(); back(34,"

break; case'!':

getch(); if(ch=='=') back(38,"!="); else back(17,"!"); break;

case'`': getch(); if(ch=='`') back(39,"``"); }

int main(void) {

head=(struct Node *)malloc(LEN); if(!head) {

printf("Failed to create the head node!"); exit(1);

else { }

if(ch==' '); back(100,"`");

break; case'#':break; default: }

break;

}

}

head->next=NULL; head->data=' '; p=head;

printf("Please input your code:\n"); while(1) { }

int i=0;

char tmp[256]; gets(tmp); if(tmp[0]=='#')

break;

p->next=(struct Node *)malloc(LEN); if(!(head->next)) {

printf("Failed to create a new node!");

exit(1); }

p=p->next;

while((tmp[i]!='\0')&&(i

p->data=tmp[i];

p->next=(struct Node*)malloc(LEN); if(!(p->next)) {

printf("Failed to create a new node!"); exit(1);

}

p=p->next; i++;

}

p->data='\n'; p->next=NULL;

printf("\nThe code you input is:\n"); output(head);

printf("\nAfter compiling,the result is:\n"); p=head->next;

while(p->next!=NULL) scaner(); system("Pause"); return 0;

5. 程序截图

6. 心得体会

这次实验,我先是把老师给的程序完整的敲了一遍,并且运行的时候没有错误。在此基础之上,我分别添加了float ,void ,!,&,?这几个单词符号,测试结果如上面的截图,运行结果也比较成功。这次实验使我对词法分析的更进一步认识提供了很大帮助。

华中科技大学文华学院

编译原理上机实验报告

专 业:软件工程 姓 学 号: 班 级: 学 时 间:

1.实验目的

设计,编制并调试一个词法分析程序,加深对词法分析原理的理解。

2.实验要求

3.程序结构

程序用C 语言编写,编译环境是win-tc 。 Syn,整形,记录单词符号的种别编码。

tmp ,字符数组,长度为256,可以缓存用户输入的字符串。

token ,字符数组,长度为32,存放识别出来的单词符号。 ch ,字符型,存放当前所取的字符。

4.程序源代码

#include

#include #include #include

#define LEN sizeof(struct Node) struct Node { };

char data; struct Node *next;

struct Node *head,*p; char ch;

char *key[9]={"main","int","char","if","else","for","while","float","void"}; char token[20];

void getch() //读字符函数,从输入缓冲区读入下一个字符放在ch 中,并指向下一个字符。 { ch=p->data; p=p->next; }

void output(struct Node *head) //打印指针所指向的字符串 { if(!head)

{ }

printf("Something wrong with head node!"); exit(1);

p=head->next;

while(p->next!=NULL) {

printf("%c",p->data); p=p->next;

}

printf("\n");

}

void getbc() //检查ch 中的字符是否为空白字符,如果是则调用getch (),直到ch 中读入

{ 一个非空白字符为止。 }

while(ch==' ') getch();

void concat() //把当前ch 中的字符与token 中的字符串连接 { }

int letter(char ch) //判定ch 中的字符是否为字母 { }

return isalpha((int)ch); unsigned int i; i=strlen(token); token[i]=ch; token[i+1]='\0';

int digit(char ch) //判定ch 中的字符是否为数字 { return isdigit((int)ch);

}

int reserve() //对token 中的字符串查关键字表,若是则返回关键字,否则返回10 {

int k;

for(k=0;k

if(strcmp(key[k],token)==0) return(k+1);

}

return 10; }

void retract() {

struct Node *Q; Q=head->next; while(Q->next!=p) Q=Q->next; p=Q;

}

void back(int a,char *b) {

printf("(%d,%s)\n",a,b);

}

void scaner() {

token[0]=NULL; getch(); getbc(); if(letter(ch)) {

while(letter(ch)||digit(ch)) { } retract(); c=reserve(); if(c!=10)

back(c,token); else

concat(); getch();

back(10,token); }

else if(digit(ch)) {

while(digit(ch)) { }

concat(); getch();

retract();

printf("(20,%d)\n",atoi(token));

} else switch(ch)

{

case'&':

back(18,"&"); break;

case'?': back(19,"?");

break; case'+': back(22,"+"); break; case'-':

back(23,"-"); break; case'*':

break; case'/': back(25,"/"); break; case'(': back(26,"("); break; case')':

break;

back(27,")"); case'{':

back(28,"{"); break; case'}':

back(29,"}"); break; case',':

back(30,","); break; case';':

back(31,";"); break; case':':

back(32,":"); break; case'=':

getch(); if(ch=='=') back(37,"=="); else {

retract(); back(21,"=");

}

break; getch(); if(ch=='=') back(35,">="); else {

retract(); back(33,">");

case'>':

}

break; case'

if(ch=='=') back(36,"

retract(); back(34,"

break; case'!':

getch(); if(ch=='=') back(38,"!="); else back(17,"!"); break;

case'`': getch(); if(ch=='`') back(39,"``"); }

int main(void) {

head=(struct Node *)malloc(LEN); if(!head) {

printf("Failed to create the head node!"); exit(1);

else { }

if(ch==' '); back(100,"`");

break; case'#':break; default: }

break;

}

}

head->next=NULL; head->data=' '; p=head;

printf("Please input your code:\n"); while(1) { }

int i=0;

char tmp[256]; gets(tmp); if(tmp[0]=='#')

break;

p->next=(struct Node *)malloc(LEN); if(!(head->next)) {

printf("Failed to create a new node!");

exit(1); }

p=p->next;

while((tmp[i]!='\0')&&(i

p->data=tmp[i];

p->next=(struct Node*)malloc(LEN); if(!(p->next)) {

printf("Failed to create a new node!"); exit(1);

}

p=p->next; i++;

}

p->data='\n'; p->next=NULL;

printf("\nThe code you input is:\n"); output(head);

printf("\nAfter compiling,the result is:\n"); p=head->next;

while(p->next!=NULL) scaner(); system("Pause"); return 0;

5. 程序截图

6. 心得体会

这次实验,我先是把老师给的程序完整的敲了一遍,并且运行的时候没有错误。在此基础之上,我分别添加了float ,void ,!,&,?这几个单词符号,测试结果如上面的截图,运行结果也比较成功。这次实验使我对词法分析的更进一步认识提供了很大帮助。


相关文章

  • 编译原理上机实验
  • 实验1简单的词法分析子程序 [实验目的] ● 理解词法分析在编译程序中的作用 ● 初步了解和掌握词法分析程序的实现方法和技术 [实验内容] 1. 编写程序,输入一串字符,判断该字符串是否为合法标识符或合法整型常量. 2. 无符号数的算术四则 ...查看


  • 编译原理上机安排及报告说明
  • 一.上机说明 1.上机共12小时,分为3次,每次4小时.其中第1次完成词法分析,第2.3次完成语法分析. 2.上机时间: 1班:11.25下午.12.23下午.12.24晚上 2班:12.2下午.12.23晚上.12.25上午 3班:11. ...查看


  • 32位微机原理上机实验报告:显示程序实验
  • 西北工业大学明德学院 实验报告 实验项目 微机原理及应用 班 级 121204 姓 名 田家豪 王辰硕 学 号 121566 121567 指导老师 伍明高 时 间 2015-3-17 实验题目 显示程序实验 实验目的 (1) 掌握在PC机 ...查看


  • 编译原理上机报告
  • 编译原理上机报告 组员: 班级: 一.上机题目: 实现一个简单的语言(Core Programming Language,CPL )的编译器(解释器) (或者其他自己想完成的编译器) 二.上机目的 加深编译原理基础知识的理解:词法分析.语法 ...查看


  • 编译原理-编写递归下降语法分析器
  • 编译原理上机报告 名 称: 编写递归下降语法分析器 学 院: 信息与控制工程学院 专 业: 计算机科学与技术 班 级: 计算机1401班 姓 名: 叶达成 年 月 一.上机目的 通过设计.编制.调试一个递归下降语法分析程序,实现对词法分析程 ...查看


  • 计算机专业课程表
  • 2007计算机科学与技术专业教学计划 一.培养目标 本专业培养适应海峡西岸经济区,尤其是厦门市经济建设与社会发展需要,具有良好的科学素养,系统扎实地掌握计算机科学与技术基本理论.基本知识和基本技能与方法,符合计算机发展规律要求,能综合运用知 ...查看


  • 编译原理实验指导书---2014年修订版
  • 编译原理实验指导 石家庄经济学院信息工程学院 2014-01-25 "编译原理"是计算机类专业一门理论性和实践性强的专业课程,在本专业的课程体系中处于十分重要的地位,属于必修课.本课程的内容主要介绍高级程序设计语言实现的 ...查看


  • 微机原理实验报告三 七段数码显示
  • 七段数码显示 一, 实验目的: 掌握接口芯片的编址方法,掌握8255的初始化设置,及数码管显示原理,掌握段控及位控的概念. 二, 实验内容: 1, 2, 3, 连接地址译码器与8255的接线及8255与数码管的连线. 在数据段中存放0到9的 ...查看


  • 交通管理系统
  • 摘要 此次课程设计主要是设计一个交通灯管理系统,此系统主要由分频电路,n 进制计数控制器,05秒译码电路,00译码电路,4-7段译码电路,动态扫描控制,黄灯闪烁控制,红绿灯交替控制,手动/自动模式选择,手动切换控制红绿灯等部分组成.其中各部 ...查看


热门内容