scheme解释器 C语言实现,使用Scala写了个简单的Scheme解释器

大家好,我使用scala实现了个简单的解释器,能够实现整数的加减乘除。我是照着快学 19章的 3 - 4 * 5 这个例子做的。思路也是按照它的来的。

大概是这样 1)首先定义 factor是整数

2)那么 term : (+ factorfactor...) 就是一个完整的表达式了

3)   那么 expr : (+  term factor...) 等就是 嵌套的表达式代码如下:

import scala.util.parsing.combinator._

class ExprParser extends RegexParsers {

val number = "[0-9]+".r

val op = "+" | "-" | "*" | "/"

def expr :Parser[Int] = "(" ~ opt(op) ~ rep(term | factor) ~ ")" ^^ {

case _ ~ _ ~ List() ~ _ => 0

case _ ~ Some("+") ~ r ~ _ => r.reduce(_+_)

case _ ~ Some("-") ~ r ~ _ => r.reduce(_-_)

case _ ~ Some("*") ~ r ~ _ => r.reduce(_*_)

case _ ~ Some("/") ~ r ~ _ => r.reduce(_/_)

}

def term :Parser[Int] = "(" ~ opt(op) ~ rep(factor) ~ ")" ^^ {

case _ ~ Some("+") ~ r ~ _ => r.reduce(_+_)

case _ ~ Some("-") ~ r ~ _ => r.reduce(_-_)

case _ ~ Some("*") ~ r ~ _ => r.reduce(_*_)

case _ ~ Some("/") ~ r ~ _ => r.reduce(_/_)

}

def factor:Parser[Int] = number ^^ {_.toInt}

}

object Scheme extends App

{

val parser = new ExprParser

def process():Unit = {

val read = readLine(">>>")

read match {

case "exit" => ()

case _ =>

val result = parser.parseAll(parser.expr, read)

if (result.successful)

println(result.get)

process()

}

}

println("enter exit to break")

process()

} 程序运行效果如下图:

c70acc7e0baf3850a3f7da63acfd3aec.png

颇有成就感 ,而且我认为我这个例子比3-4*5更好玩一些。

虽然这只是一个简单的练习,但是感觉如果我能力上去的话,是不是就能写个功能完备的解释器了

哈哈,期待....

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405612.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 的用户层 uevent处理机制

From: http://blog.csdn.net/linphusen/article/details/5667647 摘录几篇android研发日志 1 http://blog.csdn.net/linweig/archive/2010/06/01/5640697.aspx Firmware 加载原理分析----分析的比较透彻,我在wifimod…

前端小知识点(10):原型链

目录 原型链 : 代码1 运行结果1 代码二 运行结果2 原型链 : 每一个对象都有一个原型(__proto__),这个原型还可以拥有自己的原型,形成最终的原型链。 查找一个对象特定的属性或者方法,我们先去当前对象中找&#xff…

PS/2键盘鼠标接口各针脚定义

PS/2键盘鼠标接口各针脚定义(附图)好像很长时间也没有把这个最不被人重视的硬件问题提出来了,今天!我们就来谈谈键盘、鼠标PS/2接头各针脚定义(图)。针脚序号颜色名称简称意义电平1绿(G)Keyboard DATADATA (D)数据负线高电平2ReservervedN/C未定义预留空…

用css写个三角形

样例&#xff1a; 代码&#xff1a; html: <div class"tips"> <span class"caret"></span> 我是一个tooltip </div>css: .tips {width: 200px;height: 50px;line-height: 50px;text-align: center;position: relative;margin: 20p…

Linux系统查看版本和位数

一、查看系统版本 lsb_release -a piraspberrypi:~ $ lsb_release -a No LSB modules are available. Distributor ID: Raspbian Description: Raspbian GNU/Linux 8.0 (jessie) Release: 8.0 Codename: jessie 二、查看系统所有信息 uname -a piraspberrypi:~…

JVectorMap 实现中国地图

我借鉴的博客&#xff1a;http://dove19900520.iteye.com/blog/1880668 一、功能介绍  JVectorMap是一款jquery的地图插件&#xff0c;可以支持各个国家和具体到省份的地图。 二、下载地址 http://download.csdn.net/download/laoshanbizu/5488955 三、使用步骤 1、引用 <…

React开发(226):默认方法返回一个新的参数两个括号

<Form className{form-customer}><Form.Item style{{ width: 100% }}>{getFieldDecorator(needDeliverBackcode${row.code}, {})(<Checkbox onChange{(data) > this.handleCheck (data, row)}>是否回寄</Checkbox>)}</Form.Item></Form&g…

Linux 环境变量PATH设置和查看etc/profile和bashrc的区别

