0

我正在用 Haskell 编写 rail-compiler(rail 是一种深奥的语言),我在 mainmodule 的 main-function 中遇到了一些问题。

1)我希望我的程序询问我是要运行编译管道还是只是在词法分析器之后停止并将 AST 写入文件,以便另一个编译器可以处理我的 AST(抽象语法树)。这是我的程序:

module Main (
             main   -- main function to run the program
            )
 where

 -- imports --
 import InterfaceDT as IDT
 import qualified Testing as Test
 import qualified Preprocessor as PreProc
 import qualified Lexer
 import qualified SyntacticalAnalysis as SynAna
 import qualified SemanticalAnalysis as SemAna
 import qualified IntermediateCode as InterCode
 import qualified CodeOptimization as CodeOpt
 import qualified Backend

 -- functions --
 main :: IO()
 main = do putStr "Enter inputfile (path): "
           inputfile <- getLine
           input <- readFile inputfile
           putStr "Enter outputfile (path): "
           outputfile <- getLine
           input <- readFile inputfile

           putStr "Only create AST (True/False): "
           onlyAST <- getLine
           when (onlyAST=="True") do putStrLn "Building AST..."
                                     writeFile outputfile ((Lexer.process . PreProc.process) input)
           when (onlyAST=="False") do putStrLn ("Compiling "++inputfile++" to "++outputfile)
                                      writeFile outputfile ((Backend.process . CodeOpt.process . InterCode.process . SemAna.process . SynAna.process . Lexer.process . PreProc.process) input)

我在第 21 行 ( input <- readFile inputfile) 中收到由<-. 为什么?

我该怎么做?

2)接下来我想以这种方式重构程序,我可以从终端使用参数调用它runhaskell Main(AST)(这样它应该只创建AST)或类似runhaskell Main.hs(这样它应该完成整个管道)。

我希望能得到你的帮助!

4

1 回答 1

1

对于您在 (1) 中的错误,您的程序在第 21 行看起来在语法上对我来说并不正确。<-但是,如果该行的缩进与前一行不同,则会发生错误。我怀疑你有一个缩进错误,因为混合制表符和空格的方式在你的编辑器中看起来是正确的,但不同意 Haskell 对制表符的解释。最简单的建议是始终使用空格而不是制表符。

稍后您还有该行的额外副本,您可能希望将其删除。

我还怀疑你可能需要hFlush stdin在你的 putStr 之后使用它们,以便它们作为提示工作。

对于 (2),我建议使用库来进行正确的命令行参数和选项解析,例如GHC 中包含的System.Console.GetOpt,或者您可以在 Hackage 上找到的更高级的库之一。

于 2014-05-07T10:42:07.577 回答