洛谷P11738 [集训队互测 2015] 未来程序改

news/2025/10/4 12:00:58/文章来源:https://www.cnblogs.com/kibrel/p/19125460/P11738

懒得写这么大的模拟了,想学的可以去看看我的项目QAQ

很显然,这是一道编译原理题目(我的专项awa)

编译原理 - 编译器结构

首先,编译器由Lexer,Parser,(Codegen,Optimizer)组成
然而严格来讲这道题需要的是解析器,那么结构变成:
Lexer, Parser, Interpreter

Lexer

Lexer负责生成tokens(符号表),就比如说:

#include<iostream>
#include<cstdio>
using namespace std;int main() {return 0;
}

依据题意,你可以舍弃前三行,然后利用正则表达式进行搜索。
很显然你看到了题目给你的上下文无关法里面有:

NAME ::= 仅包含大小写字母、数字、下划线的非空字符串,且不以数字开头。

转换为正则表达式就是:

[a-zA-Z_][a-zA-Z0-9_]*

还有整数

INT_CONSTANT ::= 仅包含数字的非空字符串,且不以0开头,或这个字符串就是0。

转换为正则表达式就是:

[1-9][0-9]*|0

然后你就可以利用std::regex正则表达式进行搜索了。

当然,你还要使用regex搜索一些关键字:

int, if, for, while, return, cin, cout, endl

以及一些符号(自己看上下文无关法)

Parser

Parser负责生成AST(抽象语法树),那么你需要根据上下文无关法生成对应的语法树节点。

首先你需要定义一个节点类,然后根据上下文无关法生成对应的节点,比如:

// shared_ptr是C++11引入的智能指针,用于自动管理内存
#include<memory>
using namespace std;
class Node{public:AstType type; // 节点类型Token token; // 节点对应的tokenvector<shared_ptr<Node>> children; // 子节点Node(AstType type, Token token) : type(type), token(token) {} // 构造函数
};

然后你需要根据上下文无关法生成对应的节点,比如:

// 生成一个变量声明节点
shared_ptr<Node> varDecl(Token name, Token type) {shared_ptr<Node> node(new Node(AstType::VarDecl, name));node->children.push_back(make_shared<Node>(AstType::Type, type));return node;
}

然后自上而下依次解析递归生成语法树。(还是那句话,自己看上下文无关法)
比如:

#include<iostream>
#include<cstdio>
using namespace std;int main() {return 3*1-2;
}

对应的语法树就是:

intmain[] // 没有参数,所以是空数组(STATEMENTS)return(EXPRESSION)*31-2

Interpreter

Interpreter负责解释AST,那么你需要根据上下文无关法解释对应的语法树节点。

首先你需要写一个虚拟机进行输入输出流控制:

class VM {public:// cin从输入流中读取一个整数// cout输出一个整数到输出流中// putchar输出一个字符到输出流中// endl输出一个换行符到输出流中
}

当然,虚拟机的属性是static

假设你现在有N个整数要输入,那么你可以:

deque<int> istream; // 输入流
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {int x;scanf("%d", &x);istream.push_back(x);
}

然后你就可以在VM中写一个cin函数了:

int cin() {int x = istream.front();istream.pop_front();return x;
}

在解析树中,你可以用类似DFS的方法来解释语法树节点。比如:

void Interpreter::visit(Node* node) {switch (node->type) {case AstType::Program:visitProgram(node);break;case AstType::VarDecl:visitVarDecl(node);break;case AstType::Type:visitType(node);break;/*...*/}
}

visitProgram中,你需要遍历语法树中的所有VarDecl节点,然后调用visitVarDecl来解释这些节点。在visitVarDecl中,你需要解释Type节点,然后解释Identifier节点,最后解释Expression节点。
当你使用cin或者cout时,你需要调用VM中的对应函数。

最后,你需要写一个main函数来运行你的解释器:

int main() {// 读取输入// 构造语法树// 解释语法树return 0;
}

结语

由于代码过长(且过于麻烦),这里就不贴了(实则没写)。如果有对编译原理感兴趣的童鞋可以去看看我自己写的编程语言:
Cabbagelang

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/927107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mcp 面试题

什么是 MCP(Model Context Protocol) MCP 是 OpenAI 推出的 大模型上下文交互协议。它的作用是标准化 LLM 与外部工具、数据源、事件系统的交互方式。 在没有 MCP 之前,开发者需要为每个插件单独设计接口,成本高且…

做qq空间动态皮肤网站网络营销常用的方法

个人博客&#xff1a;代码菌-CSDN博客 专栏&#xff1a;C杂货铺_代码菌的博客-CSDN博客 目录 &#x1f308;前言&#x1f308; &#x1f4c1; 初始化列表&#xff08;灰常重要&#xff09; &#x1f4c2; 引入 &#x1f4c2; 概念 &#x1f4c2; 特性 &#x1f4c1; 拓展构…

6_什么是知识图谱

知识图谱(Knowledge Graph)是一种用于表示和存储知识的结构化数据模型。它以图的形式组织信息,其中实体(entities)作为节点,关系(relationships)作为边,形成一个相互连接的知识网络。 知识图谱的核心特点:实…

实用指南:[创业之路-645]:手机属于通信?还是属于消费类电子?还是移动互联网?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【开题答辩过程】以《基于SpringBoot+Vue+uni-app的智慧校园服务系统的设计与搭建》为例,不会开题答辩的可能进来看看

【开题答辩过程】以《基于SpringBoot+Vue+uni-app的智慧校园服务系统的设计与搭建》为例,不会开题答辩的可能进来看看pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !importan…

c 网站开发案例专业网络推广方案

C语言acm竞赛习题集锦.doc杭州电子科技大学 acm 习题精选 第 1 页 共 21 页 目录 1、 数塔问题 2 2、 并查集类问题 4 3、 递推类问题 9 4、 动态规划系列 10 5、 概率类题型 13 6、 组合数学类题型 15 7、 贪心策略 16 8、 几何问题 .19 杭州电子科技大学 acm 习题精选 第 2 页…

丽水做网站公司本地电脑做服务器建网站

0x00 简介本期主要会教大家如何从流量中还原出来文件。下面我将会用多种办法来讲解。使用系统&#xff1a;Kali Linux0x01 tcpxtract工具网络流量提取文件(方法1)Kali Linux默认没有安装该工具&#xff0c;需要自己安装安装命令&#xff1a;sudo apt install tcpxtract使用方法…

微信ipad协议个微机器人开发API

微信ipad协议个微机器人开发API,微信群机器人API 微信iPad协议,采用最新的ASE加密,以及最新的算法,iPad协议是一套微信个人号接口,基于web开发,它能实现微信中的百分之八十的功能,并辅助微信执行各种操作,提供…

做乒乓球网站的图片网络建设与维护是什么工作

2.1 数组 &#xff08;1) 概述 定义 在计算机科学中&#xff0c;数组是由一组元素&#xff08;值或变量&#xff09;组成的数据结构&#xff0c;每个元素有至少一个索引或键来标识 因为数组内的元素是连续存储的&#xff0c;所以数组中元素的地址&#xff0c;可以通过其索引…

手机可以搭建网站么页面设计模板怎么写

谈一谈BEV和Transformer在自动驾驶中的应用 BEV和Transformer都这么火&#xff0c;这次就聊一聊。 结尾有资料连接 一 BEV有什么用 首先&#xff0c;鸟瞰图并不能带来新的功能&#xff0c;对规控也没有什么额外的好处。 从鸟瞰图这个名词就可以看出来&#xff0c;本来摄像头…

做 网站 技术支持 抓获seo优化工具推荐

1、模块化编程 c语言模块化编程实现思路设计代码 具体的程序实现代码如下所示 1&#xff1a;程序的头文件 2&#xff1a;程序的函数文件 3&#xff1a;程序的主文件控制函数的实现 持续更新中......

面向对象编程(OOP)的三大特性之一(封装、继承、多态)就是第八章聚焦于C++的多态(Polymorphism),这

面向对象编程(OOP)的三大特性之一(封装、继承、多态)就是第八章聚焦于C++的多态(Polymorphism),这pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: …

ai提交消息常用的 chore,原来是个单词(琐事/零散任务)+约定,用于非功能性提交

在使用 AI 辅助生成 Git 提交消息时,你经常会看到以 chore: 开头的提交信息,比如: chore: update dependencies chore: clean up unused files chore: reformat code with prettier那么,chore 到底是什么意思?✅ …

答疑解惑:无人机是否一定有主控,主控和飞控是一个东西吗,无人机是否只有飞控就可以飞行???

答疑解惑:无人机是否一定有主控,主控和飞控是一个东西吗,无人机是否只有飞控就可以飞行???相关: https://item.taobao.com/item.htm?ali_refid=a3_430582_1006%3A1123627528%3AN%3ACpoHEyrZTY3ym41xzFawEg%3D%…

健身器材网站源码广东品牌设计公司有哪些

网址如下&#xff1a; P2246 SAC#1 - Hello World&#xff08;升级版&#xff09; - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 刚开始是用递归做的&#xff0c;虽然用了哈希表优化&#xff0c;但是超时&#xff0c;只得了50 后面想到了一个新的算法&#xff0c;时间复杂度…

网站更换服务器对seo的影响吉安seo

前文 Flutter 是一个跨平台的开发框架&#xff0c;它允许开发者使用相同的代码库来构建 iOS、Android、Web 和桌面应用程序。 上文flutter开发多端平台应用的探索 上&#xff08;基本操作&#xff09;-CSDN博客列举了一些特定平台的case&#xff08;桌面端菜单&#xff0c;鼠…

博物馆网站模版海外广告公司

元素&#xff1a; 用法&#xff1a; 标签名&#xff1a;{style的内容} 特点&#xff1a; 全局性&#xff0c;使用后&#xff0c;所有的相同标签都是同一种样式。 举例&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UT…

多项式定理

多项式定理 \[\because (a_1+a_2+...+a_n)^m=\sum_{r_1+r_2+...+r_n=m} C_m^{r_1}C_{m-r_1}^{r_2}...C_{r_n}^{r_n} a_1^{r_1}a_2^{r_2}...a_n^{r_n} \quad (根据每个字母项对应的次数及系数的分配可得) \]\[\because …

The Brain in Your Toes: Can Tiny Foot Movements Boost BDNF and Sharpen the Mind? - 教程

The Brain in Your Toes: Can Tiny Foot Movements Boost BDNF and Sharpen the Mind? - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !imp…

一直好奇无人机飞控上的SD卡槽是不是用来装系统盘的,结果发现这个其实就是个数据存储的作用,飞控板子上自带系统盘存储芯片

一直好奇无人机飞控上的SD卡槽是不是用来装系统盘的,结果发现这个其实就是个数据存储的作用,飞控板子上自带系统盘存储芯片飞控烧录器: https://item.taobao.com/item.htm?abbucket=17&id=740054798017&mi…