私はコンパイルエラーメッセージThe value of xyz is undefined here, so reference is not allowed.
とdo-notationを明確にしたいと考えています。私は例を十分に一般化することはできませんでした。私が与えることができるのは、この動作を見つけた具体例です。そのために残念。"未定義値、参照が許可されていません"回避策
purescript-parsingを使用して、ネストされた複数行のコメントを受け入れるパーサーを作成します。この例を簡略化するため、各コメントは(
で始まり、末尾には)
となり、a
または別のコメントのいずれかを含むことができます。いくつかの例:(a)
と((a))
が受け入れられました。()
、(a
またはfoo
が拒否されました。
ラインcontent <- string "a" <|> comment
上のエラーThe value of comment is undefined here, so reference is not allowed.
に次のコードの結果:私は私の知る限り理解し、それが結果のパーサを変更しないcontent <- string "a" <|> comment
上記の行を挿入することで、エラーを取り除くことができます
comment :: Parser String String
comment = do
open <- string "("
content <- commentContent
close <- string ")"
return $ open ++ content ++ close
commentContent :: Parser String String
commentContent = do
content <- string "a" <|> comment
return content
commentContent :: Parser String String
commentContent = do
optional (fail "")
content <- string "a" <|> comment
return content
質問は次のとおりです:すべての
- ここに何が起こっていますか?余分なラインはなぜ助けますか?
- コードをコンパイルするための非ハックな方法は何ですか?手動
do
をdesugar場合
あなたが遭遇しているエラーコードとこのリンクのwikiページを読んでいますか? https://github.com/Thimoteus/SandScript/wiki/2.-構文解析 - 再帰的に - 余分な行があなたの問題を修正するのは本当に奇妙です。 – stholzm
ありがとうございました、サンスクリプトのテキストは興味深いものでした。エラーについては、なぜ必要なのか分かりますが、余分な行がなぜそれを削除するのか分かりません。そして、余分な行を持つパーサは意図的に動作します。 –