词法分析程序的设计与实现

Posted mrj1

tags:

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

词法分析程序(Lexical Analyzer)要求:

- 从左至右扫描构成源程序的字符流

-  识别出有词法意义的单词(Lexemes

-  返回单词记录(单词类别,单词本身)

-  滤掉空格

-  跳过注释

-  发现词法错误

 

程序结构:

输入:字符流(什么输入方式,什么数据结构保存)

处理:

–遍历(什么遍历方式)

–词法规则

输出:单词流(什么输出形式)

–二元组

 

单词类别:

1.标识符(10)

2.无符号数(11)

3.保留字(一词一码)

4.运算符(一词一码)

5.界符(一词一码)

 

单词符号

种别码

单词符号

种别码

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

代码如下:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void judge();
char input[100],output[10]; //输入输出数组
char word;
int  code,row,num,p,i,k;
char *reserve[6]={"begin","if","then","while","do","end"};

int main(){
        row=1,p=0;
        printf("输入测试字段:");
        do{
            word=getchar();
            input[p++]=word; 
        }
        while(word!=#);
        p=0;
        do{
            judge();
            switch(code){
            case -1:
                printf("第%d行有误!",row);
                break;
                case 100:
                row+=1;
                break;
            case 11:
                printf("(%d,%d)
",num,code);
                break;
            default:
                printf("(%s,%d)
",output,code);
                break;
            }
        }
        while(code!=0);
}

void judge(){
    for(i=0;i<8;i++)
        output[i]=NULL; 
    word=input[p++]; 
    while(word== ){//空格则忽略 
        word=input[p]; 
        p++;
    }
    if((word>=a&&word<=z)||(word>=A&&word<=Z)){//判断字母 
        k=0;
        while((word>=0&&word<=9)||(word>=a&&word<=z)||(word>=A&&word<=Z)){
        output[k++]=word;
        word=input[p++];
    }
    output[k++]=;//结束字符串
    p--;
    code=10;
    for(i=0;i<6;i++){
        if(strcmp(reserve[i],output)==0){//关键字对比
            code=i+1;
            break;
        }
    }
    }else if(word>=0&&word<=9){//判断数字
        num=0;
        while(word>=0&&word<=9){
            num=num*10+(word-0);
            word=input[p++];
        }
        p--;
        code=11;
    }else switch(word){//判断符号
        case +:
        output[0]=word;code=13;
            break;
        case -:
            output[0]=word;code=14;
            break;
        case *:
            output[0]=word;code=15;
            break;
        case /:
            output[0]=word;code=16;
            break;
        case ::
            i=0;
            output[i++]=word;
            word=input[p++];
            if(word===){
                output[i++]=word;
                code=18;
            }else{
                code=17;
                p--;
            }
            break;
        case <:
            i=0; 
            output[i++]=word;
            word=input[p++];
            if(word===){
                output[i++]=word;
                code=21;
            }else if(word==>){
                output[i++]=word;
                code=22;
            }else{
                code=20;
                p--;
            }
            break;
        case >:
            i=0;
            output[i++]=word;
            word=input[p++];
            if(word===){
                output[i++]=word;
                code=24;
            }else{
                code=23;
                p--;
            }
            break;
        case =:
            output[0]=word;code=25;
            break;
        case ;:
            output[0]=word;code=26;
            break;
        case (:
            output[0]=word;code=27;
            break;
        case ):
            output[0]=word;code=28;
            break;
        case #:
            output[0]=word;code=0;
            break;
        case 
:
            code=100;
            break;
        default:
            code=-1;
            break;
        }
}

 

测试结果如下:

技术图片

 

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

5.词法分析程序的设计与实现

词法分析程序的设计与实现

词法分析程序的设计与实现

词法分析程序的设计与实现

词法分析程序的设计与实现

编译原理之词法分析程序的设计与实现