1

フォームのステートメントを解析する必要があります

var1!=var2
var1==var2

等々。私は次の構造を持っています:

lazy val Line : Parser[Any] = (Expr ~ "!=" ~ Expr)^^ {e => SMT( "(not (= " + e._1._1 + " " +  e._2 + "))")} | (Expr ~ "==" ~ Expr)^^ {e => SMT( "(" + (e._1._2) + " " + e._1._1 + " " +  e._2 + ")")}

「==」の 2 番目の部分は正常に機能し、 me が返されます(== var1 var2)が、最初の部分は解析されません。「!=」の代わりに何を解析しようとしても、「!=」も「!=」も「!=」も認識されません。

もちろん、パーサーに渡す前に「!=」を置き換えることもできますが、もっとエレガントな方法はありますか?

4

1 に答える 1

2

この最小限の例 (Scala 2.9.2) を見てください。

import scala.util.parsing.combinator.syntactical._
import scala.util.parsing.combinator._

sealed trait ASTNode

case class Eq(v1: String, v2: String) extends ASTNode
case class Not(n: ASTNode) extends ASTNode

object MyParser extends StandardTokenParsers {
  lexical.delimiters += ("==", "!=")

  lazy val line = (
      (ident ~ ("==" ~> ident)) ^^ { case e1 ~ e2 => Eq(e1, e2) }
    | (ident ~ ("!=" ~> ident)) ^^ { case e1 ~ e2 => Not(Eq(e1, e2)) }
  )

  def main(code: String) = {
    val tokens = new lexical.Scanner(code)

    line(tokens) match {
      case Success(tree, _) => println(tree)
      case e: NoSuccess => Console.err.println(e)
    }
  }
}

MyParser.main("x == y")
MyParser.main("x != y")
于 2012-07-27T12:51:45.620 に答える