1

アレックスのドキュメント (第 5 章)は次のように述べています。

入力テキストの行番号と列番号を Alex に追跡させたい場合もあれば、自分で追跡したい場合もあります (たとえば、標準の 8 列とは異なるタブ幅を使用するなど)。

しかし、アレックス ポジション トラッカーでタブの幅を 8 から 4 に変更するのは、簡単ではなく難しいものです。このコードは、Alex が生成したルーチンの奥深くに隠されています。

-- this function is used by `alexGetByte`, which is used by `alex_scan_tkn`, which is 
-- used by `alexScanUser` and `alexRightContext`,
-- which is used by `alex_accept` etc etc...
alexMove :: AlexPosn -> Char -> AlexPosn
alexMove (AlexPn a l c) '\t' = AlexPn (a+1)  l     (((c+7) `div` 8)*8+1)
alexMove (AlexPn a l c) '\n' = AlexPn (a+1) (l+1)   1
alexMove (AlexPn a l c) _    = AlexPn (a+1)  l     (c+1)
4

1 に答える 1

1

1 つのアイデアは、希望する方法を定義する独自のラッパーを作成するalexMoveことです。

私の Mac では、ラッパーは /Library/Haskell/ghc-7.6.3/lib/alex-3.0.5/share/ にインストールされています。

「AlexWrapper-monad」、「AlexWrapper-monad-bytestring」などの名前のファイルがシステムのどこにあるかを探します。

「-t」コマンド ライン オプションは、テンプレートを探す場所を alex に指示しますが、ラッパーとテンプレートが同じディレクトリに存在するように見えるため、ラッパーにも関連している可能性があります。

于 2014-07-12T16:15:14.793 に答える