资源简介
(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语言版视频教程之总
- stm32F103zet6开串口通信2 C语言
- 用C语言实现PLC和上位机的串行通信
- C语言编程透视
- C语言词法分析程序
- 北邮C++小学期坦克大战代码及报告
- 密码学:分组密码DES算法C语言版
- c语言用odbc连数据库.rar
- 数据结构—使用C语言第4版
- 基于winPcap开发嗅探器c++
- 数据结构与算法分析:C语言描述(原书
- 南邮《数据结构-C语言描述》陈慧南主
- 简易词法分析器——基于C语言
- C语言编写的乒乓球游戏
- C语言经典编程1000例+C语言深度解剖
- 十个游戏C语言源代码
- 学生管理系统C语言版
- 教你如何用Keil ,用c语言进行编程
- 数据结构基础(C语言版) 习题答案
- JPEG压缩的c语言实现
- 嵌入式linuxC语言程序设计基础教程
- C语言实用数字图像处理(日本的,看
- C++课程设计贪吃蛇源码+课设报告
- Cholesky MPI并行C语言实现
- ECOS求解器求解二阶锥问题C语言程序
- C语言小游戏217637
- MFC课程设计报告-手把手教你写贪吃蛇
- 银行排号系统设计 C语言实现
- DBMS课程设计C语言实现全部源码与设计
- C语言经典算法100例.pdf
评论
共有 条评论