arithmeticparser.scala

来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 57 行

SCALA
57
字号
/*                     __                                               *\**     ________ ___   / /  ___     Scala API                            ****    / __/ __// _ | / /  / _ |    (c) 2006-2007, LAMP/EPFL             ****  __\ \/ /__/ __ |/ /__/ __ |                                         **** /____/\___/_/ |_/____/_/ | |                                         ****                          |/                                          **\*                                                                      */package examples.parsingimport scala.util.parsing.combinator.lexical.StdLexicalimport scala.util.parsing.combinator.syntactical.StdTokenParsers/** Parse and evaluate a numeric expression as a sequence of terms, separated by + or - *   a term is a sequence of factors, separated by * or / *   a factor is a parenthesized expression or a number * * @author Adriaan Moors  */ object arithmeticParser extends StdTokenParsers {     type Tokens = StdLexical ; val lexical = new StdLexical  lexical.delimiters ++= List("(", ")", "+", "-", "*", "/")  lazy val expr =   term*("+" ^^^ {(x: int, y: int) => x + y} | "-" ^^^ {(x: int, y: int) => x - y})  lazy val term = factor*("*" ^^^ {(x: int, y: int) => x * y} | "/" ^^^ {(x: int, y: int) => x / y})  lazy val factor: Parser[int] = "(" ~> expr <~ ")" | numericLit ^^ (_.toInt)    def main(args: Array[String]) {    println(      if (args.length == 1) {        expr(new lexical.Scanner(args(0)))      }      else        "usage: scala examples.parsing.arithmeticParser <expr-string>"    )  }}object arithmeticParserDesugared extends StdTokenParsers {     type Tokens = StdLexical ; val lexical = new StdLexical  lexical.delimiters ++= List("(", ")", "+", "-", "*", "/")  lazy val expr = chainl1(term, (keyword("+").^^^{(x: int, y: int) => x + y}).|(keyword("-").^^^{(x: int, y: int) => x - y}))  lazy val term = chainl1(factor, (keyword("*").^^^{(x: int, y: int) => x * y}).|(keyword("/").^^^{(x: int, y: int) => x / y}))  lazy val factor: Parser[int] = keyword("(").~>(expr.<~(keyword(")"))).|(numericLit.^^(x => x.toInt))       def main(args: Array[String]) {    println(      if (args.length == 1) {        expr(new lexical.Scanner(args(0)))      }      else        "usage: scala examples.parsing.arithmeticParser <expr-string>"    )  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?