语法分析

本文档详细介绍了如何进行语法分析,包括消除左递归、构造First和Follow集、判断LL(1)文法、生成分析表以及在C语言环境下实现分析栈和打印语法树的过程。实验旨在熟悉语法分析,并能对句子进行合法性判断和错误处理。
摘要由CSDN通过智能技术生成

文档链接  源码

实验目的及实验环境

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;
};
/* ================================================================== */

分析表的数据结构

/* ==================================================================
 * 下面是分析表的结构
 * =======================================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值