我在嵌套缩进块吞下新行时遇到问题。我想解析一个函数定义(或者更确切地说跳过整个主体,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 <…>
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 <…>
pMultiline> MATCH (COK): "func m():<newline> pass<newline><newli <…>
pMultiline> VALUE: NFuncDef "m" [] Nothing
pFunc> IN: "func m():<newline> pass<newline><newli <…>
pFunc> MATCH (COK): "func m():<newline> pass<newline><newli <…>
pFunc> VALUE: NFuncDef "m" [] Nothing
为什么是pMultiline
,所以我猜indentBlock
,吃掉尾随的新行?如何解决?