资源简介
选择部分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
- 上一篇:MTK 源码分析中文版
- 下一篇:C++麻将胡牌算法
相关资源
- 北邮-编译原理-词法分析
- 现代编译原理-C语言描述
- 编译原理实验报告+代码+使用说明
- 编译原理课程设计-C语言子集编译器
- 赋值语句翻译c语言实现四元式
- 编译原理用C++消除左递归
- LL1语义分析的C语言子集编译器
- 编译原理简易C编译器
- 实现语法分析器-编译原理
- 编译原理 LR分析器 c++代码
- 设计并实现TINYC语言的扫描程序TINYC
- LL(1)文法分析全过程(FIRST/FLLOW/S
- 编译原理 LR0项目集规范族的构造 L
- 山东大学编译原理实验源代码c++版
- 简单函数绘图语言的解释器
- Lex和Yacc从入门到精通.pdf
- 简易词法分析器——基于C语言
- LL(1)文法的实现-mfc-编译原理学习
- 词法分析代码内有报告
- 编译原理LL1文法的mfc实现含消除左递
- 编译原理词法分析实验
- pl/0语言的编译器
- C++实现编译原理自动机、LL1文法、及
- 编译原理语义分析程序 c++实现
- 编译原理 课程设计 DAG 报告+源码C++版
- 编译原理课程设计----语法分析器(
- 编译原理简单的编译器源码
- C语言实现一个编译器-编译原理南开大
- 编译原理课程实验报告词法分析器及
- 编译原理与技术李文生:LR分析法C+
评论
共有 条评论