如何A掉未来程序改
2015-09-28 21:47
357 查看
话说有这样一道神题:【集训队互测2015】未来程序·改。
大意是要求写一个简单的C++解释器!这里去掉了C++的许多特性,连简单的
话说NOI被屠了之后,一时心血来潮,打算A了这道题。最近的一个星期闲着无聊(其实还是很多事要做),在历经险阻之后,终于A掉这道丧心病狂的OI题。
虽然我没有看过任何关于解释器的理论,但我觉得好像还是可以凭自己乱搞出来的,于是便开始了这长达一周的旅程。估计写了4h的代码,调试2h。
听说可以用语言分析树这样高大的东西来做,我看到其他A了的3个人就是用这样的东西的。Orz,以后有机会找来学学。
我认为我的代码有三个最主要的部分,实现了之后发现写掉这题也不算太难。
这里的i就是不一样的,运行后输出
我是用了
首先要把所有的函数都预先找到它们的位置,然后写两个函数:
这里
至于怎么写
下面是一些主要的问题和解决方法:
正号和负号怎么处理?
预处理下,把
有右结合的运算符,比如
当有一个新符号加入时,我们通过这样的判断就能解决这个问题:
cout这些特殊的怎么处理?
我们只需要标记一下就可以了(把它作为一个特殊变量)。
数组和函数的参数怎么处理?
比如
然后写好了这些我们就可以快乐地AC了!
代码链接。感觉用C++写C++解释器有点逗呢。
大意是要求写一个简单的C++解释器!这里去掉了C++的许多特性,连简单的
break和
continue都没有了!
话说NOI被屠了之后,一时心血来潮,打算A了这道题。最近的一个星期闲着无聊(其实还是很多事要做),在历经险阻之后,终于A掉这道丧心病狂的OI题。
虽然我没有看过任何关于解释器的理论,但我觉得好像还是可以凭自己乱搞出来的,于是便开始了这长达一周的旅程。估计写了4h的代码,调试2h。
听说可以用语言分析树这样高大的东西来做,我看到其他A了的3个人就是用这样的东西的。Orz,以后有机会找来学学。
我认为我的代码有三个最主要的部分,实现了之后发现写掉这题也不算太难。
变量储存
就是将单个的变量和数组储存起来的一个东西。最最困难的一个地方是有些变量重名,但是不是同一个量,比如:int i; i = 10; if (i) { int i; i = 0; if (i) { cout << 1; } else cout << 0; }
这里的i就是不一样的,运行后输出
0。
我是用了
map<string, stack<Variable> >,来保存的,每次遇到左大括号时标记一下,遇到右大括号就清理一下。由于变量的读写是非常普遍的,而在这里由使用了map,所以导致了程序运行速度慢,不管啦,反正可以过就可以了,其实可以用hash代替。
语句执行
主要的思想是维护一些光标(我管它叫光标),光标就是一个变量,保存着程序运行到哪里。首先要把所有的函数都预先找到它们的位置,然后写两个函数:
Return runStatement(int startPosition);
Return runFunction(int startPosition, const vector<int> ¶ms);
这里
Return是一个结构体,记录返回的值、返回的命令(
return,
continue,
break,虽说这里没有后面两个)以及运行完这个语句/函数后到哪个位置。
至于怎么写
runStatement,就主要靠下面的了。
表达式计算
一个经典的方法就是运用栈,一个符号栈,一个变量栈。下面是一些主要的问题和解决方法:
正号和负号怎么处理?
预处理下,把
+(正号,不是加号)变为
$+。并且注意它们是右结合的。
有右结合的运算符,比如
=。
当有一个新符号加入时,我们通过这样的判断就能解决这个问题:
while (levelCur < levelTop || (levelCur == levelTop && ! rightCombine(opt))) ...。
cout这些特殊的怎么处理?
我们只需要标记一下就可以了(把它作为一个特殊变量)。
数组和函数的参数怎么处理?
比如
f(1, 3, 2, 5),我们把f当作一个右结合的四目运算符就可以了。
然后写好了这些我们就可以快乐地AC了!
代码链接。感觉用C++写C++解释器有点逗呢。
相关文章推荐
- Codefoeces 581B Luxurious Houses
- Java基础知识强化之IO流笔记09:File类功能
- C#调用外部exe
- MySql相关及如何删除MySql服务
- 关于ClassNotFoundException(404)问题的解决
- gson使用
- Codeforces Beta Round #4 (Div. 2 Only)——D. Mysterious Present
- [LeetCode-27] Remove Element(从数组删除指定的元素)
- 至尊问题
- user-agent中的mozilla
- 机器学习笔记 贝叶斯学习(下)
- Dao设计模式
- 内部类
- virtualbox虚拟硬盘迁移
- 栈
- 洛谷1972 [SDOI2009]HH的项链(链表+树状数组)
- java中string对象赋值
- spring 构造注入
- c语言指针的之交换两个数的值
- 2015年9月28日作业(信息系统项目管理师学员)