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

词法分析程序(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)\n",num,code);
                break;
            default:
                printf("(%s,%d)\n",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++]='\0';//结束字符串
    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 '\n':
            code=100;
            break;
        default:
            code=-1;
            break;
        }
}

 

测试结果如下:

 

posted @ 2019-10-11 21:37  M.R.J  阅读(227)  评论(0)    收藏  举报