• 大小: 2KB
    文件类型: .rar
    金币: 2
    下载: 1 次
    发布日期: 2022-09-20
  • 语言: C/C++
  • 标签:

资源简介

用C语言实现语法分析,有助于编译器的生成。

资源截图

代码片段和文件信息

#include“stdio.h“
#include“stdlib.h“
#include“string.h“

struct tablestruct
{
char name[10];
char kind[10];
    char val[14];
int level;
int adr;
int size;
};

char *getsym(FILE*);
void constdeclaration(tablestruct*int*FILE*FILE*char*);
void vardeclaration(tablestruct*int*int*int*FILE*FILE*char*int*int);
void statement(FILE*FILE*char*);
void expression(FILE*FILE*char*);
void term(FILE*FILE*char*);
void factor(FILE*FILE*char*);
void condition(FILE*FILE*char*);

void main()
{   
tablestruct table[100];
    FILE *fp1*fp2;
    char filename1[10]filename2[10];
char sym[10];
int j=0lev=0dx=3;
int s=0procx=0;

printf(“请输入pl/0单词流文件名:\t“);
scanf(“%s“filename1);
getchar();
printf(“\n“);
    printf(“请输入语法分析结果要存储到的文件名:\t“);
scanf(“%s“filename2);
getchar();
printf(“\n\n“);

printf(“语法分析结果为:“);
printf(“\n“);

    //*打开文件,分别以写方式和读方式*//
    fp2=fopen(filename2“w“);
if((fp1=fopen(filename1“r“))==NULL)
{
printf(“Cannot open file!“);
exit(0);
}

strcpy(symgetsym(fp1));                            //获取一个单词
while(!feof(fp1))
{

if(!strcmp(sym“constsym“))                                    //常量声明
{
strcpy(symgetsym(fp1));
do{
constdeclaration(table&jfp1fp2sym);
while(!strcmp(sym“comma“))
{
    strcpy(symgetsym(fp1));
    constdeclaration(table&jfp1fp2sym);
}
if(!strcmp(sym“semicolon“))
{
        strcpy(symgetsym(fp1));
}
else 
{
printf(“漏掉了逗号或分号!“);
}
}while(!strcmp(sym“ident“));
}

else if(!strcmp(sym“procsym“))                              //程序体
{
    strcpy(symgetsym(fp1));
if(!strcmp(sym“ident“))
{
        strcpy(symgetsym(fp1));
strcpy(table[j].namesym);
         strcpy(table[j].kind“procedure“);
         table[j].level=lev;
                dx=3;
procx=j;
                table[procx].size=s;

    strcpy(symgetsym(fp1));
}
else
{
printf(“procedure后应该是标识符“);
}
if(!strcmp(sym“semicolon“))
{
    strcpy(symgetsym(fp1));
}
else
{
printf(“漏掉了分号“);
}
         j++;
lev++;
}
        else if(!strcmp(sym“varsym“))                                        //变量声明
{
    strcpy(symgetsym(fp1));
do{
vardeclaration(table&j&lev&dxfp1fp2sym&sprocx);
while(!strcmp(sym“comma“))
{
         strcpy(symgetsym(fp1));
   vardeclaration(table&j&lev &dxfp1fp2sym&sprocx);
}
if(!strcmp(sym“semicolon“))
{
        strcpy(symgetsym(fp1));
}
else 
{
printf(“漏掉了逗号或分号!“);
}
}while(!strcmp(sym“ident“));
}
else if(!strcmp(sym“ident“)||!strcmp(sym“callsym“)||!strcmp(sym“beginsym“)      //语句处理
    ||!strcmp(sym“ifsym“)||!strcmp(sym“whilesym“)||!strcmp(sym“readsym“)
||!strcmp(sym“writesym“)) 
{
     statement(fp1fp2sym);
}
else
{
if(

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       9850  2011-06-03 11:09  语法分析.cpp

----------- ---------  ---------- -----  ----

                 9850                    1


评论

共有 条评论

相关资源