Parsing 用于SML的Scala解析递归函数
我正试图用Scala为SML编写一个带有标记的解析器。它几乎按照我希望的方式工作,除了它当前正在解析的事实 让fun f x=r,fun g y在r端 而不是 让fun f x=r,g y在r端 如何更改代码,使其认识到第二个函数不需要FunTokenParsing 用于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
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”之后,您甚至没有解析任何标识符,只解析函数体