词法分析实验报告 108

一、        实验目的

 

     编制一个词法分析程序。

二、        实验内容和要求

 输入:源程序字符串

输出:二元组(种别,单词本身)

待分析语言的词法规则。

            

三、        实验方法、步骤及结果测试

 

  1. 1.      源程序名:123.c

可执行程序名:123.exe

  1. 2.      原理分析及流程图

我将需要进行翻译的对应的种别码分成了若干个数组,输入需要翻译的东西作为字符串存储在A[]的数组中,用字符ch来存储一个个的字符在进行识别类型,进行不同的函数进行识别种别码,最后输出不同的数字,然后通过选择语句得到结果。

  1. 3.      主要程序段及其解释:
#include<stdio.h>
#include<string.h>
#include<stdlib.h> 
char TOken[10];//分开进行比较 
char ch;

char r1[]={"begin"};
char r2[]={"if"};
char r3[]={"then"};
char r4[]={"while"};
char r5[]={"do"};
char r6[]={"end"};


char A[10000];//输入的所有值 
int syn,row;
int n,m,p,sum,j;
static int i = 0;
void scaner();

main()
{ 
    row = 0 ;
    p = 0 ;
    printf("请输入字符串:(#为结束)\n");
    do
    {
        scanf("%c",&ch);
        A[p]=ch;
        p++;
    }//输入值到数组A【】中,以#结束 
    while(ch!='#');
    do
    {
        scaner();//进入函数进行判定 
        switch(syn)
        {
        case 11: printf("(%d,%d)\n",syn,sum); break;//如果是11,那么就是数字 
        case 0: printf("(%d,%c)\n",syn,TOken[0]);break;//如果是0,那么是# 结束 
        case -2: row=row++;break;
        case -1:break;
        default: printf("(%d,%s)\n",syn,TOken);break;//否则,就是变量名、关键词 
        }
    }
    while (syn!=0);
}


void scaner()
{
    for(n=0;n<7;n++) 
        TOken[n]=0;//每次循环完就清零 
    ch=A[i];
    while(ch==' '||ch=='\n')//如果字符是空格或者回车,跳过 
    {
        i++;
        ch=A[i];
    }
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')) //可能是标示符或者变量名 
    {
        m=0;
        while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//找到一个变量名或者关键字,直到遇到空格为止 
        {
            TOken[m]=ch;m++;
            i++;ch=A[i];
        }
        TOken[m]='\0';//将识别出来的字符和已定义的标示符作比较, //因为定义的begin为1,if为2...... 
        if(strcmp(TOken,r1)==0){syn=1;}
        else if(strcmp(TOken,r2)==0){syn=2;}
        else if(strcmp(TOken,r3)==0){syn=3;} 
        else if(strcmp(TOken,r4)==0){syn=4;}
        else if(strcmp(TOken,r5)==0){syn=5;}
        else if(strcmp(TOken,r6)==0){syn=6;}
        else{syn=10;}    //变量名 
    }
    else if((ch>='0'&&ch<='9')) //数字 
    {
        sum=0;
        while((ch>='0'&&ch<='9'))
        {
            sum=sum*10+ch-'0';//显示其数字sum 
            i++;
            ch=A[i];
        }
        syn=11;
    }
    else switch(ch) //其他字符 
    {
case'<':
    m=0;
    TOken[m]=ch;
    m++;
    i++;
    ch=A[i];
    if(ch=='=')
    {
        syn=21;
        TOken[m]=ch;
        m++;
        i++;
    }
    else if(ch=='>') 
    {
        syn=22;
        TOken[m]=ch;
        m++;
        i++;
    }
    else
    {
        syn=20;
    }break;
case'>':
    m=0;
    TOken[m]=ch;
    m++;
    i++;
    ch=A[i];
    if(ch=='=')
    {
        syn=24;
        TOken[m]=ch;
        m++;
        i++;
    }
    else
    {
        syn=23;
    }break;
case':':
    m=0;
    TOken[m]=ch;
    m++;
    i++;
    ch=A[i];
    if(ch=='=')
    {
        syn=18;
        TOken[m]=ch;
        m++;
        i++;
    }
    else
    {
        syn=17;
    }break; 
case'+':syn=13;TOken[0]=ch;i++;break; 
case'-':syn=14;TOken[0]=ch;i++;break;
case'*':syn=15;TOken[0]=ch;i++;break;
case'/':syn=16;TOken[0]=ch;i++;break; 
case'=':syn=25;TOken[0]=ch;i++;break;
case';':syn=26;TOken[0]=ch;i++;break;
case'(':syn=27;TOken[0]=ch;i++;break;
case')':syn=28;TOken[0]=ch;i++;break; 
case'#':syn=0;TOken[0]=ch;i++;break; 
case'\n':syn=-2;break;
default:syn=-1;
    }
}

四.运行结果及分析

五、        实验总结

不懂词法分析里面一些操作,在进行这个程序是,要识别各种各样的类别,就要进行分类讨论,而且在空格就要跳过进行下一个识别。在看了网上一些代码与借鉴了来完成

原文地址:https://www.cnblogs.com/yxbdbolgs/p/5961289.html