资源简介

选择部分C语言的语法成分(可参考附录C.5)或选择附录C.3的简单语言,采用递归下降的语法制导翻译技术,设计一个一遍扫描的词法语法语义分析程序。 注意与实验1、2的衔接。 •内容:设计并实现一个一遍扫描的词法语法语义分析程序,将多条简单赋值语句翻译成后缀式或三地址代码,要求有一定的出错提示和错误恢复功能。 实验报告内容要求:要给出所分析简单语言语法结构的词法说明、上下文无关文法描述,单词的种别编码方案,词法分析程序的主要算法思想,以及所采用的语法语义分析方法的算法思想的详细描述,测试结果与分析,实验总结等。

资源截图

代码片段和文件信息

#include 
#include 
#include 

#define _KEY_WORD_END “waiting for your expanding“

typedef struct
{
int typenum;
char * word;

}WORD;

struct 
{
char result[8];
char agl[8];
char op[8];
char ag2[8];
}quad[20];

char input[255];
char token[255]=““;
int p_input;
int p_token;
char ch;
char *rwtab[]={“begin““if““then““while““do““end“_KEY_WORD_END};
WORD * scaner();
int syn;
int kk=0;
int k=0;
int sum=0;
WORD * oneword=new WORD;
char* expression();
void lrparser();
char* factor();
char *newtemp();
void emit(char *resultchar *ag1char *opchar *ag2);
/*void main()
{
int over=1;
//WORD * oneword=new WORD;
printf(“ENTER Your words(end with #):“);
scanf(“%[^#]s“input);
p_input=0;

//printf(“Your words:\n%s\n“input);
/*while(over<1000&&over!=-1)
{
oneword= scaner();
if(oneword->typenum<999)
printf(“(%d%s)“oneword->typenumoneword->word);

over=oneword->typenum;
}
oneword=scaner();
syn=oneword->typenum;
lrparser();
// printf(“\npress # to exit:“);

// scanf(“%[^#]s“input);
}
*/
void main()
{
int over=1;
//WORD * oneword=new WORD;
printf(“ENTER Your words(end with #):“);
scanf(“%[^#]s“input);
p_input=0;
oneword=scaner();
syn=oneword->typenum;
lrparser();
}

char m_getch()
{
ch=input[p_input];
p_input=p_input+1;
return(ch);
}

void getbc()
{
while(ch==‘ ‘||ch==10)
{
ch=input[p_input];
p_input=p_input+1;
}
}

void concat()
{
token[p_token]=ch;
p_token=p_token+1;
token[p_token]=‘\0‘;
}

int letter()
{
if(ch>=‘a‘&&ch<=‘z‘||ch>=‘A‘&&ch<=‘Z‘) return 1;
else return 0;
}
int digit()
{
if(ch>=‘0‘&&ch<=‘9‘) return 1;
else return 0;
}

int reserve()
{
int i=0;
while(strcmp(rwtab[i]_KEY_WORD_END))
{
if(!strcmp(rwtab[i]token))
{
return i+1;
}
i=i+1;
}
return 10;
}

void retract()
{
p_input =p_input-1;
}

//数字转换二进制

char * dtb()
{
return NULL;
}

WORD *scaner()
{

WORD *myword=new WORD;
myword->typenum=10;
myword->word=““;
p_token=0;
m_getch();
getbc();
if(letter())
{
while(letter()||digit())
{
concat();
m_getch();
}
retract();
myword->typenum=reserve();
myword->word=token;
return(myword);

}
else
if(digit())
{
while(digit())
{
concat();
m_getch();
}

retract();
myword->typenum=11;
myword->word=token;
return(myword);
}
else switch(ch)
{
case ‘=‘:m_getch();
if(ch==‘=‘)
{
myword->typenum=39;
myword->word=“==“;
return(myword);
}
retract();
myword->typenum=25;
myword->word=“=“;
return(myword);
break;
case ‘+‘:
myword->typenum=13;
myword->word=“+“;
return(myword);
break;
case ‘-‘:
myword->typenum=14;
myword->word=“-“;
return(myword);
break;
case ‘*‘:
myword->typenum=15;
myword->word=“*“;
return(myword);

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

     文件       8778  2014-05-10 02:10  编译原理-语义分析\C3.cpp

     文件     200758  2014-05-10 13:04  编译原理-语义分析\C3.exe

     文件        171  2014-05-10 13:48  编译原理-语义分析\测试数据.txt

     文件      68608  2014-05-10 13:37  编译原理-语义分析\测试文件.doc

     文件      81920  2014-05-10 13:36  编译原理-语义分析\程序运行说明文件.doc

     目录          0  2014-05-11 16:46  编译原理-语义分析

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

               360235                    6


评论

共有 条评论