lisp的解释器

Description

XXC小童鞋对lisp非常感兴趣,不过lisp是一个比较小众的黑客语言,因为它采用了一种不太容易理解的表达方式——S表达式。 S表达式形式如下:

(Operation A B……)

其中Operation是操作符,A、B等是操作数(操作数的数量根据操作符而定),A、B等可以是直接的数,也可以是其他S表达式。算式的结果为A (Operation) B.例如(+ 1 2)=3. 现在XXC童鞋希望你为他做一个简化版的lisp解释器,可以处理基本的四则二元运算。

Input

第一行包含一个整数N,代表用例个数。(N≤100) 接下来的N行每行包含一个用例,每一个用例包含一个lisp表达式,涉及四种二元操作符(+、-,*,/),嵌套层数不超过200。 善良的XXC童鞋希望解释器可以简单一点,所以在S表达式中,每个操作数都是整数类型。(注意到整数除法中,7/2=3.) 数据保证不会出现除0,不会超出int的范围

Output

对于给定的表达式,请给出其计算后的结果,形如“Case #id: result”

Sample Input

3

(+ 1 2)

(/ 1 3)

(/ 6 (+ 1 2))

Sample Output

Case #1: 3

Case #2: 0

Case #3: 2

Source

第八届北京交通大学ACM程序设计竞赛

#include <iostream>
#include <stack>
#include <string.h>
#include <stdlib.h>
using namespace std;
int main()
{
    char  str [10000];
    int count;
    cin>>count;
    cin.getline(str,200);
    int t=count;
    while(t--){
        stack<double> Num;
        stack<char> Op;
        cin.getline(str,10000);
        int len =strlen(str);//<string.h>
        int sum=0;
        for (int i = 0; i <len; i++)
        {
            char temp=str[i];
            if (temp==‘(‘)
            {
                Op.push(temp);
            }
            if (temp==‘+‘||temp==‘-‘||temp==‘*‘||temp==‘/‘)
            {
                Op.push(temp);
            }
            if (temp==‘)‘)
            {
                int c=Num.top();
                Num.pop();
                int b=Num.top();
                Num.pop();
                char Temp_Op=Op.top();
                if (Temp_Op==‘+‘)
                {
                    sum=b+c;
                    Op.pop();
                }
                if (Temp_Op==‘-‘)
                {
                    sum=b-c;
                    Op.pop();
                }
                if (Temp_Op==‘*‘)
                {
                    sum=b*c;
                    Op.pop();
                }
                if (Temp_Op==‘/‘)
                {
                    sum=b/c;
                    Op.pop();
                }
                Op.pop();
                Num.push(sum);
            }
            if (isdigit(temp))
            {
                int temp_num=atoi(&str[i]);  //<stdlib.h>
                while(i<len && isdigit(str[i]))
                {
                    i++;
                }
                i--;
                Num.push(temp_num);
            }
        }
        cout<<"Case #"<<count-t<<": "<<Num.top()<<endl;
    }
}  
时间: 2024-11-26 05:59:18

lisp的解释器的相关文章

[编译原理]用BDD方式开发lisp解释器(编译器)|开发语言java|Groovy|Spock

lisp是一门简单又强大的语言,其语法极其简单: (+ 1 2 ) 上面的意思 是:+是方法或函数,1 ,2 是参数,fn=1+2,即对1,2进行相加求值,结果是:3 双括号用来提醒解释器开始和结束. 之前在iteye写过一篇文章来简单介绍怎么写lisp的解释器: http://gyc567.iteye.com/blog/2242960 同时也画了一张草图来说明: 因为lexer(词法分析器)主要工作就是把程序的字符串表达式转化为tokens.(Pair),以下是百科对词法分析的说明: 词法分析

写一个简单的lisp解释器(1)

