【发布时间】:2020-03-17 12:19:52
【问题描述】:
我正在尝试将 IO 功能(例如 read 和 write 语句)添加到命令式语言的解析器中,如下所示 https://wiki.haskell.org/Parsing_a_simple_imperative_language
我想添加诸如write "example" 之类的语句,它将使用putStrLn 或print 之类的内容将“示例”写入标准输出。
到目前为止,我已经进行了以下更改
-- Add Write data type so that a statement such as `write "test"` can be represented as a statement
data Stmt = Seq [Stmt]
| ... (same as before)
| Write String
deriving (Show)
-- write needs to be added to reservedNames as it has a function in the language
languageDef =
emptyDef { Token...
, ...
, Token.reservedNames = [ "if"
, ...
, "write"
...
-- whenever a statement is parsed, writeStmt function now needs to be called to parse a write statement
statement' :: Parser Stmt
statement' = ifStmt
<|> whileStmt
<|> skipStmt
<|> assignStmt
<|> writeStmt
-- do reserved write, get the identifier, print it to stdout and return the Write statement
writeStmt :: Parser Stmt
writeStmt =
do reserved "write"
var <- identifier
print var
return $ Write var
我在whileStmt 中的var <- identifier 上遇到错误,我不确定还需要添加或更改什么才能使其正常工作。谢谢
【问题讨论】:
-
最后的缩进看起来不对。
var应该与reserved一样缩进,下面的其他行也必须如此。我也不确定print var行,这看起来很奇怪:我们正在解析代码,而不是在这个阶段执行它。 -
解析器不应该打印任何东西;它只需要产生一个正确的
Write值。 评估者的工作是将Write值处理为对print的调用等。 -
类似
writeStmt = do { reserved "write"; Write <$> identifier }.
标签: haskell parser-combinators