Thursday, 20 August 2009
Boolean Parser Combinator in Scala
« The Swiss Menace | Main | The house building process »
The title says it all (sort of).
package net.unsyntax.learning.parsercombinator;
import scala.util.parsing.combinator.lexical.StdLexical
import scala.util.parsing.combinator.syntactical.StdTokenParsers
class BooleanParserCombinator(f:String => Boolean) extends StdTokenParsers {
type Tokens = StdLexical;
val lexical = new StdLexical();
lexical.delimiters ++= List("(", ")", "&", "|", "!");
lazy val expr:Parser[Boolean] = flag*("|" ^^^ {(x: Boolean, y: Boolean) => x || y} |
"&" ^^^ {(x: Boolean, y: Boolean) => x && y});
lazy val flag:Parser[Boolean] = ("(" ~> expr <~ ")" | ident ^^ (f(_)) |
"!" ~> ident ^^ (!f(_)) | "!" ~> expr ^^ {(x:Boolean) => !x});
def apply(in:String):Boolean = {
return expr(new lexical.Scanner(in)).get;
}
}
The test program:
package net.unsyntax.learning.parsercombinator
import scala.collection.immutable.ListSet;
object BooleanParserCombinatorTest {
val tests = List("true", "false", "!true", "!false",
"true&false", "true|false", "true|(true&false)",
"true&(true|false)", "false|!false");
val eval = new BooleanParserCombinator(_.toBoolean).apply(_);
def main(args: Array[String]) {
for (test <- tests) {
println (test +"="+eval(test));
}
}
}
yields
$ java net.unsyntax.learning.parsercombinator.BooleanParserCombinatorTest true=true false=false !true=false !false=true true&false=false true|false=true true|(true&false)=true true&(true|false)=true false|!false=true $
Posted by at 10:09 PM in Tools and Programming
[Trackback URL for this entry]
