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 james at 10:09 PM in Tools and Programming

 

[Trackback URL for this entry]

Your comment:

(not displayed)
 
 
 

Live Comment Preview:

 
« August »
SunMonTueWedThuFriSat
      1
2345678
9101112131415
16171819202122
23242526272829
3031