• 大小: 2KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2022-02-02
  • 语言: C/C++
  • 标签:

资源简介

编译原理——词法分析器设计与实现,而且完整项目,可运行 针对于pascal语言,也可针对于c语言,只需要更改好关键字保留字

资源截图

代码片段和文件信息

#include
#include
#include
#include
#include

int i row = 0 line = 0;
char a[1000];  //程序
int number[1000][100];  //常数表
char mark[100][5];   //标识符表

//词法分析
int wordanalysis()
{
    if ((a[i] >= ‘A‘&&a[i] <= ‘Z‘)||(a[i]>=‘a‘&&a[i]<=‘z‘))  //分析标识符和保留字
    {
        char word[10];
        char pro[100][100] = { “PROGRAM“ “BEGIN“ “END“ “VAR“ “INTEGER“ “WHILE“ “IF“ “THEN“ “ELSE“ “DO“ “PROCEDURE“ 
                                “char““int““if““else““var“ “return““break““do““while““for““double““float““short“}; //保留字表

        int n = 0;
        word[n++] = a[i++];
        //若字符为A~Z或0~9,则继续读取
        while ((a[i] >= ‘A‘&&a[i] <= ‘Z‘) || (a[i] >= ‘0‘ && a[i] <= ‘9‘)||(a[i]>=‘a‘&&a[i]<=‘z‘))
        {
            word[n++] = a[i++];
        }
        word[n] = ‘\0‘;
        i--;

        //判断该标识符是否为保留字
        for (n = 0; n < 100; n++)
        {
            if (strcmp(word pro[n]) == 0)
            {
                printf(“%s\t(%d-) 保留字\n“ pro[n] n + 1);
                return 3;
            }
        }

        //判断标识符长度是否超出规定
        if (strlen(word)>10)
        {
            printf(“%s\t Lexical analyzer read Unlawful identifier“word);
            return 0;
        }

        //判断该标识符是否存在标识符表中
        int m = 0;
        if (line != 0)
        {
            int q = 0;
            while (q            {
                if (strcmp(word mark[q++]) == 0)
                {
                    printf(“%s\t(12%d) 标识符\n“ word q);
                    return 3;
                }
            }

        }

        //将该标识符保存到标识符表中
        strcpy(mark[line] word);

        printf(“%s\t(12 %d) 标识符\n“ word line + 1);
        line++;
        return 3;

    }

    else if (a[i] >= ‘0‘ && a[i] <= ‘9‘)  //分析常数
    {
        char x[100];
        int n = 0 sum;
        x[n++] = a[i++];
     //判断字符是否是0~9
        while (a[i] >= ‘0‘ && a[i] <= ‘9‘)
        {
            x[n++] = a[i++];
        }
        x[n] = ‘\0‘;
        i--;
        int num = atoi(x); //将字符串转换成int型

        //判断该常数是否存在于常数表中
        if (row != 0)
        {   
            int y; 
            for (y = 0; y < 1000; y++)
            {
                int w = number[y][0];
                sum = 0;
                int d;
                for (d = 1; d <= number[y][0]; d++)
                {
                    w = w - 1;
                    sum = sum + number[y][d] * pow(2 w);
                }
                if (num == sum)
                {
                    printf(“%d\t(13%d)\n“ num y + 1);
                    return 3;
                }
            }
        }
        int z = num c = num;
        int m = 0;
        do        //计算是几位二进制数
        {
            z = z / 2;
            m++;
        } while (z != 0);

        for (n = m; n > 0; n--)  //将二进制保存于常数表中
        {
            number[row][n] = 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件        6855  2018-04-30 11:44  主程序(改为cpp).cpp
     文件          46  2018-04-30 11:45  使用说明.txt

评论

共有 条评论