递归下降语法分析器

实验三.递归下降语法分析程序

专业 商业软件工程   姓名 陈广鹏  学号201506110167

一、        实验目的

 

  通过设计、编制、调试递归下降语法分析程序,对输入的符号串进行分析匹
配,观察输入符号串是否为给定文法的句子。

二、        实验内容和要求

递归下降分析法是一种自顶向下的分析方法,文法的每个非终结符对应一个递归过程(函数)。分析过程就是从文法开始符出发执行一组递归过程(函数),
这样向下推导直到推出句子;或者说从根节点出发,自顶向下为输入串寻找一个最左匹配序列,建立一棵语法树。
  在不含左递归和每个非终结符的所有候选终结首字符集都两两不相交条件下,我们就可能构造出一个不带回溯的自顶向下的分析程序,这个分析程序是由
一组递归过程(或函数)组成的,每个过程(或函数)对应文法的而一个非终结
符。这样的一个分析程序称为递归下降分析器。

(1)输入一以#结束的符号串(包括+—*/()i#):在此位置输入符号串例如:i+i*i#

(2)输出结果:i+i*i#为合法符号串

(3)输入一符号串如i+i*#,要求输出为“非法的符号串”。

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

 

  1. 1.      源程序名:digui.cpp
  1. 2.      原理分析及流程图

递归下降分析程序实现思想简单易懂。程序结构和语法产生式有直接的对应关系。因为每个过程表示一个非终结符号的处理,添加语义加工工作比较方便。

递归下降分析程序的实现思想是:识别程序由一组子程序组成。每个子程序对应于一个非终结符号。

每一个子程序的功能是:选择正确的右部,扫描完相应的字。在右部中有非终结符号时,调用该非终结符号对应的子程序来完成。

自上向下分析过程中,如果带回溯,则分析过程是穷举所有可能的推导,看是否能推导出待检查的符号串。分析速度慢。而无回溯的自上向下分析技术,当选择某非终结符的产生时,可根据输入串的当前符号以及各产生式右部首符号而进行,效率高,且不易出错。

无回溯的自上向下分析技术可用的先决条件是:无左递归和无回溯。

无左递归:既没有直接左递归,也没有间接左递归。

无回溯:对于任一非终结符号U的产生式右部x1|x2|…|xn,其对应的字的首终结符号两两不相交。

如果一个文法不含回路(形如P?+ P的推导),也不含以ε为右部的产生式,那么可以通过执行消除文法左递归的算法消除文法的一切左递归(改写后的文法可能含有以ε为右部的产生式)。

  1. 3.      主要程序段及其解释:
#include<stdio.h>
#include<string>
char str[50];
int index=0;
void E();                //E->TX;
void X();                //X->+TX | e
void T();                //T->FY
void Y();                //Y->*FY | e
void F();                //F->(E) | i 

int main()                /*递归分析*/
{
    int len;
    int m;
    printf("请输入要测试的次数:");
    scanf("%d",&m);
    while(m--)
    {
        printf("请输入字符串(长度<50>):\n");
        scanf("%s",str);
        len=strlen(str);
        //str[len]=‘#‘;
        str[len+1]=‘\0‘;
        E();
        printf("%s为合法符号串!\n",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("\n非法的符号串!\n");
            exit (0);
        }     }
    else
    {
        printf("非法的符号串!\n");
        exit(0);
    }
}
  1. 4.      运行结果及分析

 

 

 

 

 

四、        实验总结

通过本次实验对递归下降词法分析器的结构,过程有了更进一步的了解,通过学习书本和试验原理书上的内容,对它的工作原理,具体实行步骤有了进一步的掌握,由于本次试验是测试性试验,所以要求输出的结果是成功与否,输入一个句型,进过分析,判断它是否合法,主要内容在于其判断过程中。本次试验不光提高了自己的编程能力,同时提高了对递归下降的了解。

 

时间: 2024-10-24 10:33:14

递归下降语法分析器的相关文章

编译原理 - 实验三 - 递归下降语法分析器的调试及扩展

一. 语法分析介绍 语法分析是编译过程的核心部分,它的主要任务是按照程序语言的语法规则,从由词法分析输出的源程序符号串中识别出各类语法成分,同时进行语法检查,为语义分析和代码生成做准备.执行语法分析任务的程序叫语法分析程序或语法分析器. 二. 所实现的语义分析和代码生成程序能处理什么语句 (1)简单变量的声明语句 (2)表达式语句 (3)if语句. (4)while语句 (5)for语句 (6)write语句 (7)read语句 (8)do语句. (9)处理过程调用和返回 三.实验过程 ①用VC