YouTube上看到了一个2004年版的SICP讲解 看完解释器那一个视频后,对解释器中的Eval和Apply有了基本的认识于是想开始直接写一个简单lisp的解释器 我的理解是: Eval是来求表达式的值的; Apply 则是用来求函数值的; 什么是表达式 ? atom 或者 a list of expression atom 包括 symbol number 还有 string number 和 string 都是代表它们自己 symbol 代表一个变量(variable) 它需要绑定一个值(

Dandelion - Eclipse Lisp Plugin

Common Lisp没有一个比较简单易用的IDE,网上推荐使用的都是LispBox,但是基于Emacs编辑器,使得学习以及使用的门槛过高. Eclipse是一个非常强大的可任意扩展的开发环境,所以我们可以使用Eclipse 下的Lisp插件.两年前我就寻找过,但是没有找到合适的,至于我为什么不自己开发一个= =.(我好囧).最近又找了一下,发现了一个Dandelion的项目,最近更新时间是2013年8月,嗯,果然是在我找过之后才出的插件,感谢项目组啊. 好了,不说废话了,献上项目地址了:htt

翻译:Lisp Style Tips for the Beginner - Heinrich Taube

Table of Contents 1. 赋值 2. 函数 3. 符号和变量 4. 列表 5. 条件 6. 循环 7. 注释 8. 格式和缩进 原文:Lisp Style Tips for the Beginner 本篇文章是一篇非正式的摘要,旨在帮助新手写出高效.易读的Lisp代码. 1 赋值 1.1 避免使用eval.赋值是Lisp内置的流程,所以你几乎没有任何理由自己调用它.如果你使用了它,那么请停下来并且重新思考一下你的问题,因为你解决问题的方法一定是错的. 1.2 熟悉宏.它是Lisp

17 个 Linux 下用于 C/C++ 的最好的 IDE

C++,一个众所周知的 C 语言的扩展,是一个优秀的.强大的.通用编程语言,它能够提供现代化的.通用的编程功能,可以用于开发包括视频游戏.搜索引擎.其他计算机软件乃至操作系统等在内的各种大型应用. C++,提供高度可靠性的同时还能够允许操作底层内存来满足更高级的编程要求. 虽然已经有了一些供程序员用来写 C/C++ 代码的文本编辑器,但 IDE 可以为轻松.完美的编程提供综合的环境和组件. 在这篇文章里,我们会向你展示一些可以在 Linux 平台上找到的用于 C++ 或者其他编程语言编程的最好的

基于ACIS/HOOPS的3D应用开发简介 【转】

(整理) 平台:                造型引擎——ACIS         显示引擎——Direct3D/OpenGL/GDI         应用框架——HOOPS   组件关系图   ACIS——造型引擎 ACIS是美国Spatial Technology公司推出的三维几何造型引擎,它集线框.曲面和实体造型于一体,并允许这三种表示共存于统一的数据结构中,为各种3D造型应用的开发 提供了几何造型平台.Spatial Technology公司在1986年成立,目前ACIS 3D Too

Lush手册——第一章 简介

简介 本章将展示Lush及其能力与特性. 1.1 Lush展示 Lush是一门面向对象的编程语言,是为对大规模数值运算与图形化应用感兴趣的研究人员.实验人员和工程师设计的.Lush用于以下场景,即想要将高级的.弱类型的解释性语言的灵活性,强类型的.本地编译型的语言的高效性,还有与C.C++等语言编写的代码容易结合这些特性组合在一起. 在与解释型语言(如Python.Perl.Matlab.S+甚至BASIC)和使用编译型语言(例如C语言)结合的相关工程上,Lush的优势尤其意义重大.通过使用Lu

为何 Emacs 和 Vim 被称为两大神器

Emacs 是神的编辑器,而 Vim 是编辑器之神.二者为何会有如此美誉,且听本文向你一一道来. Author: Jiqing Wu email: [email protected] homepage: http:://hi.baidu.com/jiqing0925 create: 2011-01-09 update: 2011-01-09 面向的读者: 经常用电脑处理文本和编程的同学 目录 0. 序章:神器的传说 1. 无敌的可扩展性 1.1 可扩展性给了软件强大的生命 1.2 Emacs是伪

60行R++代码实现Lisp解释器

还没有处理lambda.上下文等.有待完好. main { for putsl(eval(getsl)) } rstr eval(rstr s) { return eval(tokenize(s).split(' ')) } rstr eval(rbuf<rstr>& v) { if v.get(0)!='(' return v.get(0) next=find(v.sub(2))+2 switch v.get(1) case '+' return eval(v.sub(2,next)