毛子 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. 使用github和hexo搭建博客

    title: How to build your blog by Hexo in github Welcome to huihuang's blog,you will find what you ex ...

  2. asp.net(C#)页面事件顺序

    asp.net(C#)页面事件顺序 http://www.cnblogs.com/henw/archive/2012/02/09/2343994.html   1 using System.Data; ...

  3. Spring中ApplicationContext对事件的支持

    Spring中ApplicationContext对事件的支持   ApplicationContext具有发布事件的能力.这是因为该接口继承了ApplicationEventPublisher接口. ...

  4. Python之路【第五篇】:面向对象编程

    面向对象编程思维导向图

  5. JS获取当前对象大小以及屏幕分辨率等...

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <meta nam ...

  6. fedora各个版本的下载地址archive

    archive: ['a:kaiv] she went to the city archive this morning. ==================== === fedora 的下载地址是 ...

  7. Myeclipse中的web项目审查(jquery-2.1.1.min.js)出现错误

    前言,本来在把web项目搞得好看一些,从网上下载了一个很炫酷的模板导入web中,无奈出现了错误,如下:

  8. 浏览器兼容性之JavaScript篇

    近期公司职务变动,我大部分工作时间都在做web前端开发.工作性质主要是跟javascript和css(层叠样式表)打交道,而JavaScript兼容性一直是Web开发者的心病,当然我也不例外,虽然我大 ...

  9. JS快速获取图片宽高的方法

    快速获取图片的宽高其实是为了预先做好排版样式布局做准备,通过快速获取图片宽高的方法比onload方法要节省很多时间,甚至一分钟以上都有可能,并且这种方法适用主流浏览器包括IE低版本浏览器. 我们一步一 ...

  10. java之stream(jdk8)

    一.stream介绍 参考: Java 8 中的 Streams API 详解   Package java.util.stream   Java8初体验(二)Stream语法详解   二.例子 im ...