GLR_Lib.hs:找不到模块“系统”(GLR_Lib.hs: Could not find mo

2019-10-29 13:03发布

我试图从生成一个快乐GLR分析器,但我得到的错误,一旦文件生成。

下面是一个例子,ABC.y,所以很显然我努力:

{
module Main where
}
%name ps1 s1
%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
parseError _ = error "bad"
main = getContents >>= print . ps1 . lexer
lexer ('a':xs) = A : lexer xs
ETC
}

这个例子只是工作细

happy ABC.y

然而,happy'd与--glr,我不能建立的结果。 我想知道如果我这样做是错误的。 为了精确,快乐--glr,产生两个输出,ABC.hs. ABCData.hs,但是,

ghc --make ABC.hs ABCData.hs

现在失败。 我得到的错误是找不到模块“系统”,它是haskell98的一个隐藏的成员......我尝试添加包haskell98,并得到了模棱两可的序幕问题。 我也试过编码语法到BNFC并利用自己-glr选项,但我仍然得到其他错误,就像Data.FiniteMap依赖这显然是不推荐使用。 有没有办法让这个编译?

Answer 1:

happy --glr

工作正常 - 有一件事必须在输出手动更改。 但是请注意,这是一个典型的_ .Y文件中使用不同的快乐。

基本上,有一堆的,你必须考虑到差异。 该类型的预期词法分析器的结果是不同的。 该类型从解析器回报少可控性和不同。 而你使用的解析器的方式略有不同。 必要的信息上可以找到: http://www.haskell.org/happy/doc/html/sec-glr-using.html并了解网页正确使用GLR选项是非常重要的。

这里是你如何使用乐意与GLR选项产生一个独立的解析器; 所有我们关心的是,如果解析是成功的 - 你可以阅读更多有关解析和如何解释它们在上述网页的结果。 我们将解析器做到这一点上面,ABC。 首先,创建一个名为ABCMain.hs:

module Main where

import ABC
import ABCData

main = do
    inp <- getContents
    case happyParse (lexer inp) of
        ParseOK _ _ -> putStrLn "success"
        _ -> putStrLn " success"
lexer ('a':xs) = [A] : lexer xs
ETC -- note that it is [[Token]] instead of [Token]

而ABC.y文件很简单:

%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) -- you must have Eq and Ord
parseError _ = error "bad"
}

happy --glr ABC.y

产生两个文件。 现在,有一点我会爱一个人要评论 - 本质上,你必须手动更改,在生成的文件ABC.hs,行

import System

import System.IO

然后,以下为我工作:

ghc --make ABCMain.hs

一切编译和解析器按预期工作。 随时让我知道,如果我做正确。



文章来源: GLR_Lib.hs: Could not find module 'System'