Atitit 表达式原理 语法分析&#160;原理与实践 解析java的dsl &#160;递归下降是现阶段主流的语法分析方法

Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析方法2 递归下降是现阶段主流的语法分析方法,2 于是我们可以把上面的语法改写成如下形式: 1)       Operator="+" | "-" | "*" | "/" 2)       Expression=<数字>

【龙书笔记】用Python实现一个简单数学表达式从中缀到后缀语法的翻译器(采用递归下降分析法)

上篇笔记介绍了语法分析相关的一些基础概念,本篇笔记根据龙书第2.5节的内容实现一个针对简单表达式的后缀式语法翻译器Demo. 备注:原书中的demo是java实例,我给出的将是逻辑一致的Python版本的实现. 在简单后缀翻译器代码实现之前,还需要介绍几个基本概念. 1. 自顶向下分析法(top-down parsing) 顾名思义,top-down分析法的思路是推导产生式时,以产生式开始符号作为root节点,从上至下依次构建其子节点,最终构造出语法分析树.在具体实现时,它会把输入字符串从左到右

构造可配置词法语法分析器生成器(下)

本文为笔者原创,转载请注明出处 http://blog.csdn.net/xinghongduo mylex & xparser mylex & xparser是笔者实现的类似于Lex和Yacc的词法语法分析器生成器,它接受正则表达式定义的词法规则和BNF定义的语法规则,自动构造对应的以C为宿主语言的词法分析器源程序mylex.h, mylex.c和语法分析器源程序xparser.h, xparser.c. mylex & xparser特点如下: 轻量无依赖:构造器的主要代码仅2

构造可配置词法语法分析器生成器(中)

本文为笔者原创,转载请注明出处 http://blog.csdn.net/xinghongduo   语法分析器 语法分析器(grammar parser)是编译器的核心部分之一,它的作用是检测词法分析器返回的token序列是否符合文法定义的规则.一个完整的语法分析器除了检测语法正确性外还要包含对出错的处理以及错误恢复等功能. 文法和文法类型 文法是定义一个语言的所有规则的集合,形式上定义为四元组G={VT,VN,S,P},其中: VT是非空有限符号集合,它的每个符号称为终结符,文法产生的语言由

递归下降来求解中缀或者后缀或者前缀表达式

  学习数据结构的时候学到栈的时候都会学习使用栈来实现求解中缀表达式,思路就是扫描一遍,数字输出,符号根据优先级决定入栈和出栈的时间,然后生成后缀表达式,对后缀表达式的求解是容易的,直接扫描一遍,遇到数字入栈,遇到操作符就直接取栈顶的两个元素做运算. 好久之前实现上面所说的程序是第一个感受"编译"的感觉,感觉很爽,因此一直想学一下真正的编译原理,龙书比较深奥,一直未得其奥义.这两天阅读了vczh大大的系列文章 <手写语法分析器>.<正则表达式引擎>等文章,颇有感

实验三、 递归下降分析程序实验

一.        实验目的     练习构造递归下降语法分析程序的方法,熟悉上下文无关文法的使用,加深对课堂教学的理解:提高语法分析方法的实践能力 二.        实验内容和要求 对于给定的文法G[E]               E->TE'              E'->+TE' | ε             T->FT'             T'->*F T'| ε             F->(E) | i 采用递归下降语法分析法编写语法分析程序,该

203-陈冠权-递归下降分析

递归下降分析: 对于给定的文法G[E] : E→E+T|E-T|T T→T*F| T/F|F F→(E)|i 消除左递归后的文法是: E→TE' E'→+TE'|-TE'|∑ T→FT' T'→*FT'|/FT'|∑ F→(E)|i 是否是LL(1)文法? select(E→TE')=first(TE')={(,i} select(E'→+TE')=first(+TE')={+} select(E'→-TE')=first(-TE')={-} select(E'→∑)=follow(E')={)

递归下降分析程序报告

实验一.递归下降分析程序实验 专业 商业软件工程   姓名 姓名 学号 201506110148 一.        实验目的   编译递归下降分析程序识别c语言文法 二.        实验内容和要求 简单写出c语言文法 分析c语言文法是否为LL1文法,若不是,修改成LL1文法. 编写程序实现对c语言LL1文法判断是否有语法错误 三.        实验方法.步骤及结果测试  1.      源程序名:递归下降分析程序 源程序名递归下降分析程序.c 可执行程序名:递归下降分析程序.exe 2.