2014-03-29 3 views
0

행복에서 GLR 파서를 생성하려고하는데 파일이 생성되면 오류가 발생합니다. 여기 GLR_Lib.hs : 'System'모듈을 찾을 수 없습니다.

는 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 
} 

이 예는 --glr와 happy'd, 그러나

happy ABC.y 

와 잘 작동합니다 , 나는 결과를 만들 수 없다. 내가 잘못하고 있는지 궁금합니다. 정확히 말하면 happy --glr은 ABC.hs라는 두 개의 출력을 생성합니다. 그러나 ABCData.hs,

ghc --make ABC.hs ABCData.hs 

지금은 실패합니다. 내가 얻는 오류는 'System'모듈을 찾을 수 없다. haskell-98의 숨겨진 멤버이다 ... 나는 haskell98 패키지를 추가하려고 애썼고, 모호한 prelude 문제가있다. 또한 BNFC에 문법을 코딩하고 -glr 옵션을 사용하여 시도했지만, 여전히 다른 오류가 발생합니다. 예를 들어 Data.FiniteMap에 대한 의존성이 사용되지 않습니다. 이 컴파일을 할 수있는 방법이 있습니까?

+0

하나의 덧글을 추가하고 싶습니다. 나는 .y 파일을 자동으로 생성하고 있으며, 코드 gen이 하스켈 코드가되지 않는 경우에도 gl - 파서를 사용하게되어 기쁩니다.그래서 누군가가 좋은 glr 파서를 추천 할 수 있다면; 들소 glr 방법이 완전하고 잘 개발 된 것처럼, 나는 쉽게 전환 할 수 있습니다. –

답변

1
happy --glr 

잘 작동합니다. 출력에서 ​​수동으로 변경해야하는 것은 하나뿐입니다. 그러나 일반적으로 _ .y 파일에서 해피를 사용하는 것과 다릅니다.

기본적으로 고려해야 할 차이점이 많이 있습니다. 예상되는 렉서 결과의 유형이 다릅니다. 파서의 반환 유형은 제어하기 쉽지 않고 다릅니다. 파서를 사용하는 방식은 약간 다릅니다. 필요한 정보는 http://www.haskell.org/happy/doc/html/sec-glr-using.html 에 있으며 glr 옵션을 올바르게 사용하려면 해당 웹 페이지를 이해하는 것이 중요합니다.

다음은 glr 옵션과 함께 Happy를 사용하여 독립 실행 형 파서를 생성하는 방법입니다. 구문 분석의 결과에 대한 자세한 내용과 위 페이지에서 해석하는 방법에 대해 자세히 알아볼 수 있습니다. 우리는 위의 파서, ABC를 위해 이것을 할 것입니다.

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 파일은 간단하다 : 첫째,라는 파일 ABCMain.hs을 만드는 두 파일을 생산

%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 

모두 컴파일하고 예상대로 파서가 작동합니다. 내가 올바르게하고 있는지 알려주 셔도됩니다.

관련 문제