PL/Cool
毛子 2003 Petrozavodsk, Final Contest, 8.30.03.
G. PL/Cool
实现一个程序,使它读入一段PL/Cool程序,并输出它的结果.
PL/Cool语法
basics
一个PL/Cool程序由许多行指令组成.
一行一个指令.
对应实现: plc::command
指令类型:
- print [expr] 输出[expr]的运算结果.
- define [op1] [op2] 定义一个变量类型的宏,将底下的所有[op1]替换成[op2].注意:重复定义将会被忽略.循环定义也会被忽略.
实现:
struct command{
bool type;
AST* a,b;
};
其中,若type=1则该指令为define,a,b应该仅指向两个变量(可以是数字).
否则,直接输出exec(a).(print)
expr
[expr]可以通过栈解析为一棵语法树(AST).
对应实现:
struct AST{
int opr;
AST* a,b;
};
其中,a可以在必要时间转换为char*类型,表示一个变量(包括数字).
exec实现
递归调用exec求值AST的两个子树.若[AST].opr==0,则这是一个变量,调用内存管理获取数值.
define
在内存管理中将op1指向op2.
内存管理
注意到这个题目的一个性质:重复定义将会被忽略.循环定义也会被忽略.
首先来看第二个性质,容易发现这些指针能构成一个森林.这个问题在这个等价下,就是求一个森林中某个节点的树根.这是一个LCT的经典问题,具体就不描述了.观测第一个性质,发现它很有趣.用LCT维护的时候,这个性质并没有什么卵用.然而,考虑这棵树,它只会合并,不会分裂,那么就可以用并查集维护.
对于变量的解析
变量类型有两种,一种是标识符,一种是数字.对于标识符,我们可以用trie处理,当然同时也可以处理数字了.我们可以建三棵trie,一棵为标识符,两棵为数字.数字分正负储存,标识符不分大小写,每次插入时发现是新的就增加一个累加器并把这个作为这个变量的并查集索引.
整体构造
代码解析部分
- 字符串流
- 分词器. 可集成入字符串流
- 语法解析器. 可集成字符串流.
运算部分
- exec递归计算函数
- 变量求值器
- 变量赋值器
底层
- 并查集
分词系统
通过类型分词.
[' ','\n','\r'] -> space
PL/Cool的更多相关文章
- Oracle PL/SQL随堂笔记总结
1.pl/sql编程 2.存储过程 3.函数 4.触发器 5.包 6.pl/sql基础 -定义并使用变量 7.pl/sql的进阶 8.oracle的视图 1.pl/sql编程 1.理解oracle的p ...
- Oracle学习笔记十 使用PL/SQL
PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...
- PL/SQL配置Oracle数据库路径
打开PL/SQL-Tools->Preferences-Orcacle->Connecttion 找到配置路径,打开-product\instantclient_11_2\NETWORK\ ...
- PL/SQL连接错误:ora-12705:cannot access NLS data files or invalid environment specified
适合自己的解决方法: 排查问题: 1. 你没有安装Oracle Client软件.这是使用PL/SQL Developer的必须条件.安装Oracle Client后再重试.2. 你安装了多个Orac ...
- PL/SQL循环
1.if循环做判断 SET SERVEROUTPUT ON accept num prompt 'qinshuu'; DECLARE pnum NUMBER :=& num ; BEGIN T ...
- PL/0编译器实践---后记
花了几天时间,把清华版的<编译原理>一书中的PL/0编译器实践了一遍.颇有收获,记录如下: 理解代码的技巧,如何理解一份代码,比如这个程序,其逻辑相对于一般程序就比较复杂了,如何翻译,虚拟 ...
- PL/SQL存储过程编程
PL/SQL存储过程编程 /**author huangchaobiao *Email:huangchaobiao111@163.com */ PL/SQL存储过程编程(上) 1. Oracle应用编 ...
- PL/SQL连接Oracle数据库,中文乱码,显示问号
问题描述: 登陆PL/SQL,执行SQL语句后,输出的中文标题显示成问号????:条件包含中文,则无数据. 如果不是中文,需要修改注册表值,方法如下: 进入注册表:Win+r,输入re ...
- PL/SQL客户端中执行insert语句,插入中文乱码
问题描述:在PL/SQL客户端中执行insert语句,插入中文乱码 解决方案: 1.执行脚本 select userenv('language') from dual; 结果为AMERICAN_ ...
- PL/SQL Developer如何连接64位的Oracle图解
在64位Win7系统上安装64位的Oracle数据库,但是没有对应的64位PL/SQL Developer,此时就不能使用PL/SQL Developer来进行直接连接的,所以要想实现连接还得需要其他 ...
随机推荐
- OBJ Loader Source Code
https://github.com/ChrisJansson/ObjLoader http://www.codeproject.com/Articles/798054/SimpleScene-d-s ...
- JAVA GUI随笔
Java的布局管理器提供了一种层面的抽象,自动将用户界面映射到所有的窗口系统.GUI组件放置在容器中,它们的位置由容器的布局管理器来管理. 布局管理器是使用布局管理器类创建的. 注:同一个对象无论添加 ...
- sql FOR XML PATH
FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...
- JavaScript 函数参数传递到底是值传递还是引用传递
tips:这篇文章是听了四脚猫的js课程后查的,深入的理解可以参看两篇博客: JavaScript数据类型--值类型和引用类型 JavaScript数据操作--原始值和引用值的操作本质 在传统的观念里 ...
- yii2中事务不能回滚的解决
$player1 = Player::findOne(1); $player1->nickname = '111'; $player2 = Player::findOne(2); $player ...
- Java读取txt文件,计算2011年9月份的通话时间
public class test2 { /** * @param args * @throws IOException */ public static void main(String[] arg ...
- 【struts2】Result和ResultType
简单的说,Result是Action执行完后返回的一个字符串,它指示了Action执行完成后,下一个页面在哪里.Result仅仅是个字符串,仅仅是用来指示下一个页面的,那么如何才能够到达下一个页面呢? ...
- js使用split函数按照多个字符对字符串进行分割的方法
这篇文章主要介绍了js使用split函数按照多个字符对字符串进行分割的方法,实例分析了split函数的使用技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了js使用split函数按照多个 ...
- [CentOs7]图形界面
摘要 为了更方面的看到命令的执行后的效果,感觉安装一个图形界面,学习起来更有感觉.至少知道自己做了哪些事.在刚开始安装虚机的时候,选择了最小安装centos7,发现在使用命令安装图形界面的时候,尝试了 ...
- [Angularjs]ng-include 包含
写在前面 有时我们需要动态的创建一些标签,或者在收到服务端返回的json,创建一些标签然后找到页面上的元素,通过innerHTML写入到页面上面.angularjs也为我们提供了一种比较方便操作方式, ...