我編寫了一個非常簡單的解析器組合器庫,它似乎可以正常工作(https://github.com/mukeshsoni/tinyparsec)。x的值在此處未定義,因此不允許此引用
然後我試着用庫爲json編寫解析器。對於JSON解析器的代碼是在這裏 - https://github.com/mukeshsoni/tinyparsec/blob/master/src/example_parsers/JsonParser.purs
對JSON語法是遞歸 -
data JsonVal
= JsonInt Int
| JsonString String
| JsonBool Boolean
| JsonObj (List (Tuple String JsonVal))
這意味着解析器JSON對象必須再次調用解析器jsonVal
。對於jsonObj
解析器的代碼看起來是這樣的 -
jsonValParser
= jsonIntParser <|> jsonBoolParser <|> jsonStringParser <|> jsonObjParser
propValParser :: Parser (Tuple String JsonVal)
propValParser = do
prop <- stringLitParser
_ <- symb ":"
val <- jsonValParser
pure (Tuple prop val)
listOfPropValParser :: Parser (List (Tuple String JsonVal))
listOfPropValParser = sepBy propValParser (symb ",")
jsonObjParser :: Parser JsonVal
jsonObjParser = do
_ <- symb "{"
propValList <- listOfPropValParser
_ <- symb "}"
pure (JsonObj propValList)
但是當我嘗試構建它,我得到以下錯誤 - The value of propValParser is undefined here. So this reference is not allowed here
我發現計算器類似的問題,但不明白爲什麼錯誤發生或我應該如何重構我的代碼,以便它能夠處理從jsonValParser
到propValParser
的遞歸引用。
任何幫助,將不勝感激。
可能重複[「未定義的值,引用不允許」解決方法](http://stackoverflow.com/questions/36984245/undefined-value-reference-not-allowed-workaround) – Prune
可能的,但我認爲代碼看起來不同。此外,我不明白該模式背後的原因不被允許。 –