从Happy开始编译GLR解析器时出错 - 在输入'case'上解析错误'

时间:2014-11-26 13:09:04

标签: haskell happy glr

我尝试编译生成的文件时尝试了多个示例语法并得到相同的错误。

例如,我完全按照这个问题的解决方案 - GLR_Lib.hs: Could not find module 'System'

语法文件是

%tokentype { ABC }
%error { parseError }
%token 
    a { A }
    b { B }
    c { C }
%%
s1 : a a a b {} | b s2 a {}
s2 : b a b s2 {} | c {}
{
data ABC = A | B | C deriving (Eq,Ord,Show) 
parseError _ = error "bad"
}

但是当我编译时,我得到:

[1/2 of 2]编译ABCData(ABCData.hs,ABCData.o)

[2 of 2]编制ABC(ABC.hs,ANC.o)

GLR_Lib.hs:164:2:解析输入'case'

的错误

我尝试过的每一个语法都发生了这个确切的错误。我不知道对于那些成功运作的人来说,我的做法可能与众不同。

1 个答案:

答案 0 :(得分:1)

GLR_Lib模板中存在缩进错误。这就是我为了让它发挥作用所做的事情:

  1. 创建ABCMain.hs文件。
  2. 为已编辑的模板创建新目录./templates
  3. 找到原件 - 例如使用locate GLR_Lib。在使用Haskell平台的OSX上,我在/Library/Haskell/current/share/happy-1.19.4 /
  4. 中找到了它们
  5. 将所有模板复制到./templates
  6. ./templates/GLR_Lib进行以下修改:
    • 第44行:评论import System
    • 第161行:使用制表符case new_stks of
    • 替换行距空格
    • 第190行:使用制表符stks' <- foldM (pack i) stks reds
    • 替换行距空格
  7. 运行:happy --glr --template=./templates ABC.y
  8. 编译:{{1​​}}
  9. 您可能只需要ghc --make ABCMainGLR_Lib模板。