递归下降子程序的编写

简介: 该内容是关于一个递归下降解析器的实现,用于判断给定的算术表达式是否符合特定的文法。文法定义如下:

1.针对算术表达式文法:

         E→TE’

         E’ → +TE’|ε

         T→FT’

         T’ →*FT’ |ε

         F→(E) |i

为其编写递归下降子程序,判定某个算术表达式是否正确:如j+k*m,j*k+m

输入:其输入数据应该为词法分析器输出的记号形式:i+i*i,i*i+i

输出:分析结果:算术表达式结构正确或结构错误。

[评论可见]隐藏内容 - 管理员可见

#include <iostream>

using namespace std;

char token[100];

int localhead = 0;

void E();

void E_();

void T();

void T_();

void F();

void match(char local);

void error();

int main() {

   char ch;

   int i = 0;

   cout << "请输入:";

   cin >> token;

   E();

   if(localhead!=strlen(token)){

       error();

   }

   return 0;

}

void match(char local) {

   if (token[localhead] == local) {

       localhead++;

   } else {

       error();

   }

}

void E() {

   cout << "E->TE'" << endl;

   T();

   E_();

}

void E_() {

   if (token[localhead] == '+') {

       cout << "E'->+TE'" << endl;

       match('+');

       T();

       E_();

   } else {

       cout << "E'->ε" << endl;

   }

}

void T() {

   cout << "T->FT'" << endl;

   F();

   T_();

}

void T_() {

   if (token[localhead] == '*') {

       match('*');

       cout << "T'->*FT'" << endl;

       F();

       T_();

   } else {

       cout << "T'->ε" << endl;

   }

}

void F() {

   if (token[localhead] == 'i') {

       match('i');

       cout << "F->i" << endl;

   } else if (token[localhead] == '(') {

       match('(');

       E();

       if (token[localhead] == ')') {

           cout << "F->(E)" << endl;

           match(')');

       } else {

           error();

       }

   }

}

void error() {

   cout << "产生错误";

}

目录
相关文章
|
13天前
|
自然语言处理 Java C++
递归下降子程序文法部分编写
`char`和`num dotdot num`的定义。如果遇到不匹配,原本计划调用`error`函数来报告错误,但在这个例子中,`error`函数并未实现。程序通过`main`函数获取用户输入并启动解析过程。
7 0
|
8月前
|
存储 算法 数据处理
for 循环嵌套 for 循环,你需要懂的代码性能优化技巧!
本篇分析的技巧点其实是比较常见的,但是最近的几次的代码评审还是发现有不少兄弟没注意到。 所以还是想拿出来说下。
194 4
|
缓存 算法 Java
使用迭代优化递归程序
大家好,我是王有志。 今天我们将会分析上篇文章中递归算法存在的问题,并通过迭代去优化。
85 1
使用迭代优化递归程序
vba程序用7重循环来计算24
vba程序用7重循环来计算24
60 0