You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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),这部分不存在问题。

编译流程确认

确保你按照正确的流程编译代码:

  1. 生成词法分析器:alex Lexical.x
  2. 生成语法分析器:happy Parser.y(假设你的Happy文件名为Parser.y)
  3. 编译生成可执行文件:ghc Main.hs Lexical.hs Parser.hs

内容的提问来源于stack exchange,提问作者Daniel Gattesco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 18:52:31