使用Alex和Happy构建的Haskell解析器main函数失效求助
逆波兰表达式解析器编译后无输出的排查与解决
问题1:输入未触发EOF导致程序挂起
你的main函数通过getContents读取标准输入,该函数会持续等待输入直到收到文件结束符(EOF)。终端环境下,输入表达式后必须手动触发EOF才会让程序继续执行:
- Linux/macOS:输入表达式后按
Ctrl+D - Windows:输入表达式后按
Ctrl+Z再回车
如果不触发EOF,程序会一直处于等待输入的状态,不会输出任何内容。
优化方案:改用逐行读取(更适合交互式场景)
如果希望输入表达式后按回车就直接得到结果,可以将main函数改为使用getLine读取单行输入:
main = do s <- getLine print (calc (lexer s))
潜在逻辑验证
虽然手动调用结果正确,但需要确认RPN语法规则的逻辑:逆波兰表达式A B +表示A + B,你的语法规则Exp Exp '+' { Plus $1 $2 }完全符合该逻辑(第一个Exp对应A,第二个对应B),这部分不存在问题。
编译流程确认
确保你按照正确的流程编译代码:
- 生成词法分析器:
alex Lexical.x - 生成语法分析器:
happy Parser.y(假设你的Happy文件名为Parser.y) - 编译生成可执行文件:
ghc Main.hs Lexical.hs Parser.hs
内容的提问来源于stack exchange,提问作者Daniel Gattesco
相关产品推荐
相关产品推荐

