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

词法分析程序(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>

#define gjword 13         //关键字个数
#define nmax 14         //number的最大位数
#define al 10           //标识符的最长长度

#define getchdo         if(-1==getch()) return -1;

char ch;                //读取的字符

char id[al+1];          //传递标识符单词 
int num;                //传递数值 
int js, js2;             
char find[100];
char a[al+1];           //暂时存储符号
char word[gjword][al];    //保留字

FILE* input;
 
 
int getch()
{
    if(js == js2)
    {
        if(feof(input))
        {
            printf("
词法分析完毕!
");
            return -1;
        }
        js2 = 0;
        js = 0;
        ch = ' ';
        while(ch != '
')
        {
            if(fscanf(input, "%c", &ch) == EOF)
            {
                find[js2] = 0;
                break;
            }
//            printf("%c", ch);
            find[js2] = ch;
            js2++;
        }
        printf("
");
    }
    ch = find[js];
    js++;
    return 0;
}
 
int getsym()
{
    int i, j, k;
    while(ch == ' ' || ch == '
' || ch == '#')
    {
        getchdo;
    }
    if(ch >= 'a' && ch <= 'z')
    {
        k = 0;
        do
        {
            if(k < al)
            {
                a[k] = ch;
                k++;
            }
            getchdo;
        }while(ch >= 'a' && ch <= 'z' || ch >= '0' && ch <= '9');
        a[k] = '';
        strcpy(id, a);
        i = 0;
        j = gjword-1;
        do
        {
            k = (i+j)/2;
            if(strcmp(id, word[k]) <= 0)
                j = k-1;
            if(strcmp(id, word[k]) >= 0)
                i = k+1;
        }while(i <= j);
 
        if(i-1 > j)
        {
            printf("保留字 ('%s')
", id);
        }
        else
        {
            printf("标识符 ('%s')
", id);
        }
    }
    else
    {
        if(ch >= '0' && ch <= '9')
        {
            k = 0;
            num = 0;
            do
            {
                num = num * 10 + ch - '0';
                k++;
                getchdo;
            }while(ch >= '0' && ch <= '9');
            k--;
            if(k > nmax)
            {
                
            }
            printf("整 数 ('%d')
",num);
        }
        else
        {
            if(ch == ':')
            {
                getchdo;
                if(ch == '=')
                {
                    printf("运算符 (':=')
");
                    getchdo;
                }
                else
                {
                     printf("符号':'不能单独使用
");
                }
            }
            else
            {
                if(ch == '<')
                {
                    getchdo;
                    if(ch == '=')
                    {
                        printf("运算符 ('<=')
");
                        getchdo;
                    }
                    else
                    {
                        printf("运算符 ('<')
");
                    }
                }
                else
                {
                    if(ch == '>')
                    {
                        getchdo;
                        if(ch == '=')
                        {
                            printf("运算符 ('>=')
");
                            getchdo;
                        }
                        else
                        {
                            printf("运算符 ('>')
");
                        }
                    }
                    else
                    {
                        if(ch=='+')
                        {
                            printf("运算符 ('+')
");
                            getchdo;
                        }
                        else if(ch=='-')
                        {
                            printf("运算符 ('-')
");
                            getchdo;
                        }
                        else if(ch=='*')
                        {
                            printf("运算符 ('*')
");
                            getchdo;
                        }
                        else if(ch=='/')
                        {
                            printf("运算符 ('/')
");
                            getchdo;
                        }
                        else if(ch=='=')
                        {
                            printf("运算符 ('=')
");
                            getchdo;
                        }
                        else if(ch=='(')
                        {
                            printf("分界符 ('(')
");
                            getchdo;
                        }
                        else if(ch==')')
                        {
                            printf("分界符 (')')
");
                            getchdo;
                        }
                        else if(ch==',')
                        {
                            printf("分界符 (',')
");
                            getchdo;
                        }
                        else if(ch==';')
                        {
                            printf("分界符 (';')
");
                            getchdo;
                        }
                        else if(ch=='.')
                        {
                            printf("分界符 ('.')
");
                            getchdo;
                        }
                        else
                        {
                            printf("其他字符('%c')
",ch);
                            getchdo;
                        }
                    }
                }
            }
        }
    }
    return 0;
}
void init()
{

    strcpy(&(word[0][0]), "begin");
    strcpy(&(word[1][0]), "if");
    strcpy(&(word[2][0]), "then");
    strcpy(&(word[3][0]), "while");
    strcpy(&(word[4][0]), "do");
    strcpy(&(word[5][0]), "end");
    strcpy(&(word[6][0]), "void");
    strcpy(&(word[7][0]), "struct");

}
int main()
{

    input = fopen("test.txt", "r");
    if(input)
    {
        init();
        js = js2 = 0;
        ch = ' ';
        while(getsym() != -1)
        {
       
        }        
    }
    else
    {
        printf("找不到文件
");
    }
    printf("
");
    return 0;
}

运行效果截图:

此次作业代码为学习理解课本上的代码和参考部分网上的代码进行学习编写的

参考链接:https://blog.csdn.net/sinat_37341950/article/details/79565485

原文地址:https://www.cnblogs.com/a1120139442/p/11657094.html