vc++做词法分析器

词:变量var,类型,int ,real(实数)bool(布尔) while,do,begin,if,then,else, 将关键字放在一个表中,有的话,不添加,否则添加算符,有+/*/,这也要在符号表中,都要反回一个记号:addop,mulop 界符:( ) ; , : := 关系操作符:>=,<=,!=,<,>,== id:字开头的字符数字串无符号int 型的关键字用空格隔开,其它可以有也可以没有在扫描时:注释有{},{}不能有{},可以有一行或多行。功能:删除一个多余字符,插入一个字符。

 

程序如下:

 

#include <iostream>
#include <fstream>
#include <stack>
#include <map>
#include <string>

using namespace std;

#define zhengshu 1                //int
#define IF 2                     //if
#define ELSE 3                 //else
#define shishu 4                 //float
#define PRINT 5                 //print
#define ID 6                    //identify
#define CONSTANT 7              //constant
#define op_fuzhi 8                //=
#define op_add 9                    //+
#define op_mul 10                   //*
#define op_2star 11                  //**
#define div_fenhao 12             //;
#define syl_ls 13                   //(
#define syl_rs 14                 //)
#define syl_lb 15               //{
#define syl_rb 16                  //}
#define sbl_lm  17                 //[
#define sbl_rm 18                  //]
#define op_sub 19              //-
#define op_div 20             // /
#define div_douhao 21               //,
#define rop_yu 22                 //&&
#define op_or  23                 //||
#define rop_fei 24                 //!
#define rop_equal  25         //==
#define rop_dayu 26              //>
#define rop_xiaoyu 27              //<
#define rop_buxiaoyu 28             //>=
#define rop_budayu 29             //<=
#define rop_uneql   30          //!=
#define TEMP 31
#define NULL 0
#define JMP 32
#define GOTO 33                   //goto标识


/*****************************重要数据结构的声明开始*************************/
struct delos
{
int code,value;
}*result;                    //结果
//变量表
struct analyse

int state;
char sign;
};

struct list
{
int value;
list *next;
};

//条件语句的LR(1)分析表,110表示接受,999表示出错
int table[38][20]={
  /*0*/{3,999,999,999,999,999,999,999,999,999,999,999,4,999,1,2,999,999,999,999},
        /*1*/{999,999,999,999,999,999,999,999,999,999,999,999,999,110,999,999,999,999,999,999},
  /*2*/{74,999,999,999,999,999,999,999,999,999,999,999,74,74,999,999,999,999,5,999},
  /*3*/{999,6,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999},
  /*4*/{999,999,999,999,7,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999},
  /*5*/{999,999,999,999,999,999,999,999,999,999,999,999,999,61,999,999,999,999,999,999},
  /*6*/{999,12,999,999,999,999,999,9,999,999,999,11,13,999,999,999,8,10,999,999},
  /*7*/{999,12,999,999,999,999,999,999,999,999,999,11,13,999,999,999,999,14,999,999},
  /*8*/{999,999,15,999,999,16,17,999,999,999,999,999,999,999,999,999,999,999,999,999},
  /*9*/{999,12,999,999,999,999,999,9,999,999,999,11,13,999,999,999,18,10,999,999},
  /*10*/{999,999,999,999,999,999,999,999,19,20,21,999,999,999,999,999,999,999,999,999},
  /*11*/{999,12,999,999,999,999,999,999,999,999,999,11,13,999,999,999,999,22,999,999},
  /*12*/{999,12,999,999,999,999,999,999,999,999,999,11,13,999,999,999,999,23,999,999},
  /*13*/{999,999,73,73,999,73,73,999,73,73,73,999,999,73,999,999,999,999,999,999},
  /*14*/{999,999,999,64,999,999,999,999,999,20,21,999,999,64,999,999,999,999,999,999},
  /*15*/{74,999,999,999,999,999,999,999,999,999,999,999,74,74,999,999,999,999,24,999},
  /*16*/{74,999,999,999,999,999,999,999,999,999,999,999,74,74,999,999,999,999,999,25},
  /*17*/{74,999,999,999,999,999,999,999,999,999,999,999,74,74,999,999,999,999,999,26},
  /*18*/{999,999,67,999,999,67,67,999,999,999,999,999,999,999,999,999,999,999,999,999},
  /*19*/{999,12,999,999,999,999,999,999,999,999,999,11,13,999,999,999,999,27,999,999},
  /*20*/{999,12,999,999,999,999,999,999,999,999,999,11,13,999,999,999,999,28,999,999},
  /*21*/{999,12,999,999,999,999,999,999,999,999,999,11,13,999,999,999,999,29,999,999},
  /*22*/{999,999,71,71,999,71,71,999,71,71,71,999,999,71,999,999,999,999,999,999},
  /*23*/{999,999,30,999,999,999,999,999,999,20,21,999,999,999,999,999,999,999,999,999},
  /*24*/{3,999,999,999,999,999,999,999,999,999,999,999,4,999,999,31,999,999,999,999},
  /*25*/{999,12,999,999,999,999,999,9,999,999,999,11,13,999,999,999,32,10,999,999},
  /*26*/{999,12,999,999,999,999,999,9,999,999,999,11,13,999,999,999,33,10,999,999},
  /*27*/{999,999,68,999,999,68,68,999,999,20,21,999,999,999,999,999,999,999,999,999},
  /*28*/{999,999,69,69,999,69,69,999,69,69,21,999,999,69,999,999,999,999,999,999},
  /*29*/{999,999,70,70,999,70,70,999,70,70,70,999,999,70,999,999,999,999,999,999},
     /*30*/{999,999,72,72,999,72,72,999,72,72,72,999,999,72,999,999,999,999,999,999},
  /*31*/{999,999,999,75,999,999,999,999,999,999,999,999,999,63,999,999,999,999,999,34},
  /*32*/{999,999,65,999,999,65,65,999,999,999,999,999,999,999,999,999,999,999,999,999},
  /*33*/{999,999,66,999,999,16,66,999,999,999,999,999,999,999,999,999,999,999,999,999},
  /*34*/{999,999,999,35,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999,999},
  /*35*/{74,999,999,999,999,999,999,999,999,999,999,999,74,74,999,999,999,999,36,999},
  /*36*/{3,999,999,999,999,999,999,999,999,999,999,999,4,999,999,37,999,999,999,999},
  /*37*/{999,999,999,62,999,999,999,999,999,999,999,999,999,62,999,999,999,999,999,999}
};

