xaut3 发表于 2010-4-27 13:28:40

递归下降语法分析程序

属于编译的,内层的东西了 呵呵

文法G
E –> E + T | T
T –> T + F | F
F –> i | (E)

消除左递归
E –> TE’
E’-> +TE’
E’-> ε
T –> FT’
T’–> *FT’
T’-> ε
F -> i|(E)

编码实现
#include<iostream>
using namespace std;

void E();
void E1();
void T();
void T1();
void F();

char ReadToken();
bool Match(char a);
void IsSuccess();

char token;
int cur = 0; // 当前字符索引
char *str = "i+i*i+(i*i)#"; // 语句

void main()
{
    ReadToken();
   if(!Match('#'))
      E();
}
void E()
{
   T();
   E1();
}
void T()
{
   F();
   T1();
}
void E1()
{
   if(Match('+'))
   {
      ReadToken();
      IsSuccess();
      T();
      E1();
   }
}
void T1()
{
   if(Match('*'))
   {
      ReadToken();
      IsSuccess();
      F();
      T1();
   }
}
void F()
{
   if(Match('('))
   {
      ReadToken();
      IsSuccess();
      E();
      if(Match(')'))
      {
      ReadToken();
      IsSuccess();
      }
      else
      {
      cout << "error" << endl;
      }
   }
   else if(Match('i'))
   {
      ReadToken();
      IsSuccess();
   }
   else if(Match('#'))
   {
      cout << "success" << endl;
   }
   else
   {
       cout << "error" << endl;
   }
}
char ReadToken()
{
   return token = str;
}
bool Match(char ch)
{
   if(token == ch)
      return true;
   return false;
}
void IsSuccess()
{
   if(Match('#'))
   {
      cout << "success!" << endl;
      exit(0);
   }
}

weng991225 发表于 2010-4-28 21:20:03

让我看看吧,谢谢

weng991225 发表于 2010-4-28 21:24:00

为啥还是不能看啊

weng991225 发表于 2010-4-28 21:26:23

原来是这么回复啊
页: [1]
查看完整版本: 递归下降语法分析程序

招聘斑竹