我正试图将IO功能(如read
和write
语句(添加到命令式语言的解析器中,如下所示https://wiki.haskell.org/Parsing_a_simple_imperative_language
我想添加像write "example"
这样的语句,它将用putStrLn
或print
这样的东西将"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页面只显示了如何执行解析,而不是如何实际执行解析后的表示。