递归下降子程序的编写

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

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 << "产生错误";

}

目录
相关文章
|
前端开发 数据可视化 JavaScript
前端图形学实战: 从零开发一款轻量级滑动验证码组件(vue3 + vite版)
前端图形学实战: 从零开发一款轻量级滑动验证码组件(vue3 + vite版)
1347 0
|
SQL 存储 关系型数据库
轻松入门MySQL:数据库关联与多表查询,构建高效的业务决策引擎(6)
轻松入门MySQL:数据库关联与多表查询,构建高效的业务决策引擎(6)
354 0
代码随想录 Day46 动态规划14 LeetCode T392 判断子序列 T115 不同的子序列
代码随想录 Day46 动态规划14 LeetCode T392 判断子序列 T115 不同的子序列
|
11月前
|
人工智能 算法 Serverless
《主动式智能导购AI助手构建》解决方案用户评测
在部署体验过程中,官方提供的详尽文档和图表帮助新手轻松上手,但环境变量设置等问题仍需改进。解决方案采用Multi-Agent架构,百炼大模型实现精准推荐,函数计算优化响应速度。生产环境部署指导全面,但仍需加强异常处理和面向新手的教学资源。整体架构清晰高效,建议完善数据流描述及Router Agent算法逻辑的阐述。
309 10
《主动式智能导购AI助手构建》解决方案用户评测
|
Java
Java基础之日期和时间
Java基础之日期和时间
129 1
|
存储 JSON 前端开发
JSON与现代Web开发:数据交互的最佳选择
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也便于机器解析和生成。它以文本格式存储数据,常用于Web应用中的数据传输,尤其是在客户端和服务器之间。
715 1
|
安全 算法 Java
强大!基于Spring Boot 3.3 六种策略识别上传文件类型
【10月更文挑战第1天】在Web开发中,文件上传是一个常见的功能需求。然而,如何确保上传的文件类型符合预期,防止恶意文件入侵,是开发者必须面对的挑战。本文将围绕“基于Spring Boot 3.3 六种策略识别上传文件类型”这一主题,分享一些工作学习中的技术干货,帮助大家提升文件上传的安全性和效率。
695 0
【收藏】每个Windows XP版本的缩写
【收藏】每个Windows XP版本的缩写
|
存储 算法 Java
String类【JDK源码分析】
String类【JDK源码分析】
140 0