编译原理实验
词
法
分
析
程
序
实验一:词法分析程序
1、 实验目的
从左至右逐个字符的对源程序进行扫描,产生一个个单词符号,把字符串形式的源程序改造成单词符号形式的中间程序。
2、 实验内容
表 C语言子集的单词符号及内码值
单词符号 | 种别编码 | 助记符 | 内码值 |
while | 1 | while | -- |
if | 2 | if | -- |
else | 3 | else | -- |
switch | 4 | switch | -- |
case | 5 | case | -- |
标识符 | 6 | id | id在符号表中的位置 |
常数 | 7 | num | num在常数表中的位置 |
+ | 8 | + | -- |
- | 9 | - | -- |
* | 10 | * | -- |
<= | 11 | relop | LE |
< | 11 | relop | LT |
== | 11 | relop | LQ |
= | 12 | = | -- |
; | 13 | ; | -- |
输入源程序如下
if a==1 a=a+1;
else a=a+2;
输出对应的单词符号形式的中间程序
3、 实验过程
实验上机程序如下:
#include "stdio.h"
#include "string.h"
int i,j,k;
char s ,a[20],token[20];
int letter()
{
if((s>=97)&&(s<=122))return 1;
else return 0;
}
int Digit()
{if((s>=48)&&(s<=57))return 1;
else return 0;
}
void get()
{
s=a[i];
i=i+1;
}
void retract()
{i=i-1;}
int lookup()
{
if(strcmp(token, "while")==0)
return 1;
else if(strcmp(token, "if")==0)
return 2;
else if(strcmp(token,"else")==0)
return 3;
else if(strcmp(token,"switch")==0)
return 4;
else if(strcmp(token,"case")==0)
return 5;
else return 0;
}
void main()
{
printf("please input you source program,end('#'):\n");
i=0;
do
{
i=i+1;
scanf("%c",&a[i]);
}while(a[i]!='#');
i=1;
memset(token,0,sizeof(char)*10);
j=0;
get();
while(s!='#')
{
if(s==' '||s==10||s==13)
get();
else
{
switch(s)
{
case'a':
case'b':
case'c':
case'd':
case'e':
case'f':
case'g':
case'h':
case'i':
case'j':
case'k':
case'l':
case'm':
case'n':
case'o':
case'p':
case'q':
case'r':
case's':
case't':
case'u':
case'v':
case'w':
case'x':
case'y':
case'z':
while(Digit()||letter())
{
token[j]=s;
j=j+1;
get();
}
retract();
k=lookup();
if(k==0)
printf("(6,%s)\n",token);
else
printf("(%d,null)\n",k);
break;
case'0':
case'1':
case'2':
case'3':
case'4':
case'5':
case'6':
case'7':
case'8':
case'9':
while(Digit())
{
token[j]=s;
j=j+1;
get();
}
retract();
printf("(%d,%s)\n",7,token);
break;
case'+':printf("(+,null)\n");
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论