大家好,我使用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()
} 程序运行效果如下图:
颇有成就感 ,而且我认为我这个例子比3-4*5更好玩一些。
虽然这只是一个简单的练习,但是感觉如果我能力上去的话,是不是就能写个功能完备的解释器了
哈哈,期待....