zoukankan      html  css  js  c++  java
  • 递归下降分析实验报告

    实验四:语法分析实验

    一、    实验目的

     编制一个递归下降分析程序。

    E→TE'

    E'→(+T|-T)E'|ε

    T→FT'

    T'→(*F|/F)T'|ε

    F→(E)|i

    二、    实验内容和要求

    输入:算术表达式;

    判断:每遇到一个终结符,则判断当前读入的单词符号是否与该终结符相匹配,若匹配,则继续读取下一个单词符号,若不匹配,则进行错误处理。

           每遇到一个非终结符,则调用相应的分析子程序

    三、实验方法、步骤及结果测试

    1.源程序名:递归下降分析.c

       可执行程序名:递归下降分析.exe

    #include<stdio.h>
    #include<string.h>
    void scaner();
    error();
    E();
    E1();
    T();
    T1();
    F();
    char character[80];//存放所有输入的字符
    char token[8];//单词自身字符串
    char ch;//单个字符
    int p,m=0,i,sum=0,syn;//sum:整型常数 row:记录新读入的字符行的行号,syn:单词种别码
    char *keywords[6]={"begin","if","then","while","do","end"};
    void main(){
    p=0;
    printf("请输入一串字符串:");
    do
    {
    ch=getchar();
    character[i++]=ch;
    }while(ch!='#');//输入以#号键结束
    p=0;
    do
    {
    scaner();//识别单词
    switch(syn)
    {
    case 11:printf("(%d,%d)\n",syn,sum);break;
    case -1: printf("(%s,#)\n",token);break;
    default:printf("(%d,%s)\n",syn,token);break;
    }
    }while(syn!=0);
    p=0;
    scaner();
    E();
    if(syn==0)
    printf("success!\n");
    else
    printf("failure!\n");
    }
    //词法分析程序
    void scaner()
    {
    for(i=0;i<8;i++)
    token[i]=NULL;
    ch=character[p++];
    while(ch==' ')
    {
    ch=character[p];
    p++;
    }
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))//标识符或者变量名
    {
    m=0;
    while((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
    {
    token[m++]=ch;
    ch=character[p++];
    }
    token[m++]='\0';
    p--;
    syn=10;
    for(i=0;i<6;i++) //将识别出来的字符和已定义的标示符作比较,
    if(strcmp(token,keywords[i])==0)
    {
    syn=i+1;
    break;
    }
    }
    else if((ch>='0'&&ch<='9'))//数字
    {
    sum=0;
    while((ch>='0'&&ch<='9'))
    {
    sum=sum*10+(ch-'0');
    ch=character[p++];

    }
    syn=11;
    p--;
    }
    else switch(ch)//其他字符
    {
    case'<':m=0;token[m++]=ch;
    ch=character[p++];
    if(ch=='=')
    {
    syn=21;
    token[m++]=ch;
    }
    else if(ch=='>')
    {
    syn=22;
    token[m++]=ch;
    }
    else
    {
    syn=23;
    p--;
    }
    break;
    case'>':m=0;token[m++]=ch;
    ch=character[p++];
    if(ch=='=')
    {
    syn=24;
    token[m++]=ch;
    }
    else
    {
    syn=20;
    p--;
    }
    break;
    case':':m=0;token[m++]=ch;
    ch=character[p++];
    if(ch=='=')
    {
    syn=18;
    token[m++]=ch;
    }
    else
    {
    syn=17;
    p--;
    }
    break;
    case'+':syn=13;token[0]=ch;break;
    case'-':syn=14;token[0]=ch;break;
    case'*':syn=15;token[0]=ch;break;
    case'/':syn=16;token[0]=ch;break;
    case'=':syn=25;token[0]=ch;break;
    case';':syn=26;token[0]=ch;break;
    case'(':syn=27;token[0]=ch;break;
    case')':syn=28;token[0]=ch;break;
    case'#':syn=0;token[0]=ch;break;
    default:syn=-1;break;

    }
    }
    error()
    {
    printf("(%d,%s)failure! \n",syn, token);
    }
    E()
    {
    T();
    E1();
    }
    E1()
    {
    if(syn==13||syn==14)
    {
    scaner();
    T();
    E1();
    }

    }
    T()
    {
    F();
    T1();
    }
    T1()
    {
    if(syn==15||syn==16)
    {
    scaner();
    F();
    T1();
    }else if(syn!=28 && syn!=0 && syn!=13 && syn!=14)
    error();

    }
    F()
    {
    if(syn==27)
    {
    scaner();
    E();
    if(syn==28)
    scaner();
    else error();
    }
    else if(syn==10||syn==11)
    scaner();
    }

  • 相关阅读:
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车按键启动和蜂鸣器报警
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车指定花式动作
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    ZYAR20A 亚克力2驱 蓝牙 298寻迹避障机器人 —— 小车前后左右综合实验
    asp中设置session过期时间方法总结
    asp中设置session过期时间方法总结
    ASP.NET关于Session_End触发与否的问题
  • 原文地址:https://www.cnblogs.com/dengjinxiu/p/6215119.html
Copyright © 2011-2022 走看看