• 词法分析


    实验一、词法分析实验

    专业:商业软件   姓名:韦兴纳  学号:201506110242

    一、        实验目的

     

    编写一个词法分析程序模拟编译器分析解释程序字符串的过程。

    二、        实验内容和要求

    输入:源程序字符串

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

    各种单词符号对应的种别码

     

    单词符号

    种别码

    单词符号

    种别码

    Begin

    1

    :

    17

    If

    2

    :=

    18

    Then

    3

    20

    While

    4

    <=

    21

    Do

    5

    <> 

    22

    End

    6

    23

    |(||d)*

    10

    >=

    24

    Dd*

    11

    =

    25

    +

    13

    ;

    26

    -

    14

    (

    27

    *

    15

    )

    28

    /

    16

    #

    0

     

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

     

    1. 1.      源程序名:压缩包文件(rarzip)中源程序.c

    可执行程序名:词法分析.exe

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

     

     

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

    1、接收用户输入:getchar()和do…while循环的组合

        do{

               ch=getchar();

               prog[p++]=ch;

        }while(ch!='#');  //输入以#号键结束

    2、对输入的字符串进行数字字符和字母字符的分析判断,并保存相应单词的种别码

    void scaner(){

         int m=0;

         sum=0;

         char *keyword[7]={"begin","if","then","for","while","do","end"};//数组存放关键字

        for(n=0;n<9;n++)

            token[n]='\0';

        ch=prog[p++];

        while(ch==' ')

            ch=prog[p++];

        if(isalpha(ch))    /*ch为字母字符*/{

            while(isalpha(ch)||isdigit(ch))    /*ch 为字母字符或者数字字符*/{

               token[m++]=ch;

               ch=prog[p++];}

            token[m++]='\0';

            ch=prog[p--];

            syn=10;

            for(n=0;n<7;n++)

                if(strcmp(token,keyword[n])==0)    /*字符串的比较*/{

                    syn=n+1;

                    break;}}

        else

            if(isdigit(ch))    /*ch是数字字符*/{

                while(isdigit(ch))    /*ch是数字字符*/{

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

                    ch=prog[p++];}

                ch=prog[p--];

                syn=11;}

            else

                switch(ch){

                    case'<':

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

                            if(ch=='>'){

                            syn=21;

                                token[m++]=ch;}

                            else if(ch=='='){

                                syn=22;

                                token[m++]=ch;}

                                else{

                                     syn=20;

                                     ch=prog[p--];}

                            break;

                    case'>':

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

                            if(ch=='='){

                                syn=24;

                                token[m++]=ch;}

                            else{

                            syn=23;

                            ch=prog[p--];}

                            break;

                 case':':

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

                         if(ch=='='){

                             syn=18;

                            token[m++]=ch;}

                         else{

                             syn=17;

                             ch=prog[p--];}

                         break;

                 case'+':

    syn=13;token[0]=ch;

                              break;

                 case'-':

    syn=14;token[0]=ch

                                            ;break;

                 case'*':

    syn=15;token[0]=ch;

                              break;

                 case'/':

    syn=16;token[0]=ch;

                              break;

                 case'=':

    syn=25;token[0]=ch;

                              break;

                 case';':

    syn=26;token[0]=ch;

                              break;

                 case'(':

    syn=27;token[0]=ch;

                              break;

                 case')':

    syn=28;token[0]=ch;

                              break;

                 case'!':

    syn=29;token[0]=ch;

                              break;

                 case'#':

    syn=0;token[0]=ch;

                              break;

                 default:syn=-1;}

    }

    1. 4.      运行结果及分析

     

     

     

     

     

    四、        实验总结

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

        做词法分析程序时遇到了很多困难,因为其中涉及很多分析判断。编程之前必须对题目有清晰的思路。先用getchar()和do…while循环的组合接受用户输入的字符串,再用isalpha(ch)||isdigit(ch)对读取的字符串进行字母字符和数字字符的判断。接着逐个读取字符进行词法分析。

     

     

  • 相关阅读:
    MD5 初探。
    VFW程序分析
    IE版本简单兼容 JS闭包和JS对象解说。
    句柄和指针
    超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小
    DataGrid模板列上的ImageButton 不能触发ItemCommand事件
    html转换成文本
    几种取数据库随机记录的方法
    打开.net时CPU占用率100%的问题个人处理办法
    强制输出wxl
  • 原文地址:https://www.cnblogs.com/weixingna/p/5979849.html
Copyright © 2020-2023  润新知