zoukankan      html  css  js  c++  java
  • 实验一

    实验一、词法分析程序实验

    商业软件工程  张宇健 201506110176

    实验目的

     

         编制一个词法分析程序。

     

    实验内容:

    1. 对字符串表示的源程序

    2. 从左到右进行扫描和分解

    3. 根据词法规则:

    单词符号

    种别码

    单词符号

    种别码

    begin

    1

    :

    17

    if

    2

    :=

    18

    then

    3

    <

    20

    while

    4

    <=

    21

    do

    5

    <>

    22

    end

    6

    >

    23

    l(l|d)*(标识符)

    10

    >=

    24

    dd*(整数)

    11

    =

    25

    +

    13

    ;

    26

    -

    14

    (

    27

    *

    15

    )

    28

    /

    16

    #

    0

    4. 识别出一个一个具有独立意义的单词符号

    5. 以供语法分析之用

    6. 发现词法错误,则返回出错信息。

    实验要求:

    输入:源程序字符串

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

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

    源程序名:

    源程序名: 实验1.c

    可执行程序名:实验1.exe

    原理分析及流程图

    1) 存储结构:一维顺序数组存储。

    2) 算法关键定义:

    01. 定义全局变量o存放单词种别码

    02. 定义数组x存放整个字符串,数组z存放临时字符串

    03. 定义数组y存放关键字

    3) 流程图:

     

     

     

     

     

             N

     

     

     

    N

     

    Y N

     

     

         Y

     

     

     

     

     

    Y

     

     

    N

     

     

    N

     

     

     

    Y

     

    源代码

    #include<stdio.h>

    #include<string.h>

    #include<math.h>

    #define n 100

    void ss();

    char *y[n]={"begin","if","then","while","do","end"},x[n],ch,z[8];

    int i,j=0,k,o;

    main()

    {

        printf("请输入你需要查询的字符串(#结束)");

        do{

            ch=getchar();

            x[j++]=ch;

        }while(ch!='#');

        j=0;

        do

    {

    ss();

    switch(o)

    {

    case -1:printf("词法分析 出错 ");break;

    default :printf("<%d,%s> ",o,z);break;

    }

    }while(o!=0);

    printf("词法分析 成功 ");

    getchar();

    }

    void ss()

    {

        for(k=0;k<8;k++)

        {

           z[k]='';

        }

        k=0;

        ch=x[j++];

        while(ch==' ')

        {

            ch=x[j++];

        }

        if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))

        {

            do{

                z[k++]=ch;

                ch=x[j++];

            }while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'));

            o=10;

             for(i=0;i<6;i++)

            {

                if(strcmp(z,y[i])==0)

                    o=i+1;

            }

            j--;

        }

        else if(ch>'0'&&ch<='9')

        {

            j--;

            do{

                z[k++]=x[j++];

                ch=x[j];

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

           o=11;

           return;

        }

        else

    {

    switch(ch)

    {

    case '+':o=13;z[0]=ch;break;

    case '-':o=14;z[0]=ch;break;

    case '*':o=15;z[0]=ch;break;

    case '/':o=16;z[0]=ch;break;

    case ':':o=17;z[0]=ch;

    ch=x[j++];

    if(ch=='='){z[1]=ch;o++;}

    else j--;

    break;

    case '<':o=20;z[0]=ch;

    ch=x[j++];

    if(ch=='>'){z[1]=ch;o++;}

    else if(ch=='='){z[1]=ch;o=o+2;}

    else j--;

    break;

    case '>':o=23;z[0]=ch;

    ch=x[j++];

    if(ch=='='){z[1]=ch;o++;}

    else j--;

    break;

    case '=':o=25;z[0]=ch;break;

    case ';':o=26;z[0]=ch;break;

    case '(':o=27;z[0]=ch;break;

    case ')':o=28;z[0]=ch;break;

    case '#':o=0;z[0]=ch;break;

    default: printf("词法分析出错! 请检查是否输入非法字符 ");o=-1;break;

    }

    }

    }

  • 相关阅读:
    HDU 1116 Play on Words(并查集和欧拉回路)(有向图的欧拉回路)
    PHP 错误与异常 笔记与总结(8)自定义错误处理函数 set_error_handler()
    【VR】Leap Motion 官网文档 FingerModel (手指模型)
    2014年辛星解读Javascript之DOM之事件及其绑定
    java.util.logging.Logger使用具体解释
    技术走向管理一些思考(8)-适合的人才
    rac_grid自检提示缺少cvuqdisk包
    C++第15周(春)项目3
    交换a、b的值temp = a; a = b; b = temp;比a = a^b;b = a^b;a = a^b;快
    BZOJ 1089 SCOI2003 严格n元树 动态规划+高精度
  • 原文地址:https://www.cnblogs.com/onlythisone/p/5967276.html
Copyright © 2011-2022 走看看