0

happy から 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

ただし、 --glr に満足しているため、結果をビルドできません。私はそれを間違っているのだろうかと思っています。正確に言うと、 --glr を実行すると、ABC.hs という 2 つの出力が生成されます。ただし、ABCData.hs

ghc --make ABC.hs ABCData.hs

今失敗します。私が得るエラーは、「Could not find module 'System', It is a hidden member of haskell-98...」です。また、文法を BNFC にコーディングして -glr オプションを使用しようとしましたが、明らかに廃止された Data.FiniteMap への依存など、他のエラーが発生します。このコンパイルを取得する方法はありますか?

4

1 に答える 1

1
happy --glr

正常に動作します。出力で手動で変更する必要があるのは 1 つだけです。ただし、通常の_ .y ファイルで Happy を使用する場合とは異なります。

基本的に、考慮しなければならない違いがたくさんあります。期待されるレクサー結果のタイプが異なります。パーサーからの戻り値の型は制御しにくく、異なります。また、パーサーの使用方法も少し異なります。必要な情報は http://www.haskell.org/happy/doc/html/sec-glr-using.html にあります。glr オプションを正しく使用するには、その Web ページを理解することが非常に重要です。

以下は、Happy を 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

2 つのファイルを生成します。ここで、誰かにコメントしてもらいたい点が 1 つあります。基本的には、生成されたファイル ABC.hs の次の行を手動で変更する必要があります。

import System

import System.IO

次に、次のように動作します。

ghc --make ABCMain.hs

すべてがコンパイルされ、パーサーは期待どおりに動作します。私が正しくやっている場合は、お気軽にお知らせください。

于 2014-03-29T23:25:36.967 に答える