一、查看环境变量 echo $PATH echo有“显示、印出”的意思&#xff0c;而 PATH 前面加的 $ 表示后面接的是变量&#xff0c;所以会显示出目前的 PATH. PATH&#xff08;一定是大写&#xff09;这个变量的内容是由一堆目录所组成的&#xff0c;每个目录中间用冒号&#xff08;:&…

linux下 USB动态监测 hotplug事件监测

From: http://blog.csdn.net/qwyang/article/details/6425555 总体规划&#xff1a; 使用netlink接口向内核注册hotplug事件通知&#xff0c;获取事件通知后进行相关动作如&#xff08;Actionadd&#xff09;挂载或&#xff08;actionremove&#xff09;卸载&#xff0c;使用So…

android选择头像弹窗,Android App开发常用功能之用户头像选择-Go语言中文社区

前言现在的APP基本都有个人资料的填写&#xff0c;基本的都有头像的选择&#xff0c;支持拍照和从本地相册选择&#xff0c;剪切圆形头像的功能&#xff0c;现在用个小demo实现以下。下面看一下效果图上代码&#xff1a;主界面代码package com.example.androidpersonal_icon;im…

CentOS7 (64位) 下QT5.5 连接MySQL数据库(driver not loaded)

用qt连接MySQL需要共享库 libqsqlmysql.so的驱动&#xff0c;路径在plugin/sqldrivers目录下&#xff0c;乍看已经可用了&#xff0c;其实不然。 用ldd命令分析一下&#xff0c;libmysqlclient_r.so.16 > not found ,后明显libmysqlclient_r.so.16 缺少另一个共享库&#xf…

linux dhcp 服务(转)

大多数的情况下Linux作为DHCP服务器而windows 95/98作为DHCP客户。Linux也可以作为DHCP客户&#xff0c;即你要安装dhcpcd rpm 软件包 &#xff0c;Linux作为DHCP服务器&#xff0c;只需要安装dhcpd rpm 包。一.DHCP服务器工作的前提条件为了使DHCP服务器为windows机器服务&…

java jdk1.8.0_221 安装步骤

一、下载jdk Oracle JDK下载 官网 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 下载jdk1.8.0_221. 需要注册账号登陆才能下载。 下载完成&#xff0c;双击jdk-8u221-windows-x64.exe&#xff0c;进行安装。 二、安装jdk 安装前…

gsoap使用心得!

From: http://www.cppblog.com/qiujian5628/archive/2008/06/19/54019.html 完整源码下载 最近换了个工作环境&#xff0c;现在在大望路这边上班&#xff0c;呵&#xff0c;刚上班接到的任务就是熟悉gsoap&#xff01;废话少说&#xff0c;现在开始gSoap学习&#xff01;gSOAP…

android tabhost 多个activity,Android:TabHost中Activity的生命周期问题

用过TabHost制作多个activity的分页效果的朋友应该知道&#xff0c;tabhost中镶嵌的activity的onCreate和onDestroy是和tabhost关联的&#xff0c;在创建了tabhost之后&#xff0c;第一次访问某个activity会执行这个activity的oncreate事件&#xff0c;以后切回来时只会执行onR…

网站决策分析软件WebBI

为了提高网站的访问量、黏合度&#xff0c;网站的管理者投入大量的精力于市场推广、内容发布、网站业务改进等&#xff0c;而对于如何评估推广效果、如何了解网民的行为以提高网站的吸引力和服务质量很多网站都显的无力可施。经过互联网多年的发展&#xff0c;互联网网站之间的…

eclipse启动报错No java virtual machine was found after seearching the locations:XXXXX

一、问题描述 卸载之前的老版本JDK后&#xff0c;重新安装了JDK&#xff0c;再次打开eclipse出现以下问题&#xff1a;在指定的目录中找不到JDK虚拟机。 二、解决办法 eclipse启动时会根据eclipse.ini配置文件来找javaw.exe 启动ecplise GUI。 在eclipse安装的根目录中找到e…

网卡配置

网卡配置文件 &#xff08;1&#xff09;/etc/sysconfig/network-scripts/ifcfg-interface-name 配置文件ifcfg-interface-name包含了初始化接口所需的大部分详细信息。其中interface-name将根据网卡的类型和排序而不同&#xff0c;一般其名字为eth0、eth1、ppp0等&#xff0c…

linux ace platform_linux.gnu,Linux下配置和使用ACE笔记

1. 下载 ACE 5.7.从 http://download.dre.vanderbilt.edu/ 下载 ACETAOCIAO-5.7.tar.gz包。2. 解压将压缩包copy到linux目录/data/ACE里&#xff0c;然后解压, tar -zxvf ACETAOCIAO-5.7.tar.gz。解压后的目录是 /data/ACE_wrappers.3. 配置config.h和platform_macros.GNU。…