• 实验二 递归下降语法分析


    一、实验目的:

    利用C语言编制递归下降分析程序,并对简单语言进行语法分析。

    编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。

    二、实验原理

    每个非终结符都对应一个子程序。

    该子程序根据下一个输入符号(SELECT集)来确定按照哪一个产生式进行处理,再根据该产生式的右端:

    • 每遇到一个终结符,则判断当前读入的单词是否与该终结符相匹配,若匹配,再读取下一个单词继续分析;不匹配,则进行出错处理
    • 每遇到一个非终结符,则调用相应的子程序

    三、实验要求说明

    输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”,并指出语法错误的类型及位置。

    例如:

    输入begin a:=9;x:=2*3;b:=a+x end #

    输出success

    输入x:=a+b*c  end #

    输出‘end' error

    四、实验步骤

          1.待分析的语言的语法(参考P90)

          2.将其改为文法表示,至少包含

    –语句

    –条件

    –表达式

    3. 消除其左递归

    4. 提取公共左因子

    5. SELECT集计算

    6. LL(1)文法判断

    7. 递归下降分析程序

    代码如下:

    #include<stdio.h>    
    #include<string>
    char str[50];
    int index=0;
    void E();               
    void X();               
    void T();               
    void Y();               
    void F();               

    int main()               
    {
        int len;
        int m;
        printf("请输入要测试的次数:");
        scanf("%d",&m);
        while(m--)
        {
            printf("请输入字符串: ");
            scanf("%s",str);
            len=strlen(str);
            //str[len]='#';
            str[len+1]='';
            E();
            printf("%s为合法符号串! ",str);
            strcpy(str,"");
            index=0;
        } return 0;
    }

    void E()
    {    

      T();  

      X();}
    void X()
    {
        if(str[index]=='+')
        {     index++;
            T();
            X();
        } }
    void T()
    {    

    F();    

    Y(); }
    void Y()
    {     if(str[index]=='*') {
            index++;
            F();
            Y();
        } }
    void F()
    {
        if(str[index]=='i')
        {    index++; }
        else if (str[index]=='(')
        {
            index++;
            E();
            if(str[index]==')')
            {     index++; }else
            {
                printf("非法的符号串! ");
                exit (0);
            }     }
        else
        {
            printf("非法的符号串! ");
            exit(0);
        }
    }

     

    注:未完全实现所有功能

  • 相关阅读:
    dotnet OpenXML 解析 PPT 图表 面积图入门
    dotnet 读 WPF 源代码笔记 WPF 是如何做到一套代码兼容多个 .NET Framework 版本
    FileStream 的 FlushAsync 方法在 .NET Framework 与 .NET Core 行为的不同
    dotnet 开启 Fiddler 抓包将会让请求 HOST 头被更改
    查找算法find自定义数据类型
    算数仿函数相加
    查找算法adjacent_find相邻重复元素
    逻辑仿函数非
    关系仿函数大于
    查找算法find_if自定义数据类型
  • 原文地址:https://www.cnblogs.com/hongxinma/p/11951014.html
Copyright © 2020-2023  润新知