资源简介
LL(1)语法分析器的范例代码...实验内容及操作示范详见实验指导书...
内容简介:
1.如下为给定的LL(1)文法。 G[]: 1) ->program : begin end {program} 2) D->i D’ {i} 3) D’->, i D’ {,} 4) D’->ε {:} 5) S->s S’ {s} 6) S’-> s S’ { } 7) S’->ε {end} 8) T->real {real} 9) T->integer {integer} 其中右侧{}内为产生的可选集。
2.调试并完善如下给出的文法的LL(1)分析器示例程序,并设输入的文法的句子为: program i , i , i : integer begin s s s end 给出输出结果并进行分析说明。

代码片段和文件信息
#include “stdio.h“
#include “string.h“
#include “stdlib.h“
#include “conio.h“
typedef struct
{ int kind; /*kind值为0时,表示为非终结符,否则存储终结符的种别码*/
int entry; /*存储文法符号名的位置(即下标)*/
} tokentype; /*定义Token字类型,即文法符号类型*/
typedef struct
{ tokentype left; /*产生式的左部*/
tokentype right[20]; /*产生式的右部*/
int rightlen; /*产生式右部的长度*/
} ptype; /*产生式类型*/
typedef struct {
tokentype vn[30]; /*非终结符集*/
char vn_names[30][10]; /*存放各非终结符名称*/
tokentype vt[100]; /*存放终结符*/
char vt_names[30][20]; /*存放各终结符名称*/
ptype p[40]; /*存放产生式*/
int s; /*文法的开始符号*/
int vnlenvtlenplen; /*非终结符、终结符与产生式的个数*/
}gtype; /*文法类型*/
int isvt(tokentype token) /*判断token是否为终结符*/
{ return (token.kind!=0);}
int locatevn(gtype *G char name[])/*在文法G中查找给定面值为name的非终结符位置*/
{ int i;
for(i=1;i<=G->vnlen;i++)
if(strcmp(nameG->vn_names[i])==0) return i;
return 0;
}
int locatevt(gtype *g char name[]) /*查找面值为name的终结符位置*/
{ int i;
for(i=1;i<=g->vtlen;i++)
if(strcmp(nameg->vt_names[i])==0) return i;
return 0;
}
void InputG(gtype *G) /*文法的输入函数*/
{ int ijk;
int vt_tag;
char name[30];
printf(“\n Input the number of VN:“);
scanf(“%d“&(G->vnlen));
for(i=1;i<=G->vnlen;i++) /*输入非终结符*/
{ printf(“Input %dth VN:“i);
scanf(“%s“G->vn_names[i]);
G->vn[i].kind=0;G->vn[i].entry=i;
}
printf(“\nInput the number of Vt:“);
scanf(“%d“&(G->vtlen));
for(i=1;i<=G->vtlen;i++)/*注释A:输入终结符*/
{ printf(“Input %dth Vt:“i);
scanf(“%s“G->vt_names[i]);
G->vt[i].kind=i; /*终结符的种别码按输入顺序编号*/
G->vt[i].entry=i;
}
G->vt[++G->vtlen].kind=-1; G->vt[G->vtlen].entry=G->vtlen;
strcpy(G->vt_names[G->vtlen]“#“); /*增加结束标识#,种别码为-1*/
printf(“\n Input the number of P:“);
scanf(“%d“&(G->plen));
for(i=1;i<=G->plen;i++) /*输入产生式*/
{ printf(“Input %dth P:\n“i);
printf(“Input Left:“);
scanf(“%s“ name);
k=locatevn(Gname);
if (k) G->p[i].left=G->vn[k];
else { printf(“ Wrong!!! %s is not a right Vn. \n“name);exit(0);}
printf(“Input right len:“);
scanf(“%d“&(G->p[i].rightlen));
for(j=0;jp[i].rightlen;j++)
{ printf(“ Input %dth symbol\n“j+1);
printf(“ Is vt---1(Yes)0(No):“); scanf(“%d“&vt_tag);
printf(“ name:“); scanf(“%s“ name);
if(vt_tag)
{ k=locatevt(G name);
if(k) G->p[i].right[j]=G->vt[k];
else { printf(“ Wrong!!! %s is not a right Vt. \n“name);exit(0);}
}
else { k=locatevn(Gname);
if (k) G->p[i].right[j]=G->vn[k];
else { printf(“ Wrong!!! %s is not a right Vn. \n“name);exit(0);}
}
}
}
printf(“input start symbol:“);
scanf(“%s“name);
k=locatevn(Gname);
if (k) G->s=k;
else { printf(“ Wrong!!! %s is not a right Vn. \n“name);exit(0);}
}
void OutputG(gtype *G) /*输出文法*/
{ int ij;
printf(“G->Vn:\n“);
for(i=1;i<=G->vnlen;i++)
printf(“\t %s\n“G->vn_names[i]);
getch();
printf(“G->Vt:\n“);
f
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 176202 2001-01-15 02:38 LL (1) parser\Debug\text3.exe
文件 216552 2001-01-15 02:38 LL (1) parser\Debug\text3.ilk
文件 18624 2001-01-15 02:38 LL (1) parser\Debug\text3.obj
文件 213628 2001-01-15 01:14 LL (1) parser\Debug\text3.pch
文件 476160 2001-01-15 02:38 LL (1) parser\Debug\text3.pdb
文件 33792 2001-01-15 02:38 LL (1) parser\Debug\vc60.idb
文件 53248 2001-01-15 02:38 LL (1) parser\Debug\vc60.pdb
文件 8836 2001-01-15 02:17 LL (1) parser\g1.dat
文件 12000 2001-01-15 02:26 LL (1) parser\LL1.dat
文件 5715 2001-01-15 02:38 LL (1) parser\text3-1.txt
文件 5717 2001-01-15 02:39 LL (1) parser\text3-2.txt
文件 5717 2001-01-15 02:38 LL (1) parser\text3.cpp
文件 3389 2001-01-15 01:14 LL (1) parser\text3.dsp
文件 535 2001-01-15 02:39 LL (1) parser\text3.dsw
文件 33792 2001-01-15 02:39 LL (1) parser\text3.ncb
文件 48640 2001-01-15 02:39 LL (1) parser\text3.opt
文件 1123 2001-01-15 02:38 LL (1) parser\text3.plg
目录 0 2001-01-15 01:14 LL (1) parser\Debug
目录 0 2001-01-15 01:13 LL (1) parser
----------- --------- ---------- ----- ----
1313670 19
- 上一篇:基于离散分数余弦变换的图像加密算法研究
- 下一篇:湖北大学计算机网络期末试题和重点
相关资源
- 编译原理实验工具及参考源码(lex&
- 类pascal语言编译器(编译原理实验)
- 编译原理课程设计:词法语法编译器
- 中科院 编译原理 习题及解答
- 编译原理四元式和逆波兰式
- 《编译原理》清华大学版中的pl0扩充
- PL/0功能扩充break功能
- 编译原理LR(0)语法分析
- 编译原理中间代码生成程序
- 编译原理:LR分析程序
- 编译原理实验:词法分析,语法分析
- 吉林大学编译原理课件
- 编译原理龙书答案
- 编译原理 第三章课后习题答案
- 易语言变量和数组的编译原理
- 编译原理语法分析器、词法分析器
- 山东大学编译原理PL/0语言 compiler实验
- FOR循环语句的翻译程序设计简单优先
- NFA的确定化NFA->DFA完整可运行代码
- 哈工大威海编译原理实验报告和源代
- 哈工大威海-编译原理实验报告和源码
- 编译原理课设c编译器
- 赋值语句翻译四元式
- 河北工业大学编译原理实验代码及实
- 编译原理课程设计 while do循环语句翻
- 编译原理课程设计do——while简单优先
- 南开大学编译原理课件及作业
- 华工往年编译原理试卷
- 编译原理课程设计for循环LR法三元式
- 哈工程-编译原理课程设计(2016级)
评论
共有 条评论