⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testparser.scala

📁 JAVA 语言的函数式编程扩展
💻 SCALA
字号:
package examples.parsing.lambdaimport scala.util.parsing.input.Readerimport scala.util.parsing.combinator.lexical.StdLexicalimport scala.util.parsing.combinator.syntactical.StdTokenParsersimport scala.util.parsing.combinator.ImplicitConversions/** * Parser for an untyped lambda calculus * * @author Miles Sabin (adapted slightly by Adriaan Moors) */trait TestParser extends StdTokenParsers  with ImplicitConversions with TestSyntax{  type Tokens = StdLexical  val lexical = new StdLexical  lexical.reserved ++= List("unit", "let", "in", "if", "then", "else")  lexical.delimiters ++= List("=>", "->", "==", "(", ")", "=", "\\", "+", "-", "*", "/")  	def name : Parser[Name] = ident ^^ Name    // meaning of the argumens to the closure during subsequent iterations  // (...(expr2 op1 expr1) ... op1 expr1)  //      ^a^^^ ^o^ ^b^^^  //      ^^^^^^^a^^^^^^^      ^o^ ^^b^^  def expr1 : Parser[Term] =    chainl1(expr2, expr1, op1 ^^ {o => (a: Term, b: Term) => App(App(o, a), b)})  def expr2 : Parser[Term] =   chainl1(expr3, expr2, op2 ^^ {o => (a: Term, b: Term) => App(App(o, a), b)})    def expr3 : Parser[Term] =   chainl1(expr4, expr3, op3 ^^ {o => (a: Term, b: Term) => App(App(o, a), b)})    def expr4 : Parser[Term] =  ( "\\" ~> lambdas  | ("let" ~> name) ~ ("=" ~> expr1) ~ ("in" ~> expr1) ^^ flatten3(Let)  | ("if" ~> expr1) ~ ("then" ~> expr1) ~ ("else" ~> expr1) ^^ flatten3(If)  | chainl1(aexpr, success(App(_: Term, _: Term)))  )  def lambdas : Parser[Term] =    name ~ ("->" ~> expr1 | lambdas) ^^ flatten2(Lam)        def aexpr : Parser[Term] =  ( numericLit ^^ (_.toInt) ^^ Lit  | name ^^ Ref  | "unit" ^^^ Unit()  | "(" ~> expr1 <~ ")"  )    def op1 : Parser[Term] =    "=="  ^^^ Ref(Name("=="))    def op2 : Parser[Term] =  ( "+" ^^^ Ref(Name("+"))  | "-" ^^^ Ref(Name("-"))  )    def op3 : Parser[Term] =  ( "*" ^^^ Ref(Name("*"))  | "/" ^^^ Ref(Name("/"))  )    def parse(r: Reader[char]) : ParseResult[Term] =    phrase(expr1)(new lexical.Scanner(r))}

⌨️ 快捷键说明

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