parsing - Scala 解析 SML 的相互递归函数

标签 parsing scala sml

我正在尝试在 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/

相关文章:

parsing - 使用 Parsec 写入 Read 实例

scala - 如何以正确的方式使用 Scala Cats 验证?

scala - 整数范围的模式匹配

sml - sml 中的大型 Int 集

sml - Basis 有标准的 "const"函数吗?

compiler-construction - 在按名称调用和按值调用下会打印什么?

Java 7 SimpleDateformat 滥用或问题?

ruby-on-rails - 比较 postgres 和 Rails 中的时间

Java 和正则表达式

scala - 有没有等效于 Scala 的 Iterable.maxBy 的 Haskell?