递归下降语法分析程序
文法G[E]
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[cur++];
}
bool Match(char ch)
{
?? if(token == ch)
????? return true;
?? return false;
}
void IsSuccess()
{
?? if(Match('#'))
?? {
????? cout << "success!" << endl;
????? exit(0);
?? }
}
轉載于:https://www.cnblogs.com/CPFlying/archive/2010/04/27/1721913.html
總結
以上是生活随笔為你收集整理的递归下降语法分析程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux命令0424
- 下一篇: (转)挺好的一篇介绍字节序的文章