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更好玩一些。

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

哈哈,期待....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值