私は Haskell を使い始めており、Alexツールを使用して正規表現を作成しようとしていますが、少し迷っています。私の最初の不便はコンパイル部分でした。アレックスでファイルをコンパイルするにはどうすればよいですか?. 次に、アレックスが生成するモジュールをコードにインポートする必要があると思いますが、よくわかりません。誰かが私を助けることができれば、私はとても素晴らしいです!
3 に答える
Alex で正規表現関数を指定できます。
たとえば、浮動小数点数に一致する Alex の正規表現は次のとおりです。
$space = [\ \t\xa0]
$digit = 0-9
$octit = 0-7
$hexit = [$digit A-F a-f]
@sign = [\-\+]
@decimal = $digit+
@octal = $octit+
@hexadecimal = $hexit+
@exponent = [eE] [\-\+]? @decimal
@number = @decimal
| @decimal \. @decimal @exponent?
| @decimal @exponent
| 0[oO] @octal
| 0[xX] @hexadecimal
lex :-
@sign? @number { strtod }
浮動小数点数が一致したら、解析関数にディスパッチして、キャプチャされた文字列を操作します。これをラップして、解析関数としてユーザーに公開できます。
readDouble :: ByteString -> Maybe (Double, ByteString)
readDouble str = case alexScan (AlexInput '\n' str) 0 of
AlexEOF -> Nothing
AlexError _ -> Nothing
AlexToken (AlexInput _ rest) n _ ->
case strtod (B.unsafeTake n str) of d -> d `seq` Just $! (d , rest)
この正規表現マッチングに Alex を使用することの良い結果は、正規表現エンジンが静的にコンパイルされるため、パフォーマンスが良好であることです。また、cabal で構築された通常の Haskell ライブラリとして公開することもできます。完全な実装については、bytestring-lexing を参照してください。
正規表現マッチャーの代わりにレクサーを使用する場合の一般的なアドバイスは、一致させようとしている語彙素の文法がある場合は、浮動小数点の場合と同様に、アレックスを使用することです。そうでなく、構造がアドホックである場合は、正規表現エンジンを使用してください。
alex を使用して正規表現を作成する理由は何ですか? 正規表現マッチングなどを行うことだけが必要な場合は、regex-base パッケージを確認する必要があります。
必要なプレーン正規表現の場合、API はtext.regex.baseで指定されます。次に、 text.regex.Posix、text.regex.pcreなどの実装があります。Haddoc のドキュメントは少しスリムですが、基本はReal World Haskell の第 8 章で説明されています。このSO の質問では、より詳細な内容が説明されています。