Rinkong贝比

导航

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

词法分析程序(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>
char savearray[100],outarray[100];
char ch;
int row,arrays,count,m,i,p;//count为计数器  p为指针
char *wordsymbol[6] = {"if", "begin", "then", "while", "do", "end"};
void getarrays(){
    for(i = 0; i < 8; i++){
        outarray[i] == NULL;
    }
    ch = savearray[p++];
    while(ch == ' '){
        ch = savearray[p];
        p++;
    }
   
    if((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <='Z')){
        m = 0;
        while((ch <= '9' && ch>= '0') || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')){
            outarray[m++] = ch;
            ch = savearray[p++];   
        }
        outarray[m++] = '\0';
        p--;
        arrays = 10;
        for(i = 0; i < 6; i++){
            if(strcmp(wordsymbol[i],outarray) == 0){
                arrays =1 + i;
                break;
            }
           
        }
    }else if(ch <= '9' && ch>= '0'){
        count = 0;
        while(ch >= '0' && ch <='9'){
            count *= 10 + (ch - '0');
            ch = savearray[p++];
        }
            p--;
            arrays = 11;    
        } else switch(ch){
        case '+':
            outarray[0] = ch;
            arrays = 13;
            return;
        case '-':
            outarray[0] = ch;
            arrays = 14;
            return;
        case '*':
            outarray[0] = ch;
            arrays = 15;
            break;
        case '/':
            outarray[0] = ch;
            arrays = 16;
            break;
        case ':':
            i = 0;
            outarray[i++] = ch;
            ch = savearray[p++];
            if(ch == '='){
                outarray[i++] = ch;
                arrays = 18;
            }else{
                arrays = 17;
                p--;
            }
            return;
       
        case '<':
            i = 0;
            outarray[i++] = ch;
            ch = savearray[p++];
            if(ch == '='){
                outarray[i++] = ch;
                arrays = 21;
               
            }else if(ch == '='){
                outarray[i++] = ch;
                arrays = 22;
            }else{
                arrays = 20;
                p--;
            }
            return;
        case '>':
            i = 0;
            outarray[i++] = ch;
            ch = savearray[p++];
            if(ch == '='){
                outarray[i++] = ch;
                arrays = 24;
            }else{
                arrays = 23;
                p--;
            }
            return;
        case '=':
            outarray[0] = ch;
            arrays = 25;
            break;
        case ';':
            outarray[0] = ch;
            arrays = 26;
            break;
        case '(':
            outarray[0] = ch;
            arrays = 27;
            break;
        case ')':
            outarray[0] = ch;
            arrays = 28;
            break;
        case '#':
            outarray[0]  = ch;
            arrays = 0;
            break;
        case '\n':
            arrays = 100;
            break;
        default:
            arrays = -1;
    }
    }
    int main(){
        int p = 0,
            row = 1;
        printf("输入测试语句:");
        do{
            ch = getchar();
            savearray[p++] = ch;   
        }while(ch != '#');
        
        p = 0;
        do{
            getarrays();
            switch(arrays){
                case -1:
                    printf("第%d行有问题",row);
                    break;
                case 100:
                    row += 1;
                    break;
                case 11:
                    printf("(%d,%d)\n", count,arrays);
                    break;
                default:
                    printf("(%s,%d)\n",outarray,arrays);
                }
        }while(arrays != 0);   
        }

 

 

转载自https://www.cnblogs.com/lingcode/p/11656587.html

周五今天做了一天,还是没能做出来

 

posted on 2019-10-11 21:59  Rinkong贝比  阅读(125)  评论(0)    收藏  举报