语法分析

文档链接  源码

实验目的及实验环境

1)实验目的:熟悉语法分析的过程,编写代码实现判断LL(1)文法

并判断一个句子是否属于该文法。

2)实验环境:ubuntu14.04,使用的工具vim, gcc, gdb

 

实验内容

1)输入任意文法,消除左递归和公共左因子;

2)打印文法的FirstFollow;

3)判断是否是LL1)文法,如果是则打印其分析表;

4输入一个句子,如果该句子合法则输出与句子对应的语法树;

  能够输出分析过程中每一步符号栈的变化情况。

  如果该句子非法则进行相应的报错处理。

三.方案设计

重要的数据结构

产生式的数据结构

/* 表示一条产生式 */
struct productive {
  
    struct node *head;
    /* 表示产生式的长度,如上个产生式的长度是4 */
    unsigned    length;
};

文法的数据结构

/* 文法 */
struct sentence {
    
    struct productive   *prod;
    /* 产生式的实际长度 */
    unsigned    cnt;
    /* 产生式表的长度 */
    unsigned    size;
}

First 和 follow 集的数据结构

/* ==================================================================
 * 下面是非终结符的First follow 集合的数据结构
 * ================================================================== */
struct ff_node {
    
    /* 非终结符少的多,所以右移两位 */
    char    ne_sign[NODE_MAX>>2];
    char    first[NODE_MAX];
    char    follow[NODE_MAX];
    /* 分别用最低位,次低位表示first, follow 集合有没有求完(1完) */
    unsigned char   f;
};

struct nes_table {
    
    struct ff_node  *table;
    size_t  cnt;
    size_t  size;
};
/* ================================================================== */

分析表的数据结构

/* ==================================================================
 * 下面是分析表的结构
 * =======================================
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自上而下语法分析是编译原理中的一个重要概念,它是一种基于文法规则的语法分析方法,用于检查程序语法结构是否正确。下面是自上而下语法分析实验的相关内容: 实验题目:自上而下语法分析 实验目的:通过设计、编制、调试一个典型的自上而下语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。 实验内容:选择最有代表性的语法分析方法,如递归下降分析法、预测分析法;选择对各种常见程序语言都具备的语法结构,如赋值语句,特别是表达式,作为分析对象。 实验要求:编写PL/0语言的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析。 输入输出:输入PL/0程序的单词序列,输出语法分析结果。 设计思想:自上而下语法分析是一种基于文法规则的语法分析方法,它从文法的开始符号开始,逐步推导出整个程序的语法结构。在实现自上而下语法分析时,可以选择递归下降分析法或预测分析法。 算法流程:自上而下语法分析的算法流程包括以下几个步骤: 1. 从文法的开始符号开始,逐步推导出整个程序的语法结构。 2. 根据文法规则,编写递归下降分析程序或预测分析程序。 3. 对输入的单词序列进行语法分析,检查语法结构是否正确。 4. 如果语法结构正确,输出语法分析结果;否则,输出错误信息。 源程序:自上而下语法分析的源程序可以使用C、C++、Java等编程语言编写。 调试数据:自上而下语法分析的调试数据可以使用PL/0程序的单词序列作为输入数据,检查语法分析程序的正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值