📄 comilpe_work1.cpp
字号:
// Comilpe_work1.cpp: implementation of the CComilpe_work1 class.
//
//////////////////////////////////////////////////////////////////////
#include<iostream.h>
#include<string.h>
#include<stdio.h>
#include <process.h>
#include "Comilpe_work1.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CComilpe_work1::CComilpe_work1()
{
t=0; //运行栈顶指针
tx=0; //buffer指针
code_pointer=0; //指向最新生成的pcode代码的指针
equal_flags=0; //记录等于号的数目,以对多个字母连续赋值
tag=0; //设置是否有等于号的标志
///////////////
int fx=0;
char ch;
if((in=fopen("infile.txt","r"))==NULL)
{
cout<<"Cannot open the file!"<<endl;
exit(0);
}
ch=fgetc(in);
while(ch!=EOF)
{
buffer[fx]=ch;
ch=fgetc(in);
fx++;
}
buffer[fx]='\0';
fclose(in);
for(int i=0;i<30;i++) //初始化字母表
{
table[i].ident='#';
table[i].value=-1;
}
//cout<<"the buffer is:"<<endl;
//cout<<buffer<<endl;
/////////////
}
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
CComilpe_work1::~CComilpe_work1()
{
}
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
void CComilpe_work1::gen(char *p_f,int lev_value,int a_value) //生成pcode目标代码
{
code[code_pointer].f=p_f;
code[code_pointer].l=lev_value;
code[code_pointer].a=a_value;
interpret();
code_pointer++;
}
////////////////////////////////////////////////////////////
//因子->无符号整数|(表达式)|字母=表达式|字母
////////////////////////////////////////////////////////////
void CComilpe_work1::factor() //因子处理程序
{
int i=0;
if(ssym.sym==endflags) ;//表达式结束
else //表达式没结束
{
if(ssym.sym!=chid) //如果不是标识符
{
if(ssym.sym!=number) //如果不是数字
{
if(ssym.sym==lparen) //遇到左括号
{
getsym();
expresion();//循环进行表达式分析
if(ssym.sym==rparen)//当遇到第一个右括号时判断是否为赋值
{
if(tag!=0) //tag用来记录前面是否有等于号
{
gen("sto",0,t_flags[equal_flags-1]); //给字母表的对应字母添值
equal_flags=equal_flags-1;
tag--;
}
getsym();
}
}
}
else {gen("lit",0,ssym.num); getsym();}
}
else
{
struct symbol t_allv=ssym;
while(table[i].ident!='#')
{
if(table[i].ident==t_allv.num) //
{
t_flags[equal_flags]=i;
equal_flags++;
break;
}
i++;
}
if(table[i].ident=='#') //没找到:则添字母表
{
table[i].ident=ssym.num;//
t_flags[equal_flags]=i;
equal_flags++;
}
getsym();
if(ssym.sym==equal)
{
tag++;
getsym();
expresion();
}
else
{
if(table[i].value!=-1) { gen("lit",0,table[i].value); }// 待续?????
else cout<<"the symbol is not defined"<<endl;
}
}
}
}
///////////////////////////////////////////////////
// 项->因子{乘法运算符 因子}
///////////////////////////////////////////////////
void CComilpe_work1::term() //项
{
factor();
while(ssym.sym==times||ssym.sym==div)
{
enum SYM p_sym=ssym.sym;
getsym();
factor();
if(p_sym==times)
gen("opr",0,4);//4号指令
else gen("opr",0,5);//5号指令
}
}
////////////////////////////////////////////////////
//表达式->[+|-]项{加法运算符 项}
////////////////////////////////////////////////////
void CComilpe_work1::expresion() //表达式
{
if(ssym.sym==plus||ssym.sym==minus)
{
enum SYM p_sym=ssym.sym;
getsym();
term();
if(p_sym==minus) gen("opr",0,1);
}
else term();
while(ssym.sym==plus||ssym.sym==minus)
{
enum SYM q_sym=ssym.sym;
getsym();
term();
if(q_sym==plus) gen("opr",0,2);
else gen("opr",0,3);
}
}
/////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////
void CComilpe_work1::interpret() //解释程序
{
int a_value;
char *p;
p=code[code_pointer].f;
a_value=code[code_pointer].a;
if(strcmp(p,"opr")==0)
switch(a_value)
{
case 1: stoken[t]=-stoken[t];break;
case 2: t=t-1;stoken[t]=stoken[t]+stoken[t+1];break;
case 3: t=t-1;stoken[t]=stoken[t]-stoken[t+1];break;
case 4: t=t-1;stoken[t]=stoken[t]*stoken[t+1];break;
case 5: t=t-1;stoken[t]=stoken[t]/stoken[t+1];break;
default : cout<<"not plus or minus or times or div!"<<endl;
}
else if(strcmp(p,"lit")==0)
{
t=t+1; stoken[t]=a_value;
}
else if(strcmp(p,"sto")==0)
{
table[a_value].value=stoken[t];
}
else cout<<"other code instruction!"<<endl;
}
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
void CComilpe_work1::block() //语法分析程序
{
getsym();
expresion();
}
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
struct symbol CComilpe_work1::getsym()
{
int sum=0;
if(buffer[tx]=='\0') //取到表达式的末尾
{
ssym.sym=endflags;
ssym.num=-1;
}
else if(buffer[tx]>='a'&&buffer[tx]<='z') //读到的单词是字母
{
ssym.sym=chid;
ssym.num=buffer[tx];
tx++;
}
else if(buffer[tx]=='+'||buffer[tx]=='-'||buffer[tx]=='*'||buffer[tx]=='/'||buffer[tx]=='('||buffer[tx]==')'||buffer[tx]=='=') //读到的单词是运算符
{
switch(buffer[tx])
{
case '+': ssym.sym=plus; break;
case '-': ssym.sym=minus; break;
case '*': ssym.sym=times; break;
case '/': ssym.sym=div; break;
case '(': ssym.sym=lparen; break;
case ')': ssym.sym=rparen; break;
case '=': ssym.sym=equal; break;
}
ssym.num=-1;
tx++;
}
else if(buffer[tx]>='0'&&buffer[tx]<='9') //读到的是数字
{
while(buffer[tx]>='0'&&buffer[tx]<='9')
{
sum=sum*10+(buffer[tx]-'0');
tx++;
}
ssym.sym=number;
ssym.num=sum;
}
return ssym;
}
//////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -