1

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

4

1 に答える 1

7

"John Doe"問題を引き起こしているのはその中のスペースです。

のような文字セットでは空白は無視されます[a-zA-Z ]。スペースを含めるには、バックスラッシュでエスケープする必要があります[a-zA-Z\ ]

また、レクサーはこの仕事には不適切なツールである可能性があることに注意せずにはいられません。Parsecなどを使用して適切なパーサーを作成することを検討してください。

于 2013-05-15T17:14:55.867 に答える