Last active
March 3, 2020 11:52
-
-
Save dcastro/18b586421b0d12fbeda0c69e56df6912 to your computer and use it in GitHub Desktop.
ammonite log
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading... | |
Welcome to the Ammonite Repl 1.3.2 | |
(Scala 2.12.7 Java 1.8.0_212) | |
If you like Ammonite, please support our development at www.patreon.com/lihaoyi | |
@ import $ivy.`org.scala-lang.modules::scala-parser-combinators:1.1.2` | |
import $ivy.$ | |
@ { | |
sealed trait Expr | |
case class Term(term: String) extends Expr | |
case class And(x: Expr, y: Expr) extends Expr | |
case class Or(x: Expr, y: Expr) extends Expr | |
import scala.util.parsing.combinator.{PackratParsers, RegexParsers} | |
import scala.util.parsing.input.CharSequenceReader | |
object Parsing extends RegexParsers with PackratParsers { | |
override val skipWhitespace = false | |
val validIdentifiers = List("aaa", "bbb", "ccc", "ddd") | |
lazy val term: PackratParser[Term] = """\s*""".r ~> """\w+""".r flatMap { identifier => | |
if (validIdentifiers.contains(identifier)) | |
success(Term(identifier)) | |
else | |
err(s"expected one of: $validIdentifiers") | |
} | |
lazy val and: PackratParser[And] = | |
expr ~ """\s+and\s+""".r ~ (term | parensExpr) ^^ { case e1 ~ _ ~ e2 => And(e1, e2) } | |
lazy val or: PackratParser[Or] = | |
expr ~ """\s+or\s+""".r ~ (term | parensExpr) ^^ { case e1 ~ _ ~ e2 => Or(e1, e2) } | |
lazy val parensExpr: PackratParser[Expr] = """\s*\(""".r ~> expr <~ """\s*\)""".r | |
lazy val expr: PackratParser[Expr] = | |
term ||| and ||| or ||| parensExpr | |
lazy val root: PackratParser[Expr] = | |
phrase(expr) | |
def parseExpr(input: String): ParseResult[Expr] = | |
parse(root, new PackratReader(new CharSequenceReader(input))) | |
} | |
} | |
defined trait Expr | |
defined class Term | |
defined class And | |
defined class Or | |
import scala.util.parsing.combinator.{PackratParsers, RegexParsers} | |
import scala.util.parsing.input.CharSequenceReader | |
defined object Parsing | |
@ println(Parsing.parseExpr("aaa and invalidIdentifier")) | |
[1.4] failure: end of input expected | |
aaa and invalidIdentifier | |
^ | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment