语法分析

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文档链接  源码

实验目的及实验环境

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

分析表的数据结构

/* ==================================================================
 * 下面是分析表的结构
 * ================================================================== */
 /* 分析表中的一个节点类型 */
 #define SYNCH  1
 struct anat_node {
    
    struct node *row_add;   /* 产生式表中的第几条 */
    struct node *col_add;   /* 对应产生式中那的第几个 */
    unsigned char   err;    //
 };
 
 /* 分析表结构体 */
 struct ana_table {
    
    struct anat_node    *table;
    struct e_ne_signs   *signs;
 };
<p>/* ================================================================== */ </p><p><pre name="code" class="html"><span style="font-family: 'Times New Roman'; font-size: 12pt; background-color: rgb(255, 255, 255);">整个语法分析的函数调用关系图</span>

1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值