Parsing 解析!=在斯卡拉

Parsing 解析!=在斯卡拉,parsing,scala,Parsing,Scala,我需要解析表单的语句 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 + ")")}

我需要解析表单的语句

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 + ")")}
“==”的第二部分工作正常,返回我
(==var1 var2)
,但第一部分没有解析。无论我试图解析什么而不是“!=”,都无法识别“!=”或“!=”或“!=”


当然,在我将“!=”交给解析器之前,我可以替换它,但是有没有更优雅的方法?

看看这个最小的示例(Scala 2.9.2):


它是如何表明它不喜欢你的?呃,如果你太频繁地重写测试,就会发生这种情况,对不起。。。现在编辑它!如果尝试馈送
var1!=var2
(以这种方式,使用空格)到解析器?请您详细说明一个更完整的示例(可能是编译的示例)?嗯,更完整的示例似乎很好!?!看起来我在试图解析的类的两个子类之间混淆了
LabelParser.parseAll(LabelParser.Label…
lazy val Label:Parser[Any]=Line |无论如何|…
如果我直接解析LabelParser.Line,它工作得很好…很抱歉打扰您,我当时真的没有看到…感谢您的帮助,尊敬的FlorianBtw,因为您的代码提示为SMT解算器的输入语言编写解析器,可能是Scala^Z3()您很感兴趣。您好,示例为Thx!!我在尝试为此处创建最小示例时也发现了错误。我已经在使用ScalaZ3,Thx:)
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")