1

我在嵌套缩进块吞下新行时遇到问题。我想解析一个函数定义(或者更确切地说跳过整个主体,func.def.不一定是顶级的)。

例子:

func F() -> void: pass

func m():
  pass

func f(a:= 4, b, c:X) -> Y:
    if a >= 0:
        if b > 4:
            return b
        else:
            return c.y(-b)
    else: return c.y(b)

我的代码:

pFunc :: Parser Node
pFunc = (try pMultiline <|> pOneline) & dbg "pFunc"
  where
    pOneline = do
      (name, args, ret) <- pFuncHead
      pStatement
      return $ NFuncDef name args ret
    pMultiline = (L.indentBlock scn pMultilineIB) & dbg "pMultiline"
    pMultilineIB = do
      (name, args, ret) <- pFuncHead & dbg "pMultilineIB pFuncHead"
      return $ L.IndentSome Nothing (\_ -> return $ NFuncDef name args ret) body
    body = (try nested <|> void pSomeTillEol) & dbg "body"
    nested = (L.indentBlock scn nestedIB) & dbg "nested"
    nestedIB = do
      pStatement
      return $ L.IndentSome Nothing (const skip) body

pFuncHead,pStatement并且pSomeTillEol不要使用尾随的新行(只是scn这样做,我使用本教程作为模板)。

跑了"func m():\n pass\n\n"

pMultilineIB pFuncHead> IN: "func m():<newline>  pass<newline><newli <…&gt;
pMultilineIB pFuncHead> MATCH (COK): "func m():"
pMultilineIB pFuncHead> VALUE: ("m",[],Nothing)

nested> IN: "pass<newline><newline>"
nested> MATCH (CERR): "pass<newline><newline>"
nested> ERROR:
nested> offset=18:
nested> incorrect indentation (got 1, should be greater than 3)

pSomeTillEol> IN: "pass<newline><newline>"
pSomeTillEol> MATCH (COK): "pass"
pSomeTillEol> VALUE: "pass"

body> IN: "pass<newline><newline>"
body> MATCH (COK): "pass"
body> VALUE: ()

pMultiline> IN: "func m():<newline>  pass<newline><newli <…&gt;
pMultiline> MATCH (COK): "func m():<newline>  pass<newline><newli <…&gt;
pMultiline> VALUE: NFuncDef "m" [] Nothing

pFunc> IN: "func m():<newline>  pass<newline><newli <…&gt;
pFunc> MATCH (COK): "func m():<newline>  pass<newline><newli <…&gt;
pFunc> VALUE: NFuncDef "m" [] Nothing

为什么是pMultiline,所以我猜indentBlock,吃掉尾随的新行?如何解决?

4

0 回答 0