词法分析

#include <iostream>
#include <fstream>
#include <string>
#include <cctype>
using namespace std;

char KeyWord[21][12]={ "and","begin","const","div","do","else","end", "function","if","integer",
   "not","or","procedure","program","read","real","then","type","var","while","write" };
char jiefu[9][2]={",",";","(",")","[","]","{","}","#"};
char calfu[13][3]={ "++","--","+","-","*","/","=","<",">","<>","<=",">=",":="}; 
   
char strarray[20],ch;
int i=-1;
ifstream ifile;

int search(char a[],int typeID)
{
 int i=0;

 switch(typeID)
 {
 case 1: for(i=0;i<21;i++)
   {
    if(!strcmp(KeyWord[i],a))
     return i;
   }
   return 21;
   
 case 2: for(i=0;i<9;i++)
   {
    if(!strcmp(jiefu[i],a))
     return i+23;
   }

 case 3: for(i=0;i<13;i++)
   {
    if(!strcmp(calfu[i],a))
     return i+32;
   }
 }

 return -1;
}

char LetterProcess(char ch)
{
 while(isalpha(ch) || isdigit(ch) || ch=='_')    //关键字的判断
 {
  strarray[++i]=ch;
  ch=ifile.get();
 }
 strarray[i+1]='/0';
 if(search(strarray,1)!=-1)
  cout<<strarray<<"----->"<<search(strarray,1)<<endl;
 else
  cout<<"输入的"<<strarray<<"是非法字符!"<<endl;
 return ch;
}

char digitProcess(char ch)
{
 while(isdigit(ch))   
 {
  strarray[++i]=ch;
  ch=ifile.get();
 }
 strarray[i+1]='/0';
 cout<<strarray<<"----->"<<22<<endl;
 return ch;
}

char OtherProcess(char ch)
{
 if(ch==' ')
 {
  ch=ifile.get();
  return ch;
 }
 while(!isalpha(ch) && !isdigit(ch) && ch!=' ' && (ifile.eof()==0))   
 {
  strarray[++i]=ch;
  ch=ifile.get();
 }
 strarray[i+1]='/0';
 if(search(strarray,2)!=-1)
  cout<<strarray<<"----->"<<search(strarray,2)<<endl;
 else
  cout<<strarray<<"----->"<<search(strarray,3)<<endl;

 return ch;
}

void main()
{
 
 ifile.open("f://mystring.txt");

 ch=ifile.get();
 while(!ifile.eof())
 {
  if(isalpha(ch))
   ch=LetterProcess(ch);
  else if(isdigit(ch))
       ch=digitProcess(ch);
    else
    ch=OtherProcess(ch);
 }

 cout<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值