zoukankan      html  css  js  c++  java
  • 词法分析实验报告

    实验一、词法分析实验

    专业:商业软件三班   姓名:殷金秀  学号:201506110243

    一、        实验目的

    编制一个词法分析程序

    二、        实验内容和要求

     输入:源程序字符串

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

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

     

    1. 1.      源程序名:压缩包文件中源程序名

    可执行程序名:

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

    主要总体设计问题。(包括存储结构,主要算法,关键函数的实现等)

    /*存储结构以及变量*/

    char character[80];//存放所有输入的字符

    char*rwtab[6]={"begin","if","then","while","do","end"};

    char token[8];//单词自身字符串

    char ch;//单个字符

    int sym;//sym:单词种别码

    int p,m=0,i,row,sum=0;//sum:整型常数 row:记录新读入的字符行的行号

    /*主要算法*/

    if/else选择语句实现不同字符的判断 for循环语句实现一个一个的读取字符

    /*提示输入字符串并从键盘获取的字符存到character[]中*/

    void main()

    /*识别单词并将识别出来的单词用种别码标识*/

    void scanner();

     

    1. 3.      主要程序段及其解释:

    实现主要功能的程序段,重要的是程序的注释解释。

    while(ch==' ')//忽略空格键

        {

            ch=character[p];

            p++;

        }

        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;

                ch=character[p++];

            }

                token[m++]='';

                p--;

                sym=10;//置标识符的单词种别至sym

                for(i=0;i<6;i++)  //将识别出来的字符和已定义的标示符作比较,

                if(strcmp(token,rwtab[i])==0)

                {

                    sym=i+1;

                    break;

                }

        }

        else if((ch>='0'&&ch<='9'))//检测数字

        {

            sum=0;

            while((ch>='0'&&ch<='9'))

                {

                    sum=sum*10+ch-'0';

                    ch=character[p++];

                }

                p--;

                sym=11;//置常数的单词种别至sym

                if(sum>32767)//

                    sym=-1;

        }

        else switch(ch)//其他字符

        {

        case'<':m=0;token[m++]=ch;// 检测小于等于的符号

            ch=character[p++];

            if(ch=='=')

            {

                sym=21;//置单词种别为21,即小于等于符号

                token[m++]=ch;

            }

            else if(ch=='>')//检测小于大于的符号

            {

                sym=22;//置单词种别为22,即小于大于的符号

                token[m++]=ch;

            }

            else

            {

                sym=23;// 置单词种别为23,即小于的符号

                p--;

            }

            break;

        case'>':m=0;token[m++]=ch; 检测大于等于的符号

           ch=character[p++];

           if(ch=='=')

           {

               sym=24; 置单词种别为24,即大于等于符号

               token[m++]=ch;

           }

           else

           {

               sym=20; 置单词种别为20,即大于的符号

               p--;

           }

           break;

        case':':m=0;token[m++]=ch;

           ch=character[p++];

           if(ch=='=')//检测赋值符号

           {

               sym=18;// 置单词种别为18,即赋值符号

               token[m++]=ch;

           }

           else

           {

               sym=17; 置单词种别为17,即冒号

               p--;

           }

    case'*': sym=13;token[0]=ch;break; 置单词种别为13,即'*'

    case'/':sym=14;token[0]=ch;break; 置单词种别为14,即'/'

            case'+':sym=15;token[0]=ch;break; 置单词种别为15,即'+'

            case'-':sym=16;token[0]=ch;break; 置单词种别为16,即'-'

            case'=':sym=25;token[0]=ch;break; 置单词种别为25,即'='

            case';':sym=26;token[0]=ch;break; 置单词种别为26,即';'

            case'(':sym=27;token[0]=ch;break; 置单词种别为27,即'('

            case')':sym=28;token[0]=ch;break; 置单词种别为28,即')'

            case'#':sym=0;token[0]=ch;break; 置单词种别为0,即'#'

            case' ':sym=-2;break;

            default:sym=-1;break;

    1. 4.      运行结果及分析

    一般必须配运行结果截图,结果是否符合预期及其分析。

       (截图需根据实际,截取有代表性的测试例子)

      

    单词符号

    种别码

    单词符号

    种别码

    begin

    1

    :

    17

    if

    2

    :=

    18

    then

    3

    <

    20

    while

    4

    <=

    21

    do

    5

    <>

    22

    end

    6

    >

    23

    Letter(letter|digit)

    10

    >=

    24

    digit digit

    11

    =

    25

    +

    13

    ;

    26

    -

    14

    (

    27

    *

    15

    )

    28

    /

    16

    #

    0

    结果符合预期

    单词与单词的种别码都符合

    四、        实验总结

    心得体会,实验过程的难点问题及其解决的方法。

    刚开始接触词法分析有点畏难的心理,但是当你慢慢的去敲程序,一点一点接近目标的时候,就会有点成就感,

    实验过程中当然会遇到困难,比喻忘记一些学过的知识,此时我就会查找书上的内容,实验过程的难点就是识别单词并置单词的种别码为sym 遇到自己不会的就会上网查找资料。

     

  • 相关阅读:
    C# 测试 modbusTCP 经验积累
    C#制作透明色GIF动画的类
    C# esc退出窗体
    让PPT演示文稿循环播放
    C# hex 转 float
    C# PowerPoint操作的基本用法。
    将listview的checkbox改成单选。
    google搜索栏设置
    如何在C++中实现Deprecated API Anthony
    只能用new生成的对象 Anthony
  • 原文地址:https://www.cnblogs.com/yjxblog/p/5958248.html
Copyright © 2011-2022 走看看