资源简介
(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个文件信息
相关资源
- 操作系统c语言模拟文件管理系统844
- C语言开发实战宝典
- C++中头文件与源文件的作用详解
- C语言代码高亮html输出工具
- 猜数字游戏 c语言代码
- C语言课程设计
- 数字电位器C语言程序
- CCS FFT c语言算法
- 使用C语言编写的病房管理系统
- 通信过程中的RS编译码程序(c语言)
- 计算机二级C语言上机填空,改错,编
- 用回溯法解决八皇后问题C语言实现
- 简易教务管理系统c语言开发文档
- 操作系统课设 读写者问题 c语言实现
- 小波变换算法 c语言版
- C流程图生成器,用C语言代码 生成C语
- 3des加密算法C语言实现
- 简单的C语言点对点聊天程序
- 单片机c语言源程序(51定时器 八个按
- 个人日常财务管理系统(C语言)
- c语言电子商务系统
- 小甲鱼C语言课件 源代码
- 将图片转换为C语言数组的程序
- C语言实现的一个内存泄漏检测程序
- DES加密算法C语言实现
- LINUX下命令行界面的C语言细胞游戏
- 用单片机控制蜂鸣器播放旋律程序(
- 学校超市选址问题(数据结构C语言版
- 电子时钟 有C语言程序,PROTEUS仿真图
- 尚观培训linux许巍老师关于c语言的课
评论
共有 条评论