0

次の動作中のAlexソース ファイルを考えてみましょう。

{
module Main (main) where
}

%wrapper "basic"

tokens :-
    $white ;
    .      { rule "!"}

{

type Token = String

rule tok = \s -> tok

main = do
    s <- getContents
    mapM_ print (alexScanTokens s)
}

すべてのルールの前に、ヘルパー コードをファイルの一番上に配置したいと考えています。私はこれをやってみました:

{
module Main (main) where
}

%wrapper "basic"

{
type Token = String

rule tok = \s -> tok
}

tokens :-
    $white ;
    .      { rule "!"}

{

main = do
    s <- getContents
    mapM_ print (alexScanTokens s)
}

しかし、次のエラーが発生しました:

test.x:11:2: parse error

(11 行目は、ヘルパー コードの後の閉じ中括弧です)

ヘルパー コードをファイルの先頭に近づける方法はありますか?

また、「module Main」宣言とともにヘルパー コードを最初のブロックに配置しようとしましたが、「%wrapper」ビットが、生成されたファイルの最初のものとして正しく表示される必要があるインポート ステートメントを生成するため、うまくいきませんでした。

4

1 に答える 1

3

Alex のドキュメントからの引用:

「Alex ファイルの全体的なレイアウトは次のとおりです。

alex := [ @code ] [ wrapper ] { macrodef } @id ':-' { rule } [ @code ]

ファイルの先頭にあるコード フラグメントは、通常、モジュール名といくつかのインポートを宣言するために使用されます。それだけで十分です。先頭のコード フラグメントでは関数や型を宣言しないでください生成されたレクサー コードに独自のインポートをいくつか追加し、出力ファイルのこのコード フラグメントの直後に追加することでこれを行います。」

したがって、あなたがやろうとしていることは構文に違反しています。データ型の定義を配置できる唯一の場所Tokenは、最後のコード ブロックにあるようです。

ただし、必要に応じて、このコードを別のモジュールに配置importし、最上位のコード ブロックに配置することもできます。

于 2013-08-26T18:45:39.773 に答える