简单的递归下降语法分析程序

简单递归分析程序

在这里插入图片描述
其代码如下:

#include<stdio.h>
#include<string.h>
int syn;
void yucu();//语句串分析程序
void statement();//语句分析
void expression();//表达式分析
void item();//项分析
void factor();//因子分析
char token[1000];//存储字符串
void scanner();//扫描函数
char ch;
int p;
char prog[1000];
int i;
char table[7][10] = { "","begin","if","then","while","do","end" };
int kk;
int main(void) {
    p = 0;
    printf("\nplease input string :\n");
    do {
        ch = getchar();
        prog[p++] = ch;
    } while (ch != '#');
    p = 0;
    scanner();
    if (syn == 1)
    {
        scanner();
        yucu();
        if (syn == 6) {
            if (!kk) {
                printf("success");
            }
        }
    }
    else {
        printf("应该输入'begin'error");
    }
    return 0;
}
void yucu() {
    statement();
    while (syn == 26) {//分号
        scanner();
        statement();
    }
    return;
}

void statement()//语句分析函数
{
    if (syn == 10) {//标识符
        scanner();
        if (syn == 18)//赋值
        {
            scanner();
            expression();
        }
        else {
            printf("赋值号错误error");
            kk = 1;
        }
    }
    else {
        kk = 1; printf("语句错误error");
    }
    return;
}

void expression() {//表达式分析函数
    item();
    while(syn == 13 || syn == 14) {
        scanner();
        item();
    }
    return;
}
void item()//项函数
{
    factor();
    while (syn == 15 || syn == 16)
    {
        scanner();
        factor();
    }
    return;
}
void factor()//因子函数
{
    if (syn == 10 || syn == 11) {
        scanner();
    }
    else if (syn == 27) {
        scanner();
        expression();
        if (syn == 28) {
            scanner();
        }
        else {
            printf("缺少'('error");
        }
    }
}
void scanner() {
    ch = prog[p++];
    while (ch == ' ') {
        ch = prog[p++];
    }
    if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' ) {
        int i = 0;
        while (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' || ch >= '0' && ch <= '9') {
            token[i++] = ch;
            ch = prog[p++];
        }
        p--;//由于最后一个字符不会被接纳,需要往前返回一个字符
        token[i] = '\0';
        for (i = 1; i <= 6; i++)
        {
            if (strcmp(token, table[i]) == 0)
            {
                syn = i;
                break;
            }
        }
        if (i > 6)syn = 10;//如果没有匹配,说明就不是关键字
    }
    else if (ch <= '9' && ch >= '0') {
        i = 0;
        while (ch <= '9' && ch >= '0')
        {
            token[i++] = ch + 48;//将数字转化成对应字符存储在数组中
            ch = prog[p++];
        }
        p--;//由于最后一个字符不会被接纳,需要往前返回一个字符
        token[i] = '\0';
        syn = 11;
    }
    else {
        i = 0;
        token[i++] = ch;
        char ch1;
        switch (ch)
        {
        case '+':
            syn = 13;
            break;
        case '-':
            syn = 14;
            break;
        case '*':
            syn = 15;
            break;
        case '/':
            syn = 16;
            break;
        case ':':
            ch1 = prog[p];//尝试判断下一个字符
            if (ch1 == '=')
            {
                token[i++] = ch1;
                p++;//成功就得将缓冲区字符前进一个字符
                syn = 18;
            }
            else
                syn = 17;
            break;
        case '<':
            ch1 = prog[p];
            if (ch1 == '=')
            {
                syn = 22;
                p++;
                token[i++] = ch1;
            }
            else if (ch1 == '>')
            {
                syn = 21;
                p++;
                token[i++] = ch1;
            }
            else
                syn = 20;
            break;
        case '>':
            ch1 = prog[p];
            if (ch1 == '=')
            {
                syn = 24;
                p++;
                token[i++] = ch1;
            }
            else
                syn = 23;
            break;
        case '=':
            syn = 25;
            break;
        case ';':
            syn = 26;
            break;
        case '(':
            syn = 27;
            break;
        case ')':
            syn = 28;
            break;
        case '#':
            syn = 0;
            break;
        default:
            syn = -1;
            break;

        }
        token[i] = '\0';
    }
}

其结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Q.E.D

递归下降分析法 一、实验目的: 根据某一文法编制调试递归下降分析程序,以便对任意输入的符号串进行分析。本次实验的目的主要是加深对递归下降分析法的理解。 二、实验说明 1、递归下降分析法的功能 词法分析器的功能是利用函数之间的递归调用模拟语法树自上而下的构造过程。 2、递归下降分析法的前提 改造文法:消除二义性、消除左递归、提取左因子,判断是否为LL(1)文法, 3、递归下降分析法实验设计思想及算法 为G的每个非终结符号U构造一个递归过程,不妨命名为U。 U的产生式的右边指出这个过程的代码结构: (1)若是终结符号,则和向前看符号对照, 若匹配则向前进一个符号;否则出错。 (2)若是非终结符号,则调用与此非终结符对应的过程。当A的右部有多个产生式时,可用选择结构实现。 三、实验要求 (一)准备: 1.阅读课本有关章节, 2.考虑好设计方案; 3.设计出模块结构、测试数据,初步编制好程序。 (二)上课上机: 将源代码拷贝到机上调试,发现错误,再修改完善。第二次上机调试通过。 (三)程序要求: 程序输入/输出示例: 对下列文法,用递归下降分析法对任意输入的符号串进行分析: (1)E->eBaA (2)A->a|bAcB (3)B->dEd|aC (4)C->e|dc 输出的格式如下: (1)递归下降分析程序,编制人:姓名,学号,班级 (2)输入一以#结束的符号串:在此位置输入符号串例如:eadeaa# (3)输出结果:eadeaa#为合法符号串 注意: 1.如果遇到错误的表达式,应输出错误提示信息(该信息越详细越好); 2.对学有余力的同学,可以详细的输出推导的过程,即详细列出每一步使用的产生式。 (四)程序思路 0.定义部分:定义常量、变量、数据结构。 1.初始化:从文件将输入符号串输入到字符缓冲区中。 2.利用递归下降分析法分析,对每个非终结符编写函数,在主函数中调用文法开始符号的函数。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值