词法分析

实验一、词法分析实验

专业:商业软件工程二班   姓名 :林凯盛 学号: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.      运行结果及分析

 

 

 

四、        实验总结

 

原文地址:https://www.cnblogs.com/SOLARLKS/p/5960846.html