资源简介

完成一个相对完整的编译器,该编译完成对变量类型(整数/浮点数)定义、赋值、四则运算、逻辑运算、跳转与循环控制功能。其输入是源程序(参见“一个四则运算源程序示例”),输出是所有变量的最终值。

资源截图

代码片段和文件信息

#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
using namespace std;
#define MAX 100

char inputstream[50];   //存储输入句子
int temp1=0;      //数组下标
int right1;      //判断输出信息
int m2=0sum2=0;//sum用于计算运算符的个数
//m用于标记输入表达式中字符的个数

char JG=‘A‘;
char str[MAX];//用于存输入表达式
int  tokene=0;//左括号的标志
char prog1[80]token1[8]ch1;
int syn1p1m1n1sum1;
char *rwtab1[6]={“begin““if““then““while““do““end“};

int r1 ;
char prog[80]; //存放所有输入字符   
char token[8]; //存放词组   
char ch; //单个字符   

int synpmni;  //syn:种别编码   
double sum;        
int count;   

int isSignal; //是否带正负号(0不带,1负号,2正号)
int isError;
int isDecimal; //是否是小数   
double decimal;  //小数   
int isExp;  //是否是指数   
int index;  //指数幂   
int isNegative; //是否带负号  

double temp;   
int temp2;

int repeat; //是否连续出现+-

int nextq;
int kk; //临时变量的标号
int ntcnfcnncnnbnna;
char *rwtab[9]={“main““int““float““double““char““if““else““do““while“};
struct{
char result[10]; //字符串(字符数组)
char arg1[10];
char opera[10];
char arg2[10];
}fourCom[20]; //结构体数组

void cifafenxi();
void yufafenxi();
void zhongjiandaima();
void scaner1();
void e();
void e1();
void t();
void t1();
void f();
void lrparser(); 
void staBlock(int *nChain); //语句块
void staString(int *nChain); //语句串
void sta(int *nChain); //语句
void fuzhi(); //赋值语句
void tiaojian(int *nChain); //条件语句
void xunhuan(); //循环语句
char* E(); //Expresiion表达式
char* T(); //Term项
char* F(); //Factor因子
char *newTemp(); //自动生成临时变量
void backpatch(int pint t); //回填
int merge(int p1int p2); //合并p1和p2
void emit(char *reschar *num1char *opchar *num2); //生成四元式

void scanner(); //扫描
void lrparser()
{
int nChain;
nfc=ntc=1;
nextq=1;
if(syn==1) //main
{
scanner();
if(syn==26) //(
{
scanner();
if(syn==27) //)
{
scanner();
staBlock(&nChain);
}
else
printf(“缺少右括号\n“);
}
else 
printf(“缺少左括号\n“);
}
else
printf(“缺少main\n“);
}

//<语句块> ::= ‘{‘<语句串>‘}‘
void staBlock(int *nChain) //语句块
{
if(syn==28) //{
{
scanner();
staString(nChain);
//backpatch(*nChainnextq);
if(syn==29) //}
scanner();  //读下一个
else
printf(“缺少}号\n“);
}
else
printf(“缺少{号\n“);
}

//<语句串>::=<语句>{;<语句>};
void staString(int *nChain) //语句串
{
sta(nChain);
backpatch(*nChainnextq);
while(syn==31) //;
{
scanner();
sta(nChain);
}

//backpatch(*nChainnextq-1);
}

void sta(int *nChain) //语句
{
if(syn==10)
{
fuzhi();
//*nChain=0;
}
else if(syn==6) //if
{
tiaojian(nChain);
}
else if(syn==8) //do
xunhuan();
}

//<条件语句>->if(<条件>)<语句块>
void tiaojian(int *nChain)
{
char res[10]num1[10]num2[10]op[10];
int nChainTemp;

//<条件>-><表达式><关系运算符><表达式>
if(syn==6) //if
{
scanner();
//strcpy(num1E());

if(syn==26) //(
{
scanner();
strcpy(num1E());

if((syn<=37)&&(syn>=32)) 
{
switch(syn)

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2018-03-07 15:45  实验三:编译器\
     文件       17960  2017-04-19 12:55  实验三:编译器\1.cpp
     目录           0  2018-03-07 15:30  实验三:编译器\OK\
     文件       13675  2017-04-19 15:00  实验三:编译器\OK\okok.cpp
     文件       11873  2017-04-19 12:39  实验三:编译器\OK\简单版OK.cpp
     文件       11873  2017-04-19 12:39  实验三:编译器\OK.cpp
     文件      247808  2017-04-19 00:07  实验三:编译器\编译原理-简单编译器课程设计报告.doc
     文件      361441  2017-04-18 23:53  实验三:编译器\编译原理课程设计----C语言编译器的实现.doc
     文件      130048  2018-03-07 15:44  实验三:编译器\编译器.doc

评论

共有 条评论