Java Scala语法分析器组合器:";或;以及不同的情况

Java Scala语法分析器组合器:";或;以及不同的情况,java,scala,switch-statement,parser-combinators,Java,Scala,Switch Statement,Parser Combinators,我正在Scala中编写一个解析器,它应该解析以下语法: my_parser = (id | "(" expr ")" ) "(" [ { expr "," } expr ] ")" 我的解析器类: class ExpParser extends JavaTokenParsers { def expr: Parser[Expression] = my_parser | id [...] private def my_parser : Parser[MyParser] =

我正在
Scala
中编写一个
解析器
,它应该解析以下
语法

my_parser = (id | "(" expr ")" ) "(" [ { expr "," } expr ] ")"
我的解析器类

class ExpParser extends JavaTokenParsers {

  def expr: Parser[Expression] = my_parser | id

  [...]    

  private def my_parser : Parser[MyParser] = (id | "(" ~> expr ~ ")") ~ "(" ~ repsep(expr, ",") <~ ")" ^^ {
    case i ~ _ ~ le => MyParser(i, le)               //Error at Constructor first parameter: i
    case  expr ~ _ ~ _ ~ le => MyParser( expr, le)   //Error at Constructor first parameter: expr
  }

  [...]
}

object ParseProgram extends ExpParser {
  def parse(s: String): ParseResult[Expression] = {
    parseAll(expr, s)
  }
}
案例语句中
我收到以下错误消息:

my
MyParser(i,le)
构造函数的第一个
参数处的第一个大小写:i

类型不匹配,应为:表达式,实际为:可序列化的产品

第二种情况:在my
MyParser(expr,le)
构造函数的第一个
参数处:expr

类型不匹配,应为:表达式,实际为:任意

我能在这两个方面有什么不同

  • id
    表达式列表

  • 表达式
    表达式列表


  • my_parser=parser[MyParser]
    ?通常,当您获得可序列化的
    expected:Expression,actual:Product时,您应该指定所需的类型,编译器放弃了。。。另外,我建议您使用,它太棒了!:)下面是一些。
    MyParser
    是一个
    case类
    ,它需要一个
    表达式
    和一个
    表达式列表
    作为参数。既然
    id
    扩展了
    Expression
    ,我认为这就足够了,但显然不行。
    Fastparse
    很好,但我不允许使用它
    sealed trait Expression
    [...]
    case class MyParser(e: Expression, l : List[Expression]) extends Expression
    case class Id(i: String) extends Expression
    [...]