C 模拟词法分析

类别:编程语言 点击:0 评论:0 推荐:

#include<iostream.h>
#include<fstream.H>
#include<stdlib.h>
#include<string.h>

bool letter(char);
bool digit(char);
char keyword[7][7]={"begin","end","if","then","else","while","do"};
char character;  //字符变量,存放最新读进的源程序字符
char token[50];
bool flags; //字符数组,存放构成单词符号的字符串

bool putchar()
{
 cout<<"您是否是把代码文件写入了analyze.dat文件中?[y(Y)/n(N)]..."<<endl;
 char get1;
 cin>>get1;
 if(get1=='Y'||get1=='y')
 {
  return true;
 }
 else
 {
  return false;
 }
}
//-----------------------
void getbc()
{
 if(character==' '||character==char(10))
 {  
  if(strlen(token)!=0)
  {
   for(int k=0;k<7;k++)
   {
    int a;
   if(strlen(keyword[k])>strlen(token))
    a=strlen(keyword[k]);
   else
    a=strlen(token);
    if (!strncmp(keyword[k],token,a))
    {
     cout<<"< "<<token<<" , 保留字>"<<endl;
     flags=false;
     goto Loop;
    }
   }
   if(!strncmp("+",token,1)||!strncmp("-",token,strlen(token)))
   {
    cout<<"< "<<token<<" , 算术运算符>"<<endl;
    flags=false;
    goto Loop;
   }
    else if(!strncmp("<",token,1)||!strncmp("<=",token,strlen(token))||!strncmp("=<",token,strlen(token))||!strncmp("<>",token,strlen(token))||!strncmp("=",token,strlen(token))||!strncmp(">=",token,strlen(token))||!strncmp(">",token,strlen(token)))
   {
    cout<<"< "<<token<<" , 关系运算符>"<<endl;
    flags=false;
    goto Loop;
   }
    else if(!strncmp(":=",token,2))
    {
     cout<<"< "<<token<<" , 赋值运算符>"<<endl;
     flags=false;
    goto Loop;
   }
     else if(!strncmp(":",token,strlen(token)))
    {
     cout<<"< "<<token<<" , 冒号>"<<endl;
     flags=false;
    goto Loop;
   }
      else if(!strncmp(";",token,strlen(token)))
    {
     cout<<"< "<<token<<" , 分号>"<<endl;
     flags=false;
    goto Loop;
   }
      else if (!strncmp(")",token,strlen(token)))
      {
        cout<<"< "<<token<<" , 右括号>"<<endl;
     flags=false;
    goto Loop;
      }
       else if (!strncmp("(",token,strlen(token)))
      {
        cout<<"< "<<token<<" , 左括号>"<<endl;
     flags=false;
    goto Loop;
      }
    else
    {
     if (flags==true)
     {
      cout<<"< "<<token<<", 数>"<<endl;
      flags=false;
      goto Loop;
     }else
       cout<<"< "<<token<<", 标示符>"<<endl;
     flags=false;
      goto Loop;
    }  
Loop:       for(int j=strlen(token);j>=0;j--)
    token[j]='\0';    
  }
 }
 else if(digit(character))
 {
       token[strlen(token)]=character;
    if(strlen(token)==1)
    {
    flags=true;
    }
 }
 else if(letter(character))
 { 
   token[strlen(token)]=character;
 }
 else
  token[strlen(token)]=character;
}


bool letter(char character1)
{
 if(((char(97)<=character1)&&(character1<=char(122)))||((char(65)<=character1)&&(character1<=char(90))))
  return true;
 else
  return false;
}


bool digit(char character1)
{
 if((char(48)<=character1)&&(character1<=char(57)))
  return true;
 else
  return false;
}

void main()
{
 bool one;
 one=putchar();
 if(one==false)
 {
  cout<<"请准备好了代码再运行此文件"<<endl;
 }
 else
 {
  fstream infile;
  infile.open ("analyze.dat",ios::in);
  char ch;
  while(infile.get (ch))
  {
   character=ch;
   getbc();
  }
  int tmp;
  cin>>tmp;
 }
}

说明:单词间要有空格!

本文地址:http://com.8s8s.com/it/it27164.htm