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();
    }

  • 相关阅读:
    MVC3、如何应用EntityFramework 连接MySql 数据库 Kevin
    DEV EXPRESS Summary Footer 不显示 Kevin
    装饰模式 Kevin
    Dev 控件 GridControl 控件 二次绑定数据源的问题。 Kevin
    System.InvalidOperationException 异常 Kevin
    LINQ to XML Kevin
    代理模式——代码版“吊丝的故事” Kevin
    VS2012 中的设备 面板 Kevin
    maven 学习笔记(三)创建一个较复杂的 eclipse+android+maven 工程
    maven 学习笔记(一)eclipse+android+maven
  • 原文地址:https://www.cnblogs.com/dengjinxiu/p/6215119.html
Copyright © 2011-2022 走看看