资源简介

(1)输入任意文法,消除左递归和公共左因子;   (2)打印文法的First和Follow集;   (3)判断是否是LL(1)文法,如果是则打印其分析表;   (4)输入一个句子,如果该句子合法则输出与句子对应的语法树;    能够输出分析过程中每一步符号栈的变化情况。    如果该句子非法则进行相应的报错处理。

资源截图

代码片段和文件信息

/*************************************************************************
> File Name: analyse_stack.c
> Author: zhanglp
> Mail: zhanglp92@gmail.com 
> Blog: http://blog.csdn.net/zhanglpql 
> Github: http://github.com/zhanglp92 
> Created Time: 2014年06月04日 星期三 22时55分33秒
 ************************************************************************/

#include 
#include 
#include 
#include 
#include 
#include 

static int push_stack (struct ana_stack *s const char *str)
{
    /* 扩展表的长度 */
    if (s->cnt >= s->size) {
        
        s->size = (s->size + 1) << 1;
        if ( NULL == (s->stack = realloc \
            (s->stack sizeof (struct node) * s->size + 1)) )
                return ALLOC_F;
    }
    memset (s->stack+s->cnt 0 sizeof (struct ne_sign) * (s->size - s->cnt));

    /* 入栈 */
    strncpy (s->stack[s->cnt].val str strlen (str));
    s->top = s->cnt++;

    return SUCCESS;
}

static void pop_stack (struct ana_stack *s)
{
    if (0 >= s->cnt) 
        return ;

    memset (s->stack[s->top].val 0 sizeof (struct ne_sign));
    s->top -= 1;
    s->cnt -= 1;
}

static void display (struct ana_stack s const char *str const char *note)
{
    #define MAX_LEN     30
    int     i t len = MAX_LEN;
    char    buf[NODE_MAX+1] = {0};

    for (i = 0; i < s.cnt; i++) {

        t = strlen (s.stack[i].val);
        snprintf (buf+MAX_LEN-len t+1 “%s“ s.stack[i].val);
        len -= t;
    }
    memset (buf+(MAX_LEN - len) ‘ ‘ len);
    printf (“| %s “ buf);

    memset (buf 0 MAX_LEN+1);
    t = strlen (str);
    memset (buf ‘ ‘ MAX_LEN - t);
    strncat (buf str t);
    printf (“|%s “ buf);

    printf (“| %s \n“ note);

    memset (buf ‘-‘ (MAX_LEN+2) * 2);
    printf (“ %s\n“ buf);
    #undef MAX_LEN
}

static const char* get_top (const struct ana_stack s)
{
    return 0 >= s.cnt ? NULL : s.stack[s.top].val;
}

static int add_node (struct tree_node **tree TYPE who const char *str);

/* 返回附注信息 */
static const char* analyse_str (struct ana_stack *s struct ana_table an char e int *pos struct tree_node **tree)
{
    /* 返回附注信息 */
    static char str[NODE_MAX];

    int index_t rs_t index_i rs_i;
    const char *top = get_top (*s);

    /* 栈为空的清况 */
    if (NULL == top) 
        return STACK_EMPTY;

    /* 栈顶和输入字符在分析表的位置 */
    rs_t = is_e_ne_sign (an top &index_t);
    char    ch[2] = {e 0}; /* 将字符变成字符串 */
    rs_i = is_e_ne_sign (an ch &index_i);

    /* 输入字符串有不能识别的字符 则跳过该字符 */ 
    if (ERROR == rs_i || NE_SIGN == rs_i) { 

        *pos += 1;
        return STR_ERROR;
    }

    /* 终结符匹配,成功则出栈 */ 
    else if (E_SIGN == rs_t) {

        if (index_t == index_i) { 

            *pos += 1; 
            pop_stack (s); 
#if 1
            /* 找到对应的栈顶元素 */
            while ( (*tree)->pre ) {

                if( (*tree)->bother ) {

                    *tree = (*tree)->bother;
                    break;
                } else *tree = (*tree)->pre;

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2014-06-18 12:45  语法分析\
     文件      536576  2014-06-18 12:34  语法分析\语法分析.doc
     目录           0  2014-06-18 12:12  语法分析\analyze-sentence\
     文件        1148  2014-06-05 12:53  语法分析\analyze-sentence\Makefile
     文件      102114  2014-06-18 07:09  语法分析\analyze-sentence\Doxyfile
     文件       50936  2014-06-18 12:12  语法分析\analyze-sentence\a.out
     目录           0  2014-06-18 11:10  语法分析\analyze-sentence\src\
     文件        2343  2014-06-05 15:20  语法分析\analyze-sentence\src\tools.c
     文件        6631  2014-06-04 11:31  语法分析\analyze-sentence\src\first_follow.c
     文件        2291  2014-06-04 10:32  语法分析\analyze-sentence\src\decide_LL1.c
     文件        8904  2014-06-05 15:32  语法分析\analyze-sentence\src\clean_recursion_L.c
     文件        3817  2014-06-04 11:32  语法分析\analyze-sentence\src\analyse_table.c
     文件       10463  2014-06-12 09:14  语法分析\analyze-sentence\src\analyse_stack.c
     文件        1744  2014-06-18 08:45  语法分析\analyze-sentence\src\sentence.c
     目录           0  2014-06-18 07:06  语法分析\analyze-sentence\sentence\
     文件          26  2014-06-04 11:15  语法分析\analyze-sentence\sentence\file4
     文件          58  2014-06-02 12:44  语法分析\analyze-sentence\sentence\file3
     文件          29  2014-06-04 11:15  语法分析\analyze-sentence\sentence\file2
     文件          24  2014-06-04 10:31  语法分析\analyze-sentence\sentence\file1
     目录           0  2014-06-12 09:14  语法分析\analyze-sentence\include\
     文件        1002  2014-06-05 11:03  语法分析\analyze-sentence\include\tools.h
     文件         574  2014-06-05 13:57  语法分析\analyze-sentence\include\sentence.h
     文件        2970  2014-06-09 15:36  语法分析\analyze-sentence\include\my_types.h
     文件        2601  2014-06-04 11:31  语法分析\analyze-sentence\include\first_follow.h
     文件         583  2014-06-04 10:24  语法分析\analyze-sentence\include\decide_LL1.h
     文件        2780  2014-06-04 11:27  语法分析\analyze-sentence\include\clean_recursion_L.h
     文件         672  2014-06-05 11:30  语法分析\analyze-sentence\include\analyse_table.h
     文件        1423  2014-06-12 09:14  语法分析\analyze-sentence\include\analyse_stack.h
     目录           0  2014-06-18 10:59  语法分析\analyze-sentence\doxy\
     目录           0  2014-06-18 07:53  语法分析\analyze-sentence\doxy\html_foot\
     目录           0  2014-06-18 07:47  语法分析\analyze-sentence\doxy\img\
............此处省略967个文件信息

评论

共有 条评论