/*****************************重要数据结构的声明结束*************************/



/*********************************全局变量声明开始**************************/
int place=1;
int nextpos=1;
stack<list *> stknext;
stack<list *> stktrue;
stack<list *> stkfalse;
stack<int> stkpos;
stack<delos> stktemp;//常量,变量,临时变量
delos temp;
delos gen[50][4];//生成的三地址

string str[31]={"","int","if","else","float","print","标识符","常数",
    "=","+","*","**",";","(",")",
              "{","}","[","]","-","/",",","&&","||","!",
     "==",">","<",">=","<=","!="};
//变量
string *var;
int varlen=0,nowvar=1;
//常量
float *myconst;
int constlen=0,nowconst=1;
int resultlen=0,nowresult=0;

/*********************************全局变量声明结束**************************/


void renewresult()
{
delos *p3=result;
   int i;  
   resultlen+=10;
   result=new delos[resultlen];
   for(i=0;i<resultlen;i++)
   { result[i].code=p3[i].code;
     result[i].value=p3[i].value;
   }  
   delete[] p3;
}

void renewvar()
{
string *p1=var;
  int i;
  varlen+=10;
  var=new string[varlen];
  for(i=0;i<nowvar;i++)
  var[i]=p1[i];
  delete[] p1;
}

void renewconst()
{
float *p2=myconst;
  int i;
  constlen+=10;
  myconst=new float[constlen];
  for(i=0;i<nowconst;i++)
  myconst[i]=p2[i];
  delete[] p2;
}

bool isletter(char c)          //判别是否字母
{
if(c>64&&c<91||c>96&&c<123)
    return true;
return false;
}

bool isdigital(char c)         //判别是否数字
{  if(c>47&&c<58)
     return true;
   return false;  
}

int reserve(char c[],int i)
{
string s(c,0,i);
for(int j=1;j<7;j++)
  if(s==str[j])
   return j;
return 0;
}

void insertresult(int code,int value)
{  if(nowresult>resultlen)
      renewresult();
result[nowresult].code=code;
    result[nowresult++].value=value;
}

