资源简介
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
- 上一篇:基于离散分数余弦变换的图像加密算法研究
- 下一篇:湖北大学计算机网络期末试题和重点
相关资源
- PL0词法语法分析器225358
- 编译原理中VC实现语法分析器
- 语法分析器 算符优先 编译原理实验
- 算符优先分析算法的设计与实现 编译
- 编译原理课设——算符优先分析程序
- 编译原理课程设计计软张芃教小子集
- 实验二 实现一门语言的词法分析器
- 编译原理课程设计报告_算符优先分析
- 编译原理 语法分析、语义分析综合实
- 编译原理SLR1分析
- 哈工大软件学院编译原理语法分析源
- 基于Pascal语言的语法分析器
- 2013集美大学编译原理部分考试题目
- Maxwell15 16官方教程
- 编译原理词法、语法、语义分析器
- 编译原理词法分析程序代码
- 湖南农大-编译原理2010期末考试试卷
- 编译原理实验 语义分析与中间代码
- 编译原理 语法分析器
- 编译原理目标代码
- 无符号数的词法分析程序
- 编译原理实验代码四则表达式编译及
- 西安电子科技大学编译原理大作业C
- 河北工业大学编译原理实验
- 编译原理课程设计——编译器
- 递归下降分析法的实现
- 词法分析器含代码及实验报告
- 编译原理课程设计含报告,源程序和
- 语义分析实验报告 经典
- 西安电子科技大学编译原理大作业代
评论
共有 条评论