实验一词法分析

商软二班 201506110170 何强

一、实验目的

通过设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,检查语法错误,进一步掌握常用的语法分析方法。

二、实验内容和要求

该程序要实现的是一个读单词过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。并依次输出各个单词的内部编码及单词符号自身值。

(1)关键字:

begin  if  then  while  do  end  所有的关键字都是小写。

(2)运算符和界符

=  +  -  *  /  <  <=  <>  >  >=  =  ;  (  )  #

要把上面关键字和运算符转化种别码,下面为符号和种别码的对照表

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

代码:

#include <stdio.h>
#include <string.h>  

char prog[80],token[8],ch;
int syn,p,m,n,sum;
char *rwtab[6]={"begin","if","then","while","do","end"};  

void scaner(void);  

main()
{
    p=0;
    printf("\n please input a string(end with ‘#‘):\n");  

    do{
            scanf("%c",&ch);
            prog[p++]=ch;
    }while(ch!=‘#‘);  

    p=0;
    do{
            scaner();
            switch(syn)
            {
                case 11:
                    printf("( %-10d%5d )\n",sum,syn);
                break;  

                case -1:
                    printf("you have input a wrong string\n");  

                    return 0;
                break;  

                default:
                printf("( %-10s%5d )\n",token,syn);
                break;
            }
        }while(syn!=0);  

 }  

void scaner(void)
{
    sum=0;  

    for(m=0;m<8;m++)
        token[m++]= NULL;  

        ch=prog[p++];
        m=0;  

    while((ch==‘ ‘)||(ch==‘\n‘))
        ch=prog[p++];  

    if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘)))
     {
        while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((ch>=‘0‘)&&(ch<=‘9‘)))
        {
            token[m++]=ch;
            ch=prog[p++];
        }  

     p--;
        syn=10;  

        for(n=0;n<6;n++)
        if(strcmp(token,rwtab[n])==0)
        {
            syn=n+1;
            break;
        }
     }
     else if((ch>=‘0‘)&&(ch<=‘9‘))
     {
        while((ch>=‘0‘)&&(ch<=‘9‘))
        {
            sum=sum*10+ch-‘0‘;
            ch=prog[p++];
        }
        p--;
        syn=11;
    }
    else
    {
        switch(ch)
        {
        case ‘<‘:
            token[m++]=ch;
            ch=prog[p++];
            if(ch==‘=‘)
            {
                syn=22;
                token[m++]=ch;
            }
            else
            {
                syn=20;
                p--;
            }
        break;  

        case ‘>‘:
            token[m++]=ch;
            ch=prog[p++];
            if(ch==‘=‘)
            {
                syn=24;
                token[m++]=ch;
            }
            else
            {
                syn=23;
                p--;
            }
        break;  

        case ‘+‘:
            token[m++]=ch;
            ch=prog[p++];
            if(ch==‘+‘)
            {
                syn=17;
                token[m++]=ch;
            }
            else
            {
                syn=13;
                p--;
            }
        break;  

        case ‘-‘:
            token[m++]=ch;
            ch=prog[p++];
            if(ch==‘-‘)
            {
                syn=29;
                token[m++]=ch;
            }
            else
            {
                syn=14;
                p--;
            }
        break;  

        case ‘!‘:
            ch=prog[p++];
            if(ch==‘=‘)
            {
                syn=21;
                token[m++]=ch;
            }
            else
            {
                syn=31;
                p--;
            }
        break;  

        case ‘=‘:
            token[m++]=ch;
            ch=prog[p++];
            if(ch==‘=‘)
            {
                syn=25;
                token[m++]=ch;
            }
            else
            {
                syn=18;
                p--;
            }
        break;  

        case ‘*‘:
            syn=15;
            token[m++]=ch;
        break;  

        case ‘/‘:
            syn=16;
            token[m++]=ch;
        break;  

        case ‘(‘:
            syn=27;
            token[m++]=ch;
        break;  

        case ‘)‘:
            syn=28;
            token[m++]=ch;
        break;  

        case ‘;‘:
            syn=26;
            token[m++]=ch;
        break;  

        case ‘\"‘:
            syn=30;
            token[m++]=ch;
        break;  

        case ‘#‘:
            syn=0;
            token[m++]=ch;
        break;  

        case ‘:‘:
            syn=17;
            token[m++]=ch;
        break;  

        default:
            syn=-1;
        break;
        }
    }
        token[m++]=‘\0‘;
}

运行结果及分析

因为

beign在对照表中对应的种别码为1,所以输出1;

以此类推,根据符号和种别码对照表,设置与符号和字符相对应的种别码。

#为终结符。

四、实验总结

通过与同学的交流,掌握了主要方法后发现其原理十分简单 ,但还是有点问题不能解决,例如end的种别码为6,单独输出没有问题,但和其他字符连着输出就会输出其他数字

时间: 2024-10-16 02:08:29

实验一词法分析的相关文章

实验一&#160;&#160;词法分析程序045