void insertid(char c[],int i)
{ string s(c,0,i);
  insertresult(ID,nowvar);
  if(nowvar>varlen)
   renewvar();
  var[nowvar++]=s;
}
//插入常数,为浮点型
void insertconst(char c[],int i)
{ int d=0,j;
  float a=0,b=1;
  while(c[d]!='.'&&d<i)
   d++;

  for(j=d-1;j>=0;j--)
  { a=a+(c[j]-48)*b;
    b=b*10;
  }

  b=10;
  for(j=d+1;j<i;j++)
  {a=a+(c[j]-48)/b;
   b=b*10;
  }
  insertresult(CONSTANT,nowconst);
  if(nowconst>constlen)
   renewconst();
  myconst[nowconst++]=a;
}

/**********************************词法分析函数开始***********************/
void wordanalyse()
{
char strtoken[10];
  int i=0,code;
  char ch;
  ifstream myfile;
  myfile.open("sourcefile.txt");
  if(!myfile)
  { cout<<"Can not open input file !"<<endl;
    return;
  }

  while(!myfile.eof())
  { i=0;
for(ch=myfile.get();ch==' '||ch==13||ch==10;ch=myfile.get())
        ;    
    if(isletter(ch))
{while(isletter(ch)||isdigital(ch))
  {strtoken[i++]=ch;
   ch=myfile.get();
  }
  myfile.seekg(-1,ios::cur);
  code=reserve(strtoken,i);
  if(code==0)
      insertid(strtoken,i);  
  else
  {insertresult(code,0);
  }
}
else if(isdigital(ch))
{while(isdigital(ch)||ch=='.')
  {strtoken[i++]=ch;
   ch=myfile.get();
  }
myfile.seekg(-1,ios::cur);
  insertconst(strtoken,i);
}
    else if(ch=='=')
{  ch=myfile.get();
  if(ch=='=')
     insertresult(rop_equal,0); 
    else
    {insertresult(op_fuzhi,0);
    myfile.seekg(-1,ios::cur);
    }
}
else if(ch=='+')
{insertresult(op_add,0);
}
else if(ch=='*')
{  ch=myfile.get();
  if(ch=='*')
     insertresult(op_2star,0); 
    else
    {insertresult(op_mul,0);
    myfile.seekg(-1,ios::cur);
    }
}
else if(ch==';')
{ insertresult(div_fenhao,0);
}
else if(ch=='(')
{insertresult(syl_ls,0);
}
else if(ch==')')
{insertresult(syl_rs,0);
}
else if(ch=='{')
{ insertresult(syl_lb,0);
}
else if(ch=='}')
{ insertresult(syl_rb,0);
}
else if(ch=='[')
{ insertresult(sbl_lm,0);
}
    else if(ch==']')
{ insertresult(sbl_rm,0);
}
  else if(ch=='-')
{ insertresult(op_sub,0);
}
  else if(ch=='/')
{ insertresult(op_div,0);
}
  else if(ch==',')
{ insertresult(div_douhao,0);
}
  else if(ch=='&')
{  ch=myfile.get();
  if(ch=='&')
     insertresult(rop_yu,0); 
    else
    {
    myfile.seekg(-1,ios::cur);
    myfile.get(strtoken,10);
    cout<<"ERROR :"<<strtoken<<endl;
    }
}
  
  else if(ch=='|')
{  ch=myfile.get();
  if(ch=='|')
     insertresult(op_or,0); 
    else
    {
    myfile.seekg(-1,ios::cur);
    myfile.get(strtoken,10);
    cout<<"ERROR :"<<strtoken<<endl;
    }
}
  else if(ch=='!')
{  ch=myfile.get();
  if(ch=='=')
     insertresult(rop_uneql,0); 
    else
    {insertresult(rop_fei,0);
    myfile.seekg(-1,ios::cur);
    }
}
else if(ch=='>')
{  ch=myfile.get();
  if(ch=='=')
     insertresult(rop_buxiaoyu,0); 
    else
    {insertresult(rop_dayu,0);
    myfile.seekg(-1,ios::cur);
    }
}
else if(ch=='<')
{  ch=myfile.get();
  if(ch=='=')
     insertresult(rop_budayu,0); 
    else
    {insertresult(rop_xiaoyu,0);
    myfile.seekg(-1,ios::cur);
    }
}
else
{if(ch!=-1)
{myfile.seekg(-1,ios::cur);
  myfile.get(strtoken,10);
  cout<<"ERROR :"<<strtoken<<endl;
  myfile.seekg(1,ios::cur);

}
  }
  myfile.close();
  cout<<"词法分析成功啦!!"<<endl;
}
/**********************************词法分析函数结束***********************/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值