我试图从生成一个快乐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依赖这显然是不推荐使用。 有没有办法让这个编译?
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
一切编译和解析器按预期工作。 随时让我知道,如果我做正确。