• 大小: 107KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-09-11
  • 语言: 其他
  • 标签: 编译原理  c++  

资源简介

根据某一文法编制调试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


评论

共有 条评论