• 作业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

  • 相关阅读:
    内容绘制到Bitmap上不成功警示
    一些c++面试题目
    Windows Socket 主要API功能
    面试问题(一)
    函数指针与指针函数
    机器学习和数据挖掘的网站
    vs2010打开vs2008程序出现错误
    MATLAB将矩阵使用.txt文件格式保存
    指针实现值交换
    堆与栈的区别
  • 原文地址:https://www.cnblogs.com/a1120139442/p/11657094.html
Copyright © 2020-2023  润新知