实验一  词法分析程序实验 专业 计算机科学与技术   姓名 邹汉辉  学号 201508030045 一.实验目的 1. 编制一个词法分析程序 二. 实验内容和要求 1. 输入:源程序字符串 2. 输出:二元组(种别,单词本身) 3. 待分析语言的词法规则 三. 实验方法.步骤及结果测试 1.  源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c 可执行程序名:cifafenxi.exe 2.  原理分析及流程图 3.  主要程序段及其解释: #include<stdio

实验一词法分析报告

实验一.词法分析实验 专业:商业软件工程三班       姓名:郑锦诚      学号:201506110198 一.        实验目的 词法分析是编译的第一阶段,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析. 二.        实验内容和要求 让用户输入一段程序段,然后逐个读取字符,将它们拼在一起,获取一个有意义的单词或符号,识别出单词或符号种别以及自身的值,并输出. 三.        实验方法.步骤及结果测试 1.      源程序名:压缩包文

哈工大软件学院编译原理实验1——词法分析

这次实验被"过来人"们定位非常easy,实验内容例如以下: ----------------------------------------------------------------------------------- 对例如以下工作进行展开描写叙述 (1) 给出语言的词法规则描写叙述 · 标识符.keyword.整常数.字符常数.浮点常数 · 单界符:+,-,×,;,- · 双界符:/*,:=,>=,<=,!=,- · 凝视 (2) 针对这样的单词的状态转换图和程

实验报告-词法分析.c

实验一.词法分析程序 商业软件工程   简梓茵  201506110132 一.        实验目的   熟悉词法分析的形式. 二.        实验内容和要求 对输入的每个关键字或者字符进行词法分析,给出该关键字对应的排序序号 三.        实验方法.步骤及结果测试   1.      源程序名:wordanalyse.c 2.      原理分析及流程图 3.      主要程序段及其解释: #include <stdio.h> #include <string.h>

实验一词法分析程序

一.        实验目的 编制一个词法分析程序 二.        实验内容和要求 输入:源程序字符串 输出:二元组(种别,单词本身) 待分析语言的词法规则 三.        实验方法.步骤及结果测试 1.      源程序名:压缩包文件(rar或zip)中源程序名 cifafenxi.c  cifafenxi.exe 2.      原理分析及流程图 3.      主要程序段及其解释: do { scanf("%s\n",input); i=0; while(input[i]

实验一 词法分析实验报告

实验一.词法分析实验 专业:商业软件工程2班  姓名 别博文  学号201606110175 一. 实验目的        编制一个词法分析程序. 二. 实验内容和要求 对字符串表示的源程序,从左到右进行扫描和分解,根据词法规则,识别出一个一个具有独立意义的单词符号,以供语法分析之用 发现词法错误,则返回出错信息.. 三. 实验方法.步骤及结果测试  源程序名:压缩包文件(rar或zip)中源程序名 ceshi.c 可执行程序名:ceshi.exe 主要程序段及其解释: 实现主要功能的程序段,重

0930 实验一 词法分析

一.实验目的: 编写一个词法分析程序 二.实验要求: ①输入源程序字符串 ②输出二元组(种别,单词符号本身) 三.各种单词符号对应的种别码(删减版) 四.程序代码 1 #include<stdio.h> 2 #include<string.h> 3 void F(char c,char b); 4 void word(char a[]); 5 void number(char a[]); 6 int i; //定义全局变量i 7 int s=1; //用来记录是否存在非法字符 8

实验一词法分析试验报告

实验一.词法分析实验 专业:商业软件工程   姓名:林海鑫  学号:201506110120 一.        实验目的 (1)掌握词法分析程序的实现方法. (2)用C语言对一个简单语言的子集编制一个一遍扫锚的编译理解,掌握编译程序的实现方法和技术. (3)理解词法分析在编译程序中的作用. (4)加深对有穷自动机模型的理解. 二.        实验内容和要求 1,词法分析程序的功能(输入,输出). 2,待分析的简单语言的词法. 3,各种单词符号对应的种别码. 三.        实验方法.步

实验1 词法分析

格式说明:排版时注意按此模板的字体,字号和行距. 报告提交和打印输出时请去掉此框. 实验一.词法分析实验 商软1班   周展鹏  201506110114 一.        实验目的        通过设计一个词法分析程序,对词法进行分析,加强对词法的理解,掌握对程序设计语言的分解和理解. 二.        实验内容和要求 在原程序中输入源代码 对字符串表示的源程序 从左到右进行扫描和分解 根据词法规则 识别出一个一个具有独立意义的单词符号 以供语法分析之用 发现词法错误,则返回出错信息 在

实验一 词法分析程序实验

实验一.词法分析程序实验 商业软件工程   蓝海鹏  201506110171 一.        实验目的        编制一个词法分析程序. 二.        实验内容和要求 实验内容: 对字符串表示的源程序 从左到右进行扫描和分解 根据词法规则: 单词符号 种别码 单词符号 种别码 begin 1 : 17 if 2 := 18 then 3 < 20 while 4 <= 21 do 5 <> 22 end 6 > 23 l(l|d)*(标识符) 10 >=