资源简介
根据某一文法编制调试LL(1)分析程序,以便对任意输入的符号串进行分析。
代码片段和文件信息
/*LL(1)分析法源程序,只能在VC++中运行 */
#include
#include
#include
#include
char A[20]; /*分析栈*/
char B[20]; /*剩余串*/
char v1[20]={‘i‘‘+‘‘*‘‘(‘‘)‘‘#‘}; /*终结符 */
char v2[20]={‘E‘‘G‘‘T‘‘S‘‘F‘}; /*非终结符 */
int j=0b=0top=0l; /*L为输入串长度 */
typedef struct type /*产生式类型定义 */
{
char origin; /*大写字符 */
char array[5]; /*产生式右边字符 */
int length; /*字符个数 */
}type;
type etgg1ss1ff1; /*结构体变量 */
type C[10][10]; /*预测分析表 */
/*--------------------------------*/
/*输出分析栈 */
void print()
{
int a; /*指针*/
for(a=0;a<=top+1;a++)
printf(“%c“A[a]);
printf(“\t\t“);
}
/*--------------------------------*/
/*输出剩余串*/
void print1()
{
int j;
for(j=0;j printf(“ “);
for(j=b;j<=l;j++)
printf(“%c“B[j]);
printf(“\t\t\t“);
}
/*--------------------------------*/
void main()
{
int mnk=0flag=0finish=0;
char chx;
type cha;/*用来接受C[m][n]*/
/*把文法产生式赋值结构体*/
e.origin=‘E‘; strcpy(e.array“TG“); e.length=2;
t.origin=‘T‘; strcpy(t.array“FS“); t.length=2;
g.origin=‘G‘; strcpy(g.array“+TG“); g.length=3;
g1.origin=‘G‘; g1.array[0]=‘^‘; g1.length=1;
s.origin=‘S‘; strcpy(s.array“*FS“); s.length=3;
s1.origin=‘S‘; s1.array[0]=‘^‘; s1.length=1;
f.origin=‘F‘; strcpy(f.array“(E)“); f.length=3;
f1.origin=‘F‘; f1.array[0]=‘i‘; f1.length=1;
/*初始化分析表*/
for(m=0;m<=4;m++)
for(n=0;n<=5;n++)
C[m][n].origin=‘N‘;/*全部赋为空*/
/*填充分析表*/
C[0][0]=e; C[0][3]=e;
C[1][1]=g; C[1][4]=g1; C[1][5]=g1;
C[2][0]=t; C[2][3]=t;
C[3][1]=s1; C[3][2]=s; C[3][4]=C[3][5]=s1;
C[4][0]=f1; C[4][3]=f;
printf(“提示:本程序只能对由‘i‘‘+‘‘*‘‘(‘‘)‘构成的以‘#‘结束的字符串进行分析\n“);
printf(“请输入要分析的字符串:“);
do/*读入分析串*/
{
scanf(“%c“&ch);
if ((ch!=‘i‘) &&(ch!=‘+‘) &&(ch!=‘*‘)&&(ch!=‘(‘)&&(ch!=‘)‘)&&(ch!=‘#‘))
{
printf(“输入串中有非法字符\n“);
exit(1);
}
B[j]=ch;
j++;
}while(ch!=‘#‘);
l=j; /*分析串长度*/
ch=B[0]; /*当前分析字符*/
A[top]=‘#‘; A[++top]=‘E‘; /*‘#‘‘E‘进栈*/
printf(“步骤\t\t分析栈 \t\t剩余字符 \t\t所用产生式 \n“);
do
{
x=A[top--];/*x为当前栈顶字符*/
printf(“%d“k++);
printf(“\t\t“);
for(j=0;j<=5;j++)/*判断是否为终结符*/
if(x==v1[j])
{
flag=1;
break;
}
if(flag==1)/*如果是终结符*/
{
if(x==‘#‘)
{
finish=1; /*结束标记*/
printf(“acc!\n“); /*接受 */
getchar();
getchar();
exit(1);
}
if(x==ch)
{
print();
print1();
printf(“%c匹配\n“ch);
ch=B[++b]; /*下一个输入字符*/
flag=0; /*恢复标记*/
}
else
{ /*出错处理*/
print();
print1();
printf(“%c出错\n“ch);/*输出出错终结符*/
exit(1);
}
}
else
{ /*非终结符处理*/
for(j=0;j<=4;j++)
if(x==v2[j])
{
m=j; /* m: 分析表行号*/
break;
}
for(j=0;j<=5;j++)
if(ch==v1[j])
{
n=j; /*n: 分析表列号*/
break;
}
cha=C[m][n];
if(cha.origin!=‘N‘)/*判断是否为空*/
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 36352 2008-10-26 20:43 LL(1)分析\实验05-LL(1)分析.doc
文件 47 2008-10-05 19:47 LL(1)分析\t1-lower2Upper.lex
文件 57 2008-10-13 13:51 LL(1)分析\t2-printIdentifier.lex
文件 15 2008-10-13 15:46 LL(1)分析\t3-printEverything.lex
文件 113 2008-11-05 15:59 LL(1)分析\t4-dividedBy7.lex
文件 53248 2008-11-18 20:36 LL(1)分析\Debug\vc60.pdb
文件 12463 2008-11-18 20:36 LL(1)分析\Debug\3-LL1-v2.obj
文件 168003 2008-11-18 20:36 LL(1)分析\Debug\3-LL1-v2.exe
文件 427008 2008-11-18 20:36 LL(1)分析\Debug\3-LL1-v2.pdb
文件 41984 2008-11-18 20:37 LL(1)分析\3-LL1-v2.ncb
文件 744 2008-11-18 20:36 LL(1)分析\3-LL1-v2.plg
文件 3425 2008-11-18 20:13 LL(1)分析\3-LL1-v2.dsp
文件 3747 2008-11-18 20:35 LL(1)分析\3-LL1-v2.c
文件 48640 2008-11-18 20:37 LL(1)分析\3-LL1-v2.opt
文件 541 2008-11-18 20:37 LL(1)分析\3-LL1-v2.dsw
目录 0 2008-11-17 11:20 LL(1)分析\Debug
目录 0 2008-11-17 10:36 LL(1)分析
----------- --------- ---------- ----- ----
796387 17
- 上一篇:软件工程课程设计 超市管理需求分析
- 下一篇:学生选课管理系统数据库设计
相关资源
- 利用动态规划求木桩游戏
- 编译原理实验报告及源码,LR1 活前缀
- 编译原理 算符优先文法 实验报告 代
- 编译原理__语义分析_实验报告
- 语义分析代码
- 编译原理大作业 源码
- 编译原理pl\\0词法分析程序
- 编译原理实验2-LL1分析法实现
- 编译原理实验词法分析器、中间代码
- 编译原理课程设计--编译器
- 编译课设-词法分析,语法分析.zip
- 简易编译器,实现词法分析,语法分
- 编译原理 算符优先分析程序
- 编译原理-非递归预测实验-C代码实现
- 编译原理实验
- 编译原理自顶向下语法分析源代码+实
- 编译原理布尔表达式计算器
- LR语法分析器
- 编译原理语法制导翻译器 课程设计
- 编译原理——语法分析器
- 编译原理实验指导书
- 第四次上机—自下而上的语法分析
- 编译原理预测分析法语法分析程序
- 编译课程设计算数表达式转换成四元
- 广东工业大学编译原理试卷
- 编译原理词法分析器实验从文件读入
- 编译原理将简单程序翻译成四元式
- 《编译原理》实验 识别无符号数的词
- 编译原理语法分析器实验报告.doc版
- 在语法分析器的基础上构造的三地址
评论
共有 条评论