向命令式语言解析器添加IO功能



我正试图将IO功能(如readwrite语句(添加到命令式语言的解析器中,如下所示https://wiki.haskell.org/Parsing_a_simple_imperative_language

我想添加像write "example"这样的语句,它将用putStrLnprint这样的东西将"example"写入stdout。

到目前为止,我已经做了以下更改

-- 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上遇到错误,我不确定还需要添加或更改什么才能使其工作。感谢

正如注释中所指出的,您需要修复缩进,以便do块行中的所有语句:

writeStmt :: Parser Stmt
writeStmt =
do reserved "write"
var <- identifier
print var
return $ Write var

然后,您需要删除那个print var语句。在解析期间,您只需要识别写语句并将它们存储在抽象语法树(AST(中(即Stmt树中(。实际打印将在一个单独的函数中进行,该函数执行AST表示的程序。

不幸的是,您使用的wiki页面只显示了如何执行解析,而不是如何实际执行解析后的表示。

最新更新