编译原理实验
                                             
                                         
实验一:词法分析程序
1、 实验目的
从左至右逐个字符的对源程序进行扫描,产生一个个单词符号,把字符串形式的源程序改造成单词符号形式的中间程序。
2、 实验内容
表 C语言子集的单词符号及内码值
switch case判断字符串
单词符号
种别编码
助记符
内码值
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小时内删除。