You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Currently alex is a command-line tool that takes files in its own format and relies on support from Cabal-the-library to invoke alex command in order to preprocess .x files before passing them to ghc. This works reasonably well, but I think there's something to be gained if alex package would provide quasiquoter that takes lexer definition in the currently used format but spits out TH expressions instead of generating new file.
E.g. take tokens_scan_user.x test from the alex test suite. Instead of
{
moduleMain (main) whereimportSystem.Exit
}
%wrapper "basic"-- Defines: AlexInput, alexGetByte, alexPrevChar$digit =0-9$alpha = [a-zA-Z]
$ws = [\\t\n]
tokens :-5/ {\ u _ibt _l _iat -> u ==FiveIsMagic} { \s ->TFive (head s) }
$digit { \s ->TDigit (head s) }
$alpha { \s ->TAlpha (head s) }
$ws { \s ->TWSpace (head s) }
{
dataToken=TDigitChar
| TAlphaChar
| TWSpaceChar
| TFiveChar-- Predicated only
| TLexErrorderiving (Eq,Show)
dataUserLexerMode=NormalMode
| FiveIsMagicderivingEq
main | test1 /= result1 = exitFailure
| test2 /= result2 = exitFailure
-- all succeeded|otherwise= exitWith ExitSuccessrun_lexer::UserLexerMode->String-> [Token]
run_lexer m s = go ('\n', [], s)
where go i@(_,_,s') =case alexScanUser m i 0ofAlexEOF->[]AlexError _i -> [TLexError]
AlexSkip i' _len -> go i'
AlexToken i' len t -> t (take len s') : go i'
test1 = run_lexer FiveIsMagic"5 x"
result1 = [TFive'5',TWSpace'',TAlpha'x']
test2 = run_lexer NormalMode"5 x"
result2 = [TDigit'5',TWSpace'',TAlpha'x']
}
I'd like to write TokensScanUser.hs file that looks like:
{-# LANGUAGE QuasiQuotes #-}
moduleMain (main) whereimportSystem.ExitimportAlex.TH
genLexer defaultLexer [alex|
%wrapper "basic" -- Defines: AlexInput, alexGetByte, alexPrevChar
$digit = 0-9
$alpha = [a-zA-Z]
$ws = [\ \t\n]
tokens :-
5 / {\u _ibt _l _iat -> u == FiveIsMagic} { \s -> TFive (head s) }
$digit { \s -> TDigit (head s) }
$alpha { \s -> TAlpha (head s) }
$ws { \s -> TWSpace (head s) }
|]
dataToken=TDigitChar
| TAlphaChar
| TWSpaceChar
| TFiveChar-- Predicated only
| TLexErrorderiving (Eq,Show)
dataUserLexerMode=NormalMode
| FiveIsMagicderivingEq
main | test1 /= result1 = exitFailure
| test2 /= result2 = exitFailure
-- all succeeded|otherwise= exitWith ExitSuccessrun_lexer::UserLexerMode->String-> [Token]
run_lexer m s = go ('\n', [], s)
where go i@(_,_,s') =case alexScanUser m i 0ofAlexEOF->[]AlexError _i -> [TLexError]
AlexSkip i' _len -> go i'
AlexToken i' len t -> t (take len s') : go i'
test1 = run_lexer FiveIsMagic"5 x"
result1 = [TFive'5',TWSpace'',TAlpha'x']
test2 = run_lexer NormalMode"5 x"
result2 = [TDigit'5',TWSpace'',TAlpha'x']
Having such quasiquoter will provide following benefits:
This will provide an option to use alex independent of system's preprocessor if, say, clang starts to behave funny
User will be able to just start ghci in his or hers project and load lexer definition to play with - no need to add dist/build/ directory (or different directory, depending on build target and the build tool (cabal has one prefix here, stack has another depending on the snapshot))to ghci path any more
Indexing with e.g. tag generators should also improve because these programs will just skip quasiquoter part and index all user-defined functions.
The text was updated successfully, but these errors were encountered:
Currently
alex
is a command-line tool that takes files in its own format and relies on support from Cabal-the-library to invokealex
command in order to preprocess.x
files before passing them to ghc. This works reasonably well, but I think there's something to be gained ifalex
package would provide quasiquoter that takes lexer definition in the currently used format but spits out TH expressions instead of generating new file.E.g. take
tokens_scan_user.x
test from the alex test suite. Instead ofI'd like to write
TokensScanUser.hs
file that looks like:Having such quasiquoter will provide following benefits:
clang
starts to behave funnyghci
in his or hers project and load lexer definition to play with - no need to adddist/build/
directory (or different directory, depending on build target and the build tool (cabal
has one prefix here,stack
has another depending on the snapshot))toghci
path any moreThe text was updated successfully, but these errors were encountered: