首页 > 其他分享 >编译实践学习 Part5

编译实践学习 Part5

时间:2024-06-23 10:31:23浏览次数:24  
标签:std return string 实践 symbols 编译 Part5 key const

License: CC BY-NC-SA 4.0

5.1

本节的 EBNF 中出现了一种新的表示: [ ... ], 这代表方括号内包含的项可被重复 0 次或 1 次. 也就是说, 单个分号在 SysY 程序中也是一个合法的语句. 在 AST 中, 你可以使用空指针或 Option 来表示这种结构.

但是,我拒绝。

class OptionalExpAST : public BaseAST {
public:
	std::optional<std::unique_ptr<ExpAST>> exp;
	void output(Ost &outstr, std::string prefix) const override;
};

将原来的 @a 改为 @a_1@a_2 什么的只要稍作修改:

void Koopa_val_named_symbol::set_id(std::string str) {
	id = str + "_" + std::to_string(named_var_cnt);
	named_var_cnt++;
}

由于之前将符号表定义成 unordered_map,现在改的时候将其改成一个类:

template<typename T>
class Symbol_table_stack {
	std::list<std::unordered_map<std::string, T>> symbols;

public:
	auto empty_iter() const {
		return symbols.front().end();
	}
	auto find(const std::string& key) {
		for(auto i = symbols.rbegin(); i != symbols.rend(); i++) {
			auto val_iter = i->find(key);
			if(val_iter != i->end()) {
				return val_iter;
			}
		}
		return symbols.front().end();
	}
	bool contains(const std::string& key) { return find(key) != empty_iter(); }
	T& operator[](const std::string& key) {
		if(contains(key)) {
			return find(key)->second;
		} else {
			return symbols.back()[key];
		}
	}
	void add_table() { symbols.emplace_back(); }
	void del_table() { symbols.pop_back(); }
};

Symbol_table_stack<Koopa_val> symbol_table;

意料之中的 WA 了。小样例过了,但第一个数据就没过.

int main(){
    {}
    return 0;
}

参考了 github 上 BerkinChen/pku-compiler 的实现。发现加个特判就完事了。

然后就是一些之前遗留的(没改干净的)代码。改了改成功 AC。

标签:std,return,string,实践,symbols,编译,Part5,key,const
From: https://www.cnblogs.com/x383494/p/18263137

相关文章

  • petalinux编译出错解决方法
    petalinux编译若干出错解决方法问题一:ERROR:qemu-xilinx-native-v4.1.50-xilinx-v2020.1+gitAUTOINC+e371d99ac1-r0do_fetch:FetcherfailureforURL:‘gitsm://github.com/Xilinx/qemu.git;protocol=https;branch=branch/xilinx-v2020.1’.UnabletofetchURLfro......
  • 【JavaScript脚本宇宙】革新前端样式:CSS-in-JS库大比拼与最佳实践
    解锁响应式设计的潜力:使用CSS-in-JS库构建动态样式前言随着前端技术的发展,CSS-in-JS(CSSinJavaScript)逐渐得到开发者的青睐。它通过将CSS样式定义在JavaScript中,利用JavaScript的强大特性,实现了更灵活、动态的样式管理方式。本文将介绍几个流行的CSS-in-JS库,包括styled-c......
  • 在windows下使用cmd命令行对java文件进行编译和执行
    系列文章目录文章目录系列文章目录前言前言前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。windows下利用cmd命令行可以调用jdk里的javac.exe和java.exe对java文件进......
  • 538个代码示例!麻省理工教授的Python程序设计+人工智能案例实践
    Python简单易学,且提供了丰富的第三方库,可以用较少的代码完成较多的工作,使开发者能够专注于如何解决问题而只花较少的时间去考虑如何编程。此外,Python还具有免费开源、跨平台、面向对象、胶水语言等优点,在系统编程、图形界面开发、科学计算、Web开发、数据分析、人工智能等方面......
  • 交叉编译Valgrind
    参考:https://www.cnblogs.com/yucloud/p/armbuild_valgrind3.htmlhttps://blog.csdn.net/Reasonss/article/details/111218224源码下载地址valgrind3.23.0https://valgrind.org/downloads/current.html安装依赖sudoapt-getinstalllibc6-dbgsudoapt-getinstallauto......
  • SDN VMware NSX网络原理与实践- NSX-V 安全【2.8】
    7.1.2部署NSXEdge服务网关的资源分配        在部署NSXEdge服务网关的开始阶段,需要选择部署的Size。具体部署的资源分配如图7.2所示。其中,Compact的NSXEdge主要用于实验环境;Large的NSXEdge主要用于一般生产环境;当需要针对南北向流量实现高性能......
  • 掌握 Nuxt 3 中的状态管理:实践指南
    title:掌握Nuxt3中的状态管理:实践指南date:2024/6/22updated:2024/6/22author:cmdragonexcerpt:摘要:该文指南详述了Nuxt3的概况与安装,聚焦于在Nuxt3框架下运用Vuex进行高效的状态管理,涵盖基础配置、模块化实践至高阶策略,助力开发者构建高性能前后端分离应用。ca......
  • 软文外链的获得方式:策略与实践
    在数字营销和内容推广的领域中,软文外链一直被视为提升网站权重、增加流量以及提高品牌曝光度的重要手段。然而,如何有效地获取软文外链,却是一个需要策略和技巧的问题。本文将探讨软文外链的获得方式,帮助读者更好地理解和应用这一营销手段。一、内容为王:创造高质量软文软文外链......
  • 机器学习python实践——由特征选择引发的关于卡方检验的一些个人思考
    最近在用python进行机器学习实践,在做到特征选择这一部分时,对于SelectPercentile和SelectKBest方法有些不理解,所以去了查看了帮助文档,但是在帮助文档的例子中出现了"chi2",没接触过,看过去就更懵了,查了一下资料知道"chi2"是在求卡方值,又没接触过,我整个人都裂了,但是还是耐着性子去......
  • RAG与LLM原理及实践(2)--- RAG结合LLM function调用的原理及落地实践
    花一点时间继续写下,RAG结合LLM。通过上一篇文章你应该知道为什么RAG要结合LLM,或者说为什么LLM要结合RAG使得LLM更强大,特别是当LLM应用在人机对话等方面的时候。只要涉及一问一答,并通过上下文继续丰富对话,就会涉及到他。这个是看事情的两个维度。就像是买钟送电池还是买电池送......