词法分析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了词法分析相关的知识,希望对你有一定的参考价值。

 

实验一、词法分析实验

专业  商软二班    姓名  罗肖凤   学号  201504040262

一、        实验目的

通过设计编制调试一个具体的词法分析程序,加深对词法分析原理的理解。并掌握在对程序设计语言进行扫描过程中将其分解为各类单词的词法分析方法。

  

 

二、        实验内容和要求

(1)    输入:源程序字符串。

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

(3)   选择高级语言(C语言),编制它的词法分析程序

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

 

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

 

可执行程序名:

词法分析.exe

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

 

                     技术分享

 

待分析的简单词法

(1)    关键字:begin  if  then  while  do  end  所有的关键字都是小写。

(2)    运算符和界符::= + - * / < <= > >= ; ( ) #

(3)    空格有空白、制表符和换行符组成

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

单词符号

种别码

单词符号

种别码

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

 

 

 

 

主要总体设计问题。

(包括存储结构,主要算法,关键函数的实现等)

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

主要功能:输入:所给文法的源程序字符串。

          输出:二元组(syn,token或sum)构成的序列。

          其中:syn为单词种别码;

                token为存放的单词自身字符串;

                sum为整型常数

主要程序:

#include <stdio.h>  
#include <string.h>  
#include<stdlib.h>  
char prog[80],token[8],ch;  
int syn,p,m,n,sum;  
char *rwtab[6]={"begin","if","then","while","do","end"};  
   
void scaner();  
  
void main()  
{  
    p=0;  
    printf("\\n please input a string(end with‘#‘):\\n");  
      
    do{  
            scanf("%c",&ch);  
            prog[p++]=ch;  
    }while(ch!=‘#‘);  
      
    p=0;  
    do{  
            scaner();  
            switch(syn)  
            {  
                case 11:  
                    printf("( %-10d%5d )\\n",sum,syn);  
                break;  
                  
                case -1:  
                    printf("you have input a wrong string\\n");    
                    getchar(); 
               exit(0);  
                  
                default:   
                printf("( %-10s%5d )\\n",token,syn);  
                break;  
            }  
        }while(syn!=0);
    getchar();
 }  
  
void scaner()  
{    
    sum=0;  
      
    for(m=0;m<8;m++)  
        token[m++]=NULL;  
      
        ch=prog[p++];  
        m=0;  
          
    while((ch==‘ ‘)||(ch==‘\\n‘))  //如果字符是空格或者回车,跳过
        ch=prog[p++];  
      
    if(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘)))  //可能是标示符或者变量名或数字 
     {   
        while(((ch<=‘z‘)&&(ch>=‘a‘))||((ch<=‘Z‘)&&(ch>=‘A‘))||((ch>=‘0‘)&&(ch<=‘9‘)))
            //找到一个变量名或者关键字,直到遇到空格为止
       
        {
            token[m++]=ch;  
            ch=prog[p++];  
        }  
          
        p--;  
        syn=10;  
  
        for(n=0;n<6;n++)  
        if(strcmp(token,rwtab[n])==0)  
        {   
            syn=n+1;  
            break;  
        }  
     }  
     else if((ch>=‘0‘)&&(ch<=‘9‘))  
     {   
        while((ch>=‘0‘)&&(ch<=‘9‘))  
        {  
            sum=sum*10+ch-‘0‘;  
            ch=prog[p++];  
        }  
        p--;  
        syn=11;  
    }  
    else   
    {  
        switch(ch)  
        {  
        case ‘<‘:token[m++]=ch;  
            ch=prog[p++];  
            if(ch==‘=‘)  
            {   
                syn=22;  
                token[m++]=ch;  
            }  
            else  
            {    
                syn=20;  
                p--;  
            }  
        break;  
  
        case ‘>‘:token[m++]=ch;  
            ch=prog[p++];  
            if(ch==‘=‘)  
            {  
                syn=24;  
                token[m++]=ch;  
            }  
            else  
            {   
                syn=23;  
                p--;  
            }  
        break;  
  
        case ‘+‘:token[m++]=ch;  
            ch=prog[p++];  
            if(ch==‘+‘)  
            {  
                syn=17;  
                token[m++]=ch;  
            }  
            else  
            {  
                syn=13;  
                p--;  
            }  
        break;  
  
        case ‘-‘:  
            token[m++]=ch;  
            ch=prog[p++];  
            if(ch==‘-‘)  
            {  
                syn=29;  
                token[m++]=ch;  
            }  
            else  
            {   
                syn=14;  
                p--;  
            }  
        break;  
  
        case ‘!‘:  
            ch=prog[p++];  
            if(ch==‘=‘)  
            {   
                syn=21;  
                token[m++]=ch;  
            }  
            else  
            {   
                syn=31;  
                p--;  
            }  
        break;  
  
        case ‘=‘:  
            token[m++]=ch;  
            ch=prog[p++];  
            if(ch==‘=‘)  
            {  
                syn=25;  
                token[m++]=ch;  
            }  
            else  
            {  
                syn=18;  
                p--;  
            }  
        break;  
  
        case ‘*‘:  
            syn=15;  
            token[m++]=ch;  
        break;  
  
        case ‘/‘:  
            syn=16;  
            token[m++]=ch;  
        break;  
  
        case ‘(‘:   
            syn=27;  
            token[m++]=ch;  
        break;  
  
        case ‘)‘:  
            syn=28;  
            token[m++]=ch;  
        break;  
  
        case ‘{‘:   
            syn=5;  
            token[m++]=ch;  
        break;  
  
        case ‘}‘:   
            syn=6;  
            token[m++]=ch;  
        break;  
  
        case ‘;‘:  
            syn=26;  
            token[m++]=ch;  
        break;  
  
        case ‘\\"‘:  
            syn=30;  
            token[m++]=ch;  
        break;  
  
        case ‘#‘:   
            syn=0;  
            token[m++]=ch;  
        break;  
  
        case ‘:‘:  
            syn=17;  
            token[m++]=ch;  
        break;  
  
        default:  
            syn=-1;  
        break;  
        }  
    }  
        token[m++]=‘\\0‘;  
} 
  1. 4.     运行结果及分析

技术分享

 

四、        实验总结

  由于是第一次做编译,所以此次实验对于我来说挺难的,我通过上网摸索以及跟同学讨论渐渐的了解了如何设计、编制并调试词法分析程序,加深对词法分析原理的理解。

 

 

 

 

 

 

 

 

 

以上是关于词法分析的主要内容,如果未能解决你的问题,请参考以下文章

词法分析

词法分析器代码复审

实验一 词法分析器+编译原理

Second-词法分析

词法分析器

js词法分析