Alex 1という Haskell 字句解析ツールの使い方を学んでいます。
この文字列 (電子メールの "From:" ヘッダー) の語彙アナライザーを実装しようとしています。
From: "John Doe" <john@doe.org>
このトークンのリストに分割したいと思います。
[
From,
DisplayName "John Doe",
Email,
LocalName "john",
Domain "doe.org"
]
以下は私の実装です。文字列に表示名が含まれていない場合は正常に機能します。つまり、これは正常に機能します。
let s = "From: <john@doe.org>"
alexScanTokens s
ただし、表示名を含めると、次のエラー メッセージが表示されます。
[From*** Exception: lexical error
つまり、これはエラーになります。
let s = "From: \"John Doe\" <john@doe.org>"
alexScanTokens s
私のAlex
プログラムのこの部分がエラーを引き起こしていると推測しています:
\"[a-zA-Z ]+\" { \s -> DisplayName (init (tail s)) }
Alex
左側は正規表現です 。
\"[a-zA-Z ]+\"
右側は、正規表現に一致する文字列が見つかったときに実行されるアクションです。
{ \s -> DisplayName (init (tail s)) }
問題が何であるかについてのアイデアはありますか?
これが私の字句解析プログラムです。
{
module Main (main) where
}
%wrapper "basic"
$digit = 0-9 -- digits
$alpha = [a-zA-Z] -- alphabetic characters
tokens :-
$white+ ;
From: { \s -> From }
\"[a-zA-Z ]+\" { \s -> DisplayName (init (tail s)) }
\< { \s -> Email }
[$alpha]+@ { \s -> LocalPart (init s) }
[$alpha\.]+> { \s -> Domain (init s) }
{
-- Each action has type :: String -> Token
-- The token type:
data Token =
From |
DisplayName String |
Email |
LocalPart String |
Domain String
deriving (Eq,Show)
main = do
s <- getContents
print (alexScanTokens s)
}
1「Alex」字句解析ツールは、次の URL にあります: http://www.haskell.org/alex/doc/html/introduction.html