华中科技大学文华学院
编译原理上机实验报告
专 业:软件工程 姓 学 号: 班 级: 学 时 间:
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 ,!,&,?这几个单词符号,测试结果如上面的截图,运行结果也比较成功。这次实验使我对词法分析的更进一步认识提供了很大帮助。