资源简介
对类似于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
- 上一篇:简单的词法分析器
- 下一篇:实验室设备管理系统 c++ 课程设计
评论
共有 条评论