• 大小: 71KB
    文件类型: .zip
    金币: 2
    下载: 1 次
    发布日期: 2021-08-13
  • 语言: C/C++
  • 标签:

资源简介

对类似于C++的程序进行词法分析,使用LR分析表进行语法分析

资源截图

代码片段和文件信息

/****************************************************/
/*              pas.c                               */
/*          高级语言到四元式                        */
/****************************************************/


#include  “cplr.h“
char chars;
/****************从文件读一行到缓冲区***********************************/
void readline()
{
char ch1;
pline=line;
ch1=getc(cfile);
printf(“\t\t|\t“);
while (ch1!=‘\n‘)
{
////////////////////////////////////////////////////////////////////////////
//my_delay(50);
printf(“%c“ch1);
///////////////////////////////////////////////////////////////////////////////
*pline=ch1;
pline++;
ch1=getc(cfile);//取下一个字符
if(ch1==EOF)
{
chars=ch1;
break;
}
}
*pline=‘\0‘;
pline=line;
printf(“\n“);
}
/*********************************从缓冲区读一个字符************************/
void readch()
{
if (ch==‘\0‘)
{
readline();
lnum++;
}
ch=*pline;
pline++;

}
/****************标志符和关键字的识别************************************/
int find(char spel[])
{
int ss1=0;
int ii=0;
while((ss1==0)&&(ii {
if (!strcmp(spelntab1[ii])) ss1=1;
ii++;
}
if (ss1==1) return ii-1;
else return -1;
}
void identifier()
{
int iii=0jk;
int ss=0;
k=0;
do
{
spelling[k]=ch;
k++;
readch();
}while(((ch>=‘a‘)&&(ch<=‘z‘))||((ch>=‘0‘)&&(ch<=‘9‘)));
pline--;
spelling[k]=‘\0‘;
while((ss==0)&&(iii {
if (!strcmp(spellingreswords[iii].sp)) ss=1;
iii++;
}
/*关键字匹配*/
if(ss==1)
{
buf[count].sy1=reswords[iii-1].sy;
}
else
{
buf[count].sy1=ident;
j=find(spelling);
if (j==-1)
{
buf[count].pos=tt1;
strcpy(ntab1[tt1]spelling);
tt1++;
nlength++;
}
else buf[count].pos=j;
}
count++;
for(k=0;k<10;k++) spelling[k]=‘\0‘;
}
/*****************数字的识别***********************************/
void number()
{
int ivalue=0;
int digit;
do
{
digit=ch-‘0‘;
ivalue=ivalue*10+digit;
readch();
}while((ch>=‘0‘)&&(ch<=‘9‘));
buf[count].sy1=intconst;
buf[count].pos=ivalue;
count++;
pline--;
}
/**************扫描主函数*************************************/
void scan()
{
int i;
while(chars != EOF)
{
switch (ch)
{
case ‘ ‘:
break;
case ‘a‘:
case ‘b‘:
case ‘c‘:
case ‘d‘:
case ‘e‘:
case ‘f‘:
case ‘g‘:
case ‘h‘:
case ‘i‘:
case ‘j‘:
case ‘k‘:
case ‘l‘:
case ‘m‘:
case ‘n‘:
case ‘o‘:
case ‘p‘:
case ‘q‘:
case ‘r‘:
case ‘s‘:
case ‘t‘:
case ‘u‘:
case ‘v‘:
case ‘w‘:
case ‘x‘:
case ‘y‘:
case ‘z‘:
identifier();
break;
case ‘0‘:
case ‘1‘:
case ‘2‘:
case ‘3‘:
case ‘4‘:
case ‘5‘:
case ‘6‘:
case ‘7‘:
case ‘8‘:
case ‘9‘:
number();
break;
case ‘<‘:
readch();
if(ch==‘=‘)
{
buf[count].pos=0;
}
else
{
if(ch==‘>‘) buf[count].pos=4;
else
{
buf[count].pos=1;
pline--;
}
}
buf[count].sy1=ro

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2014-07-09 14:04  简单编译器\
     文件       13256  2013-06-20 18:55  简单编译器\cplr.h
     文件       25033  2013-06-20 19:11  简单编译器\cplr2.c
     文件      101888  2013-06-20 19:12  简单编译器\cplr2.exe
     文件       44671  2013-06-20 19:12  简单编译器\cplr2.obj
     文件         451  2013-06-20 19:13  简单编译器\pas.c
     文件         524  2014-07-09 14:03  简单编译器\pas.med

评论

共有 条评论

相关资源