From 227b6a45eda489d175df5b9aeccaec4a2c925437 Mon Sep 17 00:00:00 2001 From: gnush Date: Sat, 2 May 2015 12:45:39 +0200 Subject: [PATCH] added andAlso as a conjunctive syntax combinator --- .../src/main/scala/incremental/Node.scala | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/typecheck/src/main/scala/incremental/Node.scala b/typecheck/src/main/scala/incremental/Node.scala index 21eba59..5692bd2 100644 --- a/typecheck/src/main/scala/incremental/Node.scala +++ b/typecheck/src/main/scala/incremental/Node.scala @@ -127,6 +127,7 @@ object SyntaxChecking { class SyntaxCheckOps(f: NodeKind => SyntaxChecker) { def orElse(g: NodeKind => SyntaxChecker) = (k: NodeKind) => new AlternativeSyntax(k, f, g) + def andAlso(g: NodeKind => SyntaxChecker) = (k: NodeKind) => new ConjunctiveSyntax(k, f, g) } class IgnoreSyntax(k: NodeKind) extends SyntaxChecker(k) { @@ -165,4 +166,26 @@ object SyntaxChecking { } } + case class ConjunctiveSyntax(k: NodeKind, f: NodeKind => SyntaxChecker, g: NodeKind => SyntaxChecker) extends SyntaxChecker(k) { + def check[T](lits: Seq[Lit], kids: Seq[Node_[T]]): Unit = { + try { + f(k).check(lits, kids) + } catch { + case e1: SyntaxError => { + try { + g(k).check(lits, kids) + } catch { + case e2: SyntaxError => error(s"Conjunctive syntax failed \n\t${e1.msg}\nand\n\t${e2.msg})") + } + error(s"Conjunctive syntax failed \n\t${e1.msg}") + } + } + + try { + g(k).check(lits, kids) + } catch { + case e: SyntaxError => error(s"Conjunctive syntax failed \n\t${e.msg}") + } + } + } } \ No newline at end of file