import scala.util.matching.Regex trait Element case class Number(value: Int) extends Element object PlusOperator extends Element case class ParseResult(elements: List[Element], rest: String) trait Parser { def parse(value: String): Option[ParseResult] } case class AndCombinator(parsers: List[Parser]) extends Parser { def parse(value: String): Option[ParseResult] = { var r: Option[ParseResult] = None var current = value var elements = List[Element]() parsers.foreach { parser => parser.parse(current) match { case None => return None case Some(ParseResult(elts, rest)) => current = rest elements = elements ++ elts } } Some(ParseResult(elements, "")) } } object NumberParser extends Parser { def parse(value: String): Option[ParseResult] = { val regex = "^(\\d+)(.*)".r if (regex.matches(value)) { val result = regex.findAllIn(value) val s = result.group(1) Some(ParseResult(List(Number(s.toInt)), result.group(2))) } else { None } } } object PlusOperatorParser extends Parser { def parse(value: String): Option[ParseResult] = { val regex = "^\\+(.*)".r if (regex.matches(value)) { val result = regex.findAllIn(value) Some(ParseResult(List(PlusOperator), result.group(1))) } else { None } } }