私はAlexを学び始めており、ステートフル コンテキストが役立つところまで到達したと信じていますが、どうすればよいか完全にはわかりません。私はerlang バイナリの限られたサブセットをレックスしようとしています。次のレクサーを使用します。
{
module Main (main, Token(..), AlexPosn(..), alexScanTokens, token_posn) where
}
%wrapper "posn"
$digit = 0-9 -- digits
$alpha = [a-zA-Z] -- alphabetic characters
$dbl_quote = \"
tokens :-
$white+ ;
"," { tok (\p s -> Comma p) }
"<<" { tok (\p s -> BinaryOpen p) }
">>" { tok (\p s -> BinaryClose p) }
$dbl_quote [^$dbl_quote]* $dbl_quote { tok (\p s -> ErlStr p (init (tail s))) }
$digit+ { tok (\p s -> ErlInt p (read s)) }
{
-- action helpers:
tok :: (AlexPosn -> String -> Token) -> AlexPosn -> String -> Token
tok f p s = f p s
data Token =
Comma AlexPosn |
BinaryOpen AlexPosn |
BinaryClose AlexPosn |
ErlInt AlexPosn Integer |
ErlStr AlexPosn String
deriving (Eq, Show)
token_posn :: Token -> AlexPosn
token_posn (Comma p) = p
token_posn (BinaryOpen p) = p
token_posn (BinaryClose p) = p
token_posn (ErlInt p _) = p
token_posn (ErlStr p _) = p
main :: IO ()
main = do
s <- getContents
print (alexScanTokens s)
}
私はかなりうまくやっています。例えば、
> alex so_erlang_lexer.x && ghc --make -o erlexer so_erlang_lexer.hs && echo '<<"100", 1>>' | ./erlexer
[1 of 1] Compiling Main ( so_erlang_lexer.hs, so_erlang_lexer.o )
Linking erlexer ...
[BinaryOpen (AlexPn 0 1 1),ErlStr (AlexPn 2 1 3) "100",Comma (AlexPn 7 1 8),ErlInt (AlexPn 9 1 10) 1,BinaryClose (AlexPn 10 1 11)]
lexed return を と同等にしたいBinary [ErlStr "100", ErlInt 1]
のですが、頭の中でクリックする開始コードを使用するレクサーを見つけることができませんでした。
- ここで参照されているGHC の字句解析器は、Alex ラッパーを一切使用していません。
- モナドと monadUserState ラッパーに関する Alex 自身のドキュメント (こちら) を見ると、どちらを選択すればよいか、またどちらをどのように利用できるかがわかりません。
- アレックスの虎の例が最も有望ですが、あまりにも大きいので、私の無知を片付けるのに苦労しています.
- この質問はモナドパーサーを利用していますが、その状態機能を利用していないようです。
誰かが私を少し案内してくれるほど親切でしょうか?