【问题标题】:Add IO functionality to imperative language parser向命令式语言解析器添加 IO 功能
【发布时间】:2020-03-17 12:19:52
【问题描述】:

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

我想添加诸如write "example" 之类的语句,它将使用putStrLnprint 之类的内容将“示例”写入标准输出。

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

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

【问题讨论】:

  • 最后的缩进看起来不对。 var 应该与reserved 一样缩进,下面的其他行也必须如此。我也不确定print var 行,这看起来很奇怪:我们正在解析代码,而不是在这个阶段执行它。
  • 解析器不应该打印任何东西;它只需要产生一个正确的Write 值。 评估者的工作是将Write 值处理为对print 的调用等。
  • 类似writeStmt = do { reserved "write"; Write &lt;$&gt; identifier }.

标签: haskell parser-combinators


【解决方案1】:

正如 cmets 中所述,您需要修复缩进,以便 do-block 中的所有语句对齐:

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

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

不幸的是,您正在使用的 wiki 页面仅向您展示如何执行解析,而不是如何实际执行解析后的表示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    相关资源
    最近更新 更多