使用Scala写了个简单的Scheme解释器
16lz
2021-05-01
大家好,我使用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更好玩一些。
虽然这只是一个简单的练习,但是感觉如果我能力上去的话,是不是就能写个功能完备的解释器了
哈哈,期待....
更多相关文章
- Delphi 正则表达式语法(10): 选项
- Delphi 正则表达式之TPerlRegEx 类的属性与方法(7): Split 函数
- Delphi 正则表达式之TPerlRegEx 类的属性与方法(1): 查找
- 【正则】整理详细JavaScript正则表达式入门,看这篇就够了!附常用的
- (lintcode)第463题整数排序
- Java函数式编程和Lambda表达式
- 变量系列教材 (八)- 什么是Java的表达式
- 控制流程系列教材 (一)- Java的If 条件语句
- 操作符系列教材 (六)- Java的三元操作符