zoukankan      html  css  js  c++  java
  • 词法分析

    实验一、词法分析实验

    专业:商业软件工程二班   姓名 :林凯盛 学号:201506110149

    一、        实验目的

     

         编制一个词法分析程序

    二、        实验内容和要求

    实验内容:1.对字符串表示的源程序

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

    3.根据词法规则

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

    5.以供语法分析之用

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

    实验要求:输入:源程序字符串

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

              待分析语言的词法规则

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

     

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

    可执行程序名:yjw.exe

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

    1、设置全局变量

            1)char sum[]  把用户输入字符存到数组里面的

     2)char ch     判断输入的字符的组成部分

     3)char token[] 存放sum[]以及ch

     4)*keyword[]  存放关键字

         2、关键字表

    *keyword[18]={"begin","and","const","long","float","double","void","main","if",       "else","then","break","int","char","include","for","while","printf"}

     

     3、关键函数

     void scaner()  词法扫描及其判断程序

      void main()   用户输入与输出

    种别码表

    单词符号

    种别码

    单词符号

    种别码

    单词符号

    种别码

    单词符号

    种别码

    begin

    1

    int

    13

    :

    28

    }

    40

    end

    2

    char

    14

    :=

    29

    !

    41

    const

    3

    include

    15

    30

    @

    42

    long

    4

    for

    16

    <=

    31

    $

    43

    float

    5

    while

    17

    <> 

    32

    %

    44

    double

    6

    printf

    18

    33

    ^

    45

    void

    7

    l(l|d)*

    21

    >=

    34

    &

    46

    main

    8

    dd*

    22

    =

    35

    #

    0

    if

    9

    +

    24

    ;

    36

    else

    10

    -

    25

    (

    37

    then

    11

    *

    26

    )

    38

    break

    12

    /

    27

    {

    39

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

    #include <stdio.h>

    #include <stdlib.h>

    #include <string.h>

    char prog[100],ch,token[8];

    int p=0,syn,n,i;

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

    void scaner();

    void Irparse();

    void statement();

    void expression_r();

    void term();

    void factor();

    void main()

    {

        int select=-1;

        p=0;

        printf("please input sentence, end of '#' !\n");

        do

        {

               ch=getchar();

               prog[p++]=ch;

        }while(ch!='#');

        p=0;

       

        do

        {

               scaner();

               switch(syn)

               {

                     

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

               default :printf("<%d,%s>\n",syn,token);break;

               }   

        }while(syn!=0);

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

       

        getchar();

       

    }

    void scaner()

    {

       

       

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

        {token[n]='\0';}

        n=0;

        ch=prog[p++];

        while(ch==' '){ch=prog[p++];}

       

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

        {

               do{

                      token[n++]=ch;

                      ch=prog[p++];

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

               syn=10;

              

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

               {if(strcmp(token,keyword[n])==0)

               {

                      syn=n+1;

                     

               }

               }

               p--;

               //return;

        }

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

        {

               p--;

               do

               {

                      token[n++]=prog[p++];

                      ch=prog[p];

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

               syn=11;

              

              

               return;

        }

        else

        {

              

               //ch=prog[p++];

               switch(ch)

               {

               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=17;token[0]=ch;

                      ch=prog[p++];

                      if(ch=='='){token[1]=ch;syn++;}

                      else p--;

                      break;

               case '<':syn=20;token[0]=ch;

                      ch=prog[p++];

                      if(ch=='>'){token[1]=ch;syn++;}

                      else if(ch=='='){token[1]=ch;syn=syn+2;}

                      else p--;

                      break;

               case '>':syn=23;token[0]=ch;

                      ch=prog[p++];

                      if(ch=='='){token[1]=ch;syn++;}

                      else p--;

                      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=0;token[0]=ch;break;

                     

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

                     

               }

              

               //return;

        }

       

    }

    void statement()

    {

        if(syn==10)

        {

               scaner();

               if(syn==18)

               {

                      scaner();

                      expression_r();

               }

               else

               {

                      printf("语法分析出错! 请检查表达式是否正确\n");return;

               }

        }

        else

        {

               printf("语法分析出错!  请检查语句是否正确\n");return;

        }

    }

    void expression_r()

    {

        term();

        while(syn==13||syn==14)//+ -

        {

               scaner();

               term();

        }

    }

    void term()

    {

        factor();

        while(syn==15||syn==16)//* /

        {

               scaner();

               factor();

        }

    }

    void factor()

    {

        if(syn==10||syn==11)

        {

               scaner();

        }

        else if(syn==27)

        {

               scaner();

               expression_r();

               if(syn==28)

               {

                      scaner();

               }

               else {printf("语法分析出错! 请检查是否缺少')'\n");return;}

        }

        else {printf("语法分析出错! 请检查是否输入非法字符\n");return;}

     4.      运行结果及分析

     

     

     

    四、        实验总结

     

  • 相关阅读:
    软件评价——360安全卫士
    对于软件工程课程的疑问
    附加作业
    个人最终总结
    结对编程 电梯调度程序
    读程序作业
    VS2015 单元测试
    VS2015 的安装过程
    四则运算程序
    对于软件的点评
  • 原文地址:https://www.cnblogs.com/SOLARLKS/p/5960846.html
Copyright © 2011-2022 走看看