资源简介
附录c 编译程序实验
实验目的:用c语言对一个简单语言的子集编制一个一遍扫描的编译程序,以加深对编译原理的理解,掌握编译程序的实现方法和技术。
语法分析
C2.1 实验目的
编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析.
C2.2 实验要求
利用C语言编制递归下降分析程序,并对简单语言进行语法分析.
C2.2.1待分析的简单语言的语法
实验目的
通过上机实习,加深对语法制导翻译原理的理解,掌握将语法分析所识别的语法成分变换为中间代码的语义翻译方法.
实验要求
采用递归下降语法制导翻译法,对算术表达式、赋值语句进行语义分析并生成四元式序列。
实验的输入和输出
输入是语法分析提供的正确的单词串,输出为三地址指令形式的四元式序列。
例如:对于语句串
begin a:=2+3*4;x:=(a+b)/c end#
输出的三地址指令如下:
(1) t1=3*4
(2) t2=2+t1
(3) a=t2
(4) t3=a+b
(5) t4=t3/c
(6) x=t4
算法思想
1设置语义过程
(1) emit(char *result,char *arg1,char *op,char *ag2)
该函数功能是生成一个三地址语句送到四元式表中。
四元式表的结构如下:
struct {char result[8];
char ag1[8];
char op[8];
char ag2[8];
}quad[20];
(2)char *newtemp()
该函数回送一个新的临时变量名,临时变量名产生的顺序为T1,T2,….
Char *newtemp(void)
{
char *p;
char m[8];
p=(char *)malloc(8);
k++;
itoa(k,m,10);
strcpy(p+1,m);
p[0]=’t’;
return(p);
}
(2)主程序示意图如图c.10所示。
(2) 函数lrparser在原来语法分析的基础上插入相应的语义动作:将输入串翻译成四元式序列。在实验中我们只对表达式、赋值语句进行翻译。
语义分析程序的C语言程序框架
int lrparser()
{ int schain=0;
kk=0;
if(syn=1)
{ 读下一个单词符号;
schain=yucu; /调用语句串分析函数进行分析/
if(syn=6)
{ 读下一个单词符号;
if(syn=0 && (kk==0))
输出(“success”);
}
else { if(kk!=1 ) 输出 ‘缺end’ 错误;kk=1;}
else{输出’begin’错误;kk=1;}
}
return(schain);
int yucu()
{ int schain=0;
schain=statement();/调用语句分析函数进行分析/
while(syn=26)
{读下一个单词符号;
schain=statement(); /调用语句分析函数进行分析/
}
return(schain);
}
int statement()
{ char tt[8],eplace[8];
int schain=0;
{switch(syn)
{case 10:
strcpy(tt,token);
scanner();
if(syn=18)
{读下一个单词符号;
strcpy(eplace,expression());
emit(tt,eplace,””,””);
schain=0;
}
else {输出’缺少赋值号’的错误;kk=1;
}
return(schain);
break;
}
}
char *expression(void)
{char *tp,*ep2,*eplace,*tt;
tp=(char *)malloc(12);/分配空间/
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt =(char )malloc(12);
strcpy(eplace,term ());/调用term分析产生表达式计算的第一项eplace/
while(syn=13 or 14)
{ 操作符 tt= ‘+’或者‘—’;
读下一个单词符号;
strcpy(ep2,term());/调用term分析产生表达式计算的第二项ep2/
strcpy(tp,newtemp());/调用newtemp产生临时变量tp存储计算结果/
emit(tp,eplace,tt,ep2);/生成四元式送入四元式表/
strcpy(eplace,tp);
}
return(eplace);
}
char *term(void)/仿照函数expression编写/
char *factor
代码片段和文件信息
#include
#include
char prog[80]token[8];
char ch;
int synpmnsum;
char *rwtab[6]={“begin““if““then““while““do““end“};
void scaner();
void main(){
p=0;
printf(“\n please input string;\n“);
do {
scanf(“%c“&ch);
prog[p++] = ch;
}while (ch!=‘#‘);
p=0;
do{
scaner();
switch(syn) {
case 11: printf (“(syn%d)\n“sum); break;
case -1:printf(“error!\n“);break;
default:printf(“(%d%s)\n“syntoken);
}
}while (syn!=0);
}
void scaner(){
for(n=0;n<8;n++) token[n]=NULL;
ch = prog[p++];
while(ch==‘ ‘)
ch = prog[p++];
if(ch>=‘a‘&&ch<=‘z‘){
m = 0;
while((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘0‘&&ch<=‘9‘)){
token[m++] = ch;
ch = prog[p++];
}
token[m++]=‘\0‘;
--p;
syn=10;
for (n=0;n<6;n++)
if(strcmp(tokenrwtab[n])==0){
syn = n+1;
break;
}
}
else
if(ch>=‘0‘&&ch<=‘9‘){
while (ch>=‘0‘&&ch<=‘9‘){
sum=sum*10+ch-‘0‘;
ch = prog[p++];
}
--p;
syn=11;
}
else
switch(ch){
case‘<‘:
m=0;token[m++]=ch;
ch = prog[p++];
if(ch==‘>‘){
syn=21;
token[m++]=ch;
}
else
if (ch==‘=‘){
syn=22;
token[m++]=ch;
}
else{
syn=20;
--p;
}
break;
case‘>‘:
token[m++] = ch;
ch = prog[p++];
if(ch==‘=‘){
syn = 24;
token[m++] = ch;
}
else {
syn = 23;
--p;
}
break;
case‘:‘:
token[m++] = ch;
ch = prog[p++];
if(ch==‘=‘){
syn = 18;
token[m++] = ch;
}
else {
syn = 17;
--p;
}
break;
case‘+‘:
syn=13;token[0]=ch;break;
case‘-‘:
syn=14;token[0]=ch;break;
case‘*‘:
syn=15;token[0]=ch;break;
case‘/‘:
syn=16;token[0]=ch;break;
case‘=‘:
syn=25;token[0]=ch;break;
case‘;‘:
syn=26;token[0]=ch;break;
case‘(‘:
syn=27;token[0]=ch;break;
case‘)‘:
syn=28;token[0]=ch;break;
case‘#‘:
syn=0;token[0]=ch;break;
default:
syn=-1;
}
}
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 1844 2008-10-27 21:44 编译原理\词法分析实验\1_2\1_2.cpp
文件 3365 2008-10-28 14:20 编译原理\词法分析实验\1_2\1_2.dsp
文件 514 2008-10-28 15:14 编译原理\词法分析实验\1_2\1_2.dsw
文件 41984 2008-10-28 15:14 编译原理\词法分析实验\1_2\1_2.ncb
文件 48640 2008-10-28 15:14 编译原理\词法分析实验\1_2\1_2.opt
文件 1095 2008-10-27 23:31 编译原理\词法分析实验\1_2\1_2.plg
文件 167982 2008-10-27 23:31 编译原理\词法分析实验\1_2\Debug\1_2.exe
文件 186736 2008-10-27 23:31 编译原理\词法分析实验\1_2\Debug\1_2.ilk
文件 9620 2008-10-27 23:31 编译原理\词法分析实验\1_2\Debug\1_2.obj
文件 186924 2008-10-27 23:27 编译原理\词法分析实验\1_2\Debug\1_2.pch
文件 427008 2008-10-27 23:31 编译原理\词法分析实验\1_2\Debug\1_2.pdb
文件 33792 2008-10-28 14:20 编译原理\词法分析实验\1_2\Debug\vc60.idb
文件 45056 2008-10-27 23:31 编译原理\词法分析实验\1_2\Debug\vc60.pdb
..A..H. 162 2008-10-27 20:32 编译原理\词法分析实验\~$实验设计模板.doc
文件 36864 2007-07-25 19:42 编译原理\词法分析实验\词法分析.doc
文件 60928 2008-10-28 10:58 编译原理\词法分析实验\词法分析实验报告.doc
文件 4673 2008-12-14 22:33 编译原理\语义分析\3_1\1.cpp
文件 3346 2008-12-14 22:42 编译原理\语义分析\3_1\1.dsp
文件 527 2008-12-14 22:42 编译原理\语义分析\3_1\1.dsw
文件 33792 2008-12-14 22:42 编译原理\语义分析\3_1\1.ncb
文件 48640 2008-12-14 22:42 编译原理\语义分析\3_1\1.opt
文件 1622 2008-12-14 22:41 编译原理\语义分析\3_1\1.plg
文件 98370 2008-12-14 22:41 编译原理\语义分析\3_1\Debug\1.exe
文件 51616 2008-12-14 22:41 编译原理\语义分析\3_1\Debug\1.ilk
文件 19088 2008-12-14 22:41 编译原理\语义分析\3_1\Debug\1.obj
文件 222996 2008-12-14 22:41 编译原理\语义分析\3_1\Debug\1.pch
文件 558080 2008-12-14 22:41 编译原理\语义分析\3_1\Debug\1.pdb
文件 33792 2008-12-14 22:41 编译原理\语义分析\3_1\Debug\vc60.idb
文件 45056 2008-12-14 22:41 编译原理\语义分析\3_1\Debug\vc60.pdb
..A.SH. 7168 2008-12-14 21:03 编译原理\语义分析\Thumbs.db
............此处省略40个文件信息
- 上一篇:C语言学生信息管理系统.rar
- 下一篇:简单的鼠标绘图程序C语言
相关资源
- 北邮-编译原理-词法分析
- 语法分析c语言实现程序代码+实验报告
- LL1语义分析的C语言子集编译器
- 实现语法分析器-编译原理
- LL(1)文法分析全过程(FIRST/FLLOW/S
- 词法分析器有去除注释功能
- 语法分析器 tiny语言语法分析
- C++语法分析器
- 自定义词法规则的词法分析器
- 语法分析c语言实现含报告
- C语言词法分析程序
- 简易词法分析器——基于C语言
- 词法分析C++源码
- 词法分析代码内有报告
- 编译原理词法分析实验
- 编译原理语义分析程序 c++实现
- LL1语法分析器(c++)
- 编译原理课程设计----语法分析器(
- 编译原理课程实验报告词法分析器及
- PL0编译器词法检查与语法分析器
- LL(1)语法分析器C++版
- 编译技术实验(Pascal代码转汇编语言
- LR(0)语法分析器程序
- TINY扩充语言的语法分析(实现 while、
- 编译原理课程设计词法语法分析器
- 编译原理LL1语法分析器C++版源代码
- LEX实现一个C语言子集的词法分析器
- 编译原理词法分析器实验报告含源代
- 编译原理词法分析器C++版源代码
- 无符号数的词法分析程序 C++版
评论
共有 条评论