大家好,我使用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更好玩一些。
虽然这只是一个简单的练习,但是感觉如果我能力上去的话,是不是就能写个功能完备的解释器了
哈哈,期待....