我正在尝试在 Scala 中为带有 token 的 SML 编写解析器。它几乎按照我希望的方式工作,除了当前解析的事实
让 fun f x = r 和 fun g y in 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.");
}
}
最佳答案
只需实现正确的语法。代替
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”之后,您甚至不解析任何标识符,只解析函数体。
关于parsing - Scala 解析 SML 的相互递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9851149/