毛子 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的更多相关文章

  1. Oracle PL/SQL随堂笔记总结

    1.pl/sql编程 2.存储过程 3.函数 4.触发器 5.包 6.pl/sql基础 -定义并使用变量 7.pl/sql的进阶 8.oracle的视图 1.pl/sql编程 1.理解oracle的p ...

  2. Oracle学习笔记十 使用PL/SQL

    PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言,是对 SQL 的扩展,它支持多种数据类型,如大对象和集合类型,可使用 ...

  3. PL/SQL配置Oracle数据库路径

    打开PL/SQL-Tools->Preferences-Orcacle->Connecttion 找到配置路径,打开-product\instantclient_11_2\NETWORK\ ...

  4. PL/SQL连接错误:ora-12705:cannot access NLS data files or invalid environment specified

    适合自己的解决方法: 排查问题: 1. 你没有安装Oracle Client软件.这是使用PL/SQL Developer的必须条件.安装Oracle Client后再重试.2. 你安装了多个Orac ...

  5. PL/SQL循环

    1.if循环做判断 SET SERVEROUTPUT ON accept num prompt 'qinshuu'; DECLARE pnum NUMBER :=& num ; BEGIN T ...

  6. PL/0编译器实践---后记

    花了几天时间,把清华版的<编译原理>一书中的PL/0编译器实践了一遍.颇有收获,记录如下: 理解代码的技巧,如何理解一份代码,比如这个程序,其逻辑相对于一般程序就比较复杂了,如何翻译,虚拟 ...

  7. PL/SQL存储过程编程

    PL/SQL存储过程编程 /**author huangchaobiao *Email:huangchaobiao111@163.com */ PL/SQL存储过程编程(上) 1. Oracle应用编 ...

  8. PL/SQL连接Oracle数据库,中文乱码,显示问号

    问题描述: 登陆PL/SQL,执行SQL语句后,输出的中文标题显示成问号????:条件包含中文,则无数据.         如果不是中文,需要修改注册表值,方法如下: 进入注册表:Win+r,输入re ...

  9. PL/SQL客户端中执行insert语句,插入中文乱码

    问题描述:在PL/SQL客户端中执行insert语句,插入中文乱码 解决方案: 1.执行脚本 select userenv('language') from dual;    结果为AMERICAN_ ...

  10. PL/SQL Developer如何连接64位的Oracle图解

    在64位Win7系统上安装64位的Oracle数据库,但是没有对应的64位PL/SQL Developer,此时就不能使用PL/SQL Developer来进行直接连接的,所以要想实现连接还得需要其他 ...

随机推荐

  1. Ubuntu 14.04 LTS 更新源大全

    Ubuntu 14.04 LTS 系统更新源汇总 如何使用这些系统更新源?---三步走 首先备份源列表: sudo cp /etc/apt/sources.list /etc/apt/sources. ...

  2. CentOS安装oracle12C

    安装虚拟系统CentOS6.5,分配给至少1G的内存,其他条件适当高些,具体参考官方文档 一.安装数据库: 1.安装依赖软件包 yum install binutils -y yum install ...

  3. C++ default 和delete的新用法

    C++中的默认函数与default和delete用法一. 类中的默认函数a.类中默认的成员函数1.默认构造函数2.默认析构函数3.拷贝构造函数4.拷贝赋值函数5.移动构造函数6.移动拷贝函数 b.类中 ...

  4. 固定IP 正常访问谷歌

    如题 地址栏直接输入 http://173.194.1.150/ 正常使用 ~标记一下~

  5. Redis安装及主从配置(转)

    一.何为Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有 ...

  6. [CentOS]安装命令行终端Terminator工具

    摘要 Terminator是一款跨平台的终端工具,使用的是 GPL 许可证,提供了很多高级的功能.它没有 Guake 和 Yakuake 那样光鲜,但绝对是一款重型武器.它提供的功能包括界面分块,将自 ...

  7. background的css 排列顺序写法?

    可以按顺序设置如下属性(可点击进入相应的css手册查看使用): background-color 背景颜色 background-image 背景图片 background-repeat 背景重复 b ...

  8. shell学习之路:重定向符号的使用

    http://note.youdao.com/share/?id=096963bf2a0862fd338919d781636be2&type=note 快捷键:   ​  

  9. Codeforces Round #268 (Div. 2) ABCD

    CF469 Codeforces Round #268 (Div. 2) http://codeforces.com/contest/469 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了 ...

  10. HTTP协议详解(真的很经典)

    HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展.目前在WWW中使用的是HTTP/1.0 ...