你們好,我使用scala實現了個簡單的解釋器,可以實現整數的加減乘除。我是照着快學 19章的 3 - 4 * 5 這個例子作的。思路也是按照它的來的。
大概是這樣 1)首先定義 factor 是整數
2)那麼 term : (+ factor factor ...) 就是一個完整的表達式了
3) 那麼 expr : (+ term factor ...) 等就是 嵌套的表達式
代碼以下:
spa
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更好玩一些。
雖然這只是一個簡單的練習,可是感受若是我能力上去的話,是否是就能寫個功能完備的解釋器了
哈哈,期待.... scala