• 大小: 186KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-07-22
  • 语言: 其他
  • 标签: 编译原理  LL1  

资源简介

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


评论

共有 条评论