Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 用于SML的Scala解析递归函数_Parsing_Scala_Sml - Fatal编程技术网

Parsing 用于SML的Scala解析递归函数

Parsing 用于SML的Scala解析递归函数,parsing,scala,sml,Parsing,Scala,Sml,我正试图用Scala为SML编写一个带有标记的解析器。它几乎按照我希望的方式工作,除了它当前正在解析的事实 让fun f x=r,fun g y在r端 而不是 让fun f x=r,g y在r端 如何更改代码,使其认识到第二个函数不需要FunToken def parseDef:Def = { currentToken match { case ValToken => { eat(ValToken); val nme:String = currentToken m

我正试图用Scala为SML编写一个带有标记的解析器。它几乎按照我希望的方式工作,除了它当前正在解析的事实

让fun f x=r,fun g y在r端

而不是

让fun f x=r,g y在r端

如何更改代码,使其认识到第二个函数不需要FunToken

def parseDef:Def = {
  currentToken match {
  case ValToken => {
    eat(ValToken);

    val nme:String = currentToken match {
      case IdToken(x) => {advance; x}
      case _ => error("Expected a name after VAL.")
    }

    eat(EqualToken);      
    VAL(nme,parseExp)
    }

  case FunToken => {

    eat(FunToken);

    val fnme:String = currentToken match {
      case IdToken(x) => {advance; x}
      case _ => error("Expected a name after VAL.")
    }

    val xnme:String = currentToken match {
      case IdToken(x) => {advance; x}
      case _ => error("Expected a name after VAL.")
    }

    def parseAnd:Def = currentToken match {
      case AndToken => {eat(AndToken); FUN(fnme,xnme,parseExp,parseAnd)}
      case _ => NOFUN
    }


    FUN(fnme,xnme,parseExp,parseAnd)
    }
    case _ => error("Expected VAL or FUN.");
  }
}

您可以使用“uneat”函数将FunToken注入到输入流中。这不是最优雅的解决方案,但它需要对当前代码进行最少的修改

def parseAnd:Def = currentToken match {
    case AndToken => { eat(AndToken); 
                       uneat(FunToken);
                       FUN(fnme,xnme,parseExp,parseAnd) }
  case _ => NOFUN
}

只要实现正确的语法。而不是

def ::= "val" id "=" exp | fun
fun ::= "fun" id id "=" exp ["and" fun]
SML的语法实际上是

def ::= "val" id "=" exp | "fun" fun
fun ::= id id "=" exp ["and" fun]
顺便说一句,我认为你的乐趣解析还有其他问题。AFAICS,在有趣的情况下,您没有解析任何“=”。此外,在“and”之后,您甚至没有解析任何标识符,只解析函数体