大家好,我使用scala实现了个简单的解释器,能够实现整数的加减乘除。我是照着快学 19章的 3 - 4 * 5 这个例子做的。思路也是按照它的来的。
  大概是这样 1)首先定义 factor 是整数
                 2)那么 term : (+ factor factor ...) 就是一个完整的表达式了
                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()}

程序运行效果如下图:

  颇有成就感 ,而且我认为我这个例子比3-4*5更好玩一些。
  虽然这只是一个简单的练习,但是感觉如果我能力上去的话,是不是就能写个功能完备的解释器了
  哈哈,期待....

©著作权归作者所有:来自51CTO博客作者huanghongqiao的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. Delphi 正则表达式语法(10): 选项
  2. Delphi 正则表达式之TPerlRegEx 类的属性与方法(7): Split 函数
  3. Delphi 正则表达式之TPerlRegEx 类的属性与方法(1): 查找
  4. 【正则】整理详细JavaScript正则表达式入门,看这篇就够了!附常用的
  5. (lintcode)第463题整数排序
  6. Java函数式编程和Lambda表达式
  7. 变量系列教材 (八)- 什么是Java的表达式
  8. 控制流程系列教材 (一)- Java的If 条件语句
  9. 操作符系列教材 (六)- Java的三元操作符

随机推荐

  1. Android SDK等下载说明
  2. Android 命名空间和自定义属性
  3. Android JNI详述(二)
  4. Android实现CBC加解密
  5. Android(安卓)Studio增量更新(Mac)
  6. EditText无法获取焦点(android:descendant
  7. 【Android(安卓)Socket专题】:UDP通信客户
  8. Android 中文 API (24) ―― MultiAutoComp
  9. android 输入键盘遮挡页面的问题
  10. Google Issues Cease & Desist to Open S