资源描述
编译原理程序设计实验报告
——实验题目
班级:计算机1306 姓名: 学号:
实验目标:表达式语法分析器的设计实现
1) 递归下降子程序
2) LL(1)分析法
实验内容:
1. 概要设计
1) 按照流程图,调用子程序实现;
2) 通过ll(1)分析表和对应压栈、弹栈操作实现。
2. 流程图
1) 递归:
Z’(main):开始
Read(w)
E
#?
N
Err
结束
入口
入口
E: E1:
+?
T
Y
E1
Read(w)
-?
N
出口
Y
T
N
出口
入口
入口
T: T1:
*?
F
Y
Read(w)
/?
T1
N
出口
Y
T
N
入口
出口
F:
(?
I?
N N err
Read(w)
Y Y
Read(w)
E
)?
出口
Y N err
2) LL(1):
调用函数token()切分单词
构建LL(1)分析表
开始
调用*Analyse(char *token)进行分析
结束
3. 关键函数
1) 递归下降子程序
void E(); //E->TX;
int E1(); //X->+TX | e
void T(); //T->FY
int T1(); //Y->*FY | e
int F(); //F->(E) | i
2) LL(1)分析法
char *Find(char vn,char vt)//是否查到表
char *Analyse(char *token)//分析过程
int Token()//将token中数字表示成i,标识符表示成n
源程序代码:(加入注释)
1) 递归下降子程序:
#include<stdio.h>
#include<iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
/********全局变量**********/
char str[30];
int index=0;
void E(); //E->TX;
int E1(); //X->+TX | e
void T(); //T->FY
int T1(); //Y->*FY | e
int F(); //F->(E) | i
FILE *fp;
char cur;
/*************主函数************/
int main()
{
int len;
int m;
if((fp=fopen("source.txt","r"))==NULL)
{
cout<<"can not open the source file!"<<endl;
exit(1);
}
cur=fgetc(fp);
while(cur!='#')
{
E();
}
cout<<endl;
cout<<"success"<<endl;
return 0;
}
/*************************************/
void E()
{
T();
E1();
}
/*************************************/
int E1()
{
if(cur=='+')
{
cur=fgetc(fp);
T();
cout<<'+'<<" ";
E1();
}
else if(cur=='-')
{
cur=fgetc(fp);
T();
cout<<'-'<<" ";
E1();
}
return 0;
}
/************************************/
void T()
{
F();
T1();
}
/***********************************/
int T1()
{
if(cur=='*')
{
cur=fgetc(fp);
F();
cout<<'*'<<" ";
T1();
}
else if(cur=='/')
{
cur=fgetc(fp);
F();
cout<<'/'<<" ";
T1();
}
return 0;
}
int F()
{
if((cur<='z'&&cur>='a')||(cur<='Z'&&cur>='A')||cur=='_')
{
for(int i=0;i<20;i++)
{
str[i]='\0';
index=0;
}
str[index++]=cur;
cur=fgetc(fp);
while((cur<='z'&&cur>='a')||(cur<='Z'&&cur>='A')||cur=='_'||(cur<='9'&&cur>='0'))
{
str[index++]=cur;
cur=fgetc(fp);
}
cout<<str;
cout<<" ";
return NULL;
}
else if (cur<='9'&&cur>='0')
{
for(int i=0;i<20;i++)
{
str[i]='\0';
index=0;
}
while(cur<='9'&&cur>='0')
{
str[index++]=cur;
cur=fgetc(fp);
}
if(cur=='.')
{
str[index++]=cur;
cur=fgetc(fp);
while(cur<='9'&&cur>='0')
{
str[index++]=cur;
cur=fgetc(fp);
}
cout<<str;
cout<<" ";
return NULL;
}
else if((cur<='z'&&cur>='a')||(cur<='Z'&&cur>='A')||cur=='_')
{
printf("error6\n");
exit(1);
}
else
{
cout<<str;
cout<<" ";
return NULL;
}
}
else if (cur=='(')
{
cur=fgetc(fp);
E();
if(cur==')')
{
cur=fgetc(fp);
return 0;
}
else
{
printf("error3\n");
exit (1);
}
}
else{
printf("error4\n");
exit(1);
}
return 0;
}
程序运行结果:(截屏)
输入:
Source.txt文本
((Aa+Bb)*(88.2/3))#
输出:
2) LL(1)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <stack>
using namespace std;
struct Node1
{
char vn;
char vt;
char s[12];
}MAP[22];//存储分析预测表每个位置对应的终结符,非终结符,产生式
int k;
char token[30];
int token_index=0;
char G[12][12]={"E->TR","R->+TR","R->-TR","R->e","T->FW","W->*FW","W->/FW","W->e","F->(E)","F->i","F->n"};
//存储文法中的产生式 ,用R代表E',W代表T',e代表空
//char VN[6]={'E','R','T','W','F'};//存储非终结符
//char VT[9]={'i','n','+','-','*','/','(',')','#'};//存储终结符
char Select[12][12]={"(,i,n","+","-","),#","(,i,n","*","/","+,-,),#","(","i","n"};//存储文法中每个产生式对应的select集合
char Right[12][8]={"->TR","->+TR","->-TR","->e","->FW","->*FW","->/FW","->e","->(E)","->i","->n"};
stack<char> stak,stak1,stak2;
char *Find(char vn,char vt)
{
int i;
for(i=0;i<k;i++)
{
if(MAP[i].vn==vn&& MAP[i].vt==vt)
return MAP[i].s;
}
return "error";
}
char *Analyse(char *token)
{
char p,action[10],output[10];
int i=1,j,k=0,l_act,m;
while(!stak.empty())//判断栈中是否为空,若不空就将栈顶元素与分析表匹配进行相应操作
stak.pop();
stak.push('#');//栈底标志
stak.push('E');//起始符号先入栈
printf(" 步骤 栈顶元素 输入串 推导所用产生式或匹配\n");
p=stak.top();
while(p!='#')//查预测分析表将栈顶元素进行匹配,若栈顶元素与输入串匹配成功则向前匹配,否则生成式反序入栈
{
printf("%7d ",i++);
p=stak.top();//从栈中弹出一个栈顶符号,由p记录并输出
stak.pop();
printf("%6c ",p);
for(j=0,m=0;j<token_index;j++)//将未被匹配的剩余输入串输出
output[m++]=token[j];
output[m]='\0';
printf("%10s",output);
if(p==token[k])
{
if(p=='#')//若最后一个结束符号匹配说明输入表达式被接受,否则继续匹配
{
printf(" 接受\n");
return "SUCCESS";
}
printf(" “%c”匹配\n",p);
k++;
}
else
{ //将未被匹配的第一个字符与find函数的结果进行比较,在预测分析表中查找相应生成式
strcpy(action,Find(p,token[k]));
if(strcmp(action,"error")==0)
{
printf(" 没有可用的产生式\n");
return "ERROR";
}
printf(" %c%s\n",p,action);
int l_act=strlen(action);
if(action[l_act-1]=='e')
continue;
for(j=l_act-1;j>1;j--)
stak.push(action[j]);
}
}
return "ERROR";
}
int Token()
{
FILE *fp;
char cur;
int i,j;
fp=fopen("source.txt","r");
cur=fgetc(fp);
while(cur!=EOF)//把用字母数字表示的输入串转换为token序列的表示方法
{
if((cur<='z'&&cur>='a')||(cur<='Z'&&cur>='A')||cur=='_')
{
cur=fgetc(fp);
while((cur<='z'&&cur>='a')||(cur<='Z'&&cur>='A')||cur=='_'||(cur<='9'&&cur>='0'))
{
cur=fgetc(fp);
}
token[token_index++]='i';
continue;
}
else if (cur<='9'&&cur>='0')
{
while(cur<='9'&&cur>='0')
cur=fgetc(fp);
if(cur=='.')
{
cur=fgetc(fp);
while(cur<='9'&&cur>='0')
cur=fgetc(fp);
}
token[token_index++]='n';
continue;
}
else
{
token[token_index++]=cur;
cur=fgetc(fp);
continue;
}
}
token[token_index]='#';
cout<<"把文件中字符串用i表示,数字用n表示,转化后:";
for(int index=0;index<=token_index;index++)
cout<<token[index];
cout<<endl<<endl;
return 0;
}
int main ()
{
int i,j,l,m;
for(i=0,k=0;i<11;i++)//通过select集合生成预测分析表
{
l=strlen(Select[i]);
for(j=0;j<l;j+=2)
{
MAP[k].vn=G[i][0];
MAP[k].vt=Select[i][j];
strcpy(MAP[k].s,Right[i]);
k++;
}
}
Token();
cout<<"分析过程如下:"<<endl;
cout<<Analyse(token)<<endl;
return 0;
}
程序运行结果:(截屏)
输入:
Source.txt文本
((Aa+Bb)*(88.2/3))
输出:
目 录
第一章 总论 1
一、项目概况 1
二、项目提出的理由与过程 6
三、项目建设的必要性 8
四、项目的可行性 12
第二章 市场预测 15
一、市场分析 15
二、市场预测 16
三、产品市场竞争力分析 19
第三章 建设规模与产品方案 22
一、建设规模 22
二、产品方案 22
三、质量标准 22
第四章 项目建设地点 25
一、项目建设地点选择 25
二、项目建设地条件 25
第五章 技术方案、设备方案和工程方案 28
一、技术方案 28
二、产品特点 30
三、主要设备方案 32
四、工程方案 32
第六章 原材料与原料供应 35
一、原料来源及运输方式 35
二、燃料供应与运输方式 35
第七章 总图布置、运输、总体布局与公用辅助工程 37
一、总图布置 37
二、 运输 38
三、总体布局 38
四、公用辅助工程 39
第八章 节能、节水与安全措施 44
一、主要依据及标准 44
二、节能 44
三、节水 45
四、消防与安全 45
第九章 环境影响与评价 47
一、法规依据 47
二、项目建设对环境影响 48
三、环境保护措施 48
四、环境影响评价 49
第十章 项目组织管理与运行 50
一、项目建设期管理 50
二、项目运行期组织管理 52
第十一章 项目实施进度 55
第十二章 投资估算和资金筹措 56
一、投资估算 56
二、资金筹措 58
第十三章 财务评价与效益分析 61
一、项目财务评价 61
二、财务评价结论 65
三、社会效益 68
四、生态效益 68
第十四章 风险分析 70
一、主要风险分析识别 70
二、风险程度分析及防范风险的措施 70
第十五章 招标方案 72
一、招标范围 72
二、招标组织形式 72
三、招标方式 72
第十六章 结论与建议 74
一、可行性研究结论 74
二、建议 75
附 件 77
一、附表 77
二、附件 77
三、附图 77
展开阅读全文