projects
/
ghc-hetmet.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
minimize impact on PrelNames
[ghc-hetmet.git]
/
compiler
/
cmm
/
CmmLex.x
diff --git
a/compiler/cmm/CmmLex.x
b/compiler/cmm/CmmLex.x
index
ec9f585
..
9a7b43d
100644
(file)
--- a/
compiler/cmm/CmmLex.x
+++ b/
compiler/cmm/CmmLex.x
@@
-11,13
+11,19
@@
-----------------------------------------------------------------------------
{
-----------------------------------------------------------------------------
{
+{-# LANGUAGE BangPatterns #-}
+{-# OPTIONS -Wwarn -w #-}
+-- The above -Wwarn supression flag is a temporary kludge.
+-- While working on this module you are encouraged to remove it and fix
+-- any warnings in the module. See
+-- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
+-- for details
+
module CmmLex (
CmmToken(..), cmmlex,
) where
module CmmLex (
CmmToken(..), cmmlex,
) where
-#include "HsVersions.h"
-
-import Cmm
+import OldCmm
import Lexer
import SrcLoc
import Lexer
import SrcLoc
@@
-69,7
+75,7
@@
$white_no_nl+ ;
-- single-line line pragmas, of the form
-- # <line> "<file>" <extra-stuff> \n
<line_prag> $digit+ { setLine line_prag1 }
-- single-line line pragmas, of the form
-- # <line> "<file>" <extra-stuff> \n
<line_prag> $digit+ { setLine line_prag1 }
-<line_prag1> \" ($printable # \")* \" { setFile line_prag2 }
+<line_prag1> \" [^\"]* \" { setFile line_prag2 }
<line_prag2> .* { pop }
<0> {
<line_prag2> .* { pop }
<0> {
@@
-88,7
+94,8
@@
$white_no_nl+ ;
"&&" { kw CmmT_BoolAnd }
"||" { kw CmmT_BoolOr }
"&&" { kw CmmT_BoolAnd }
"||" { kw CmmT_BoolOr }
- R@decimal { global_regN VanillaReg }
+ P@decimal { global_regN (\n -> VanillaReg n VGcPtr) }
+ R@decimal { global_regN (\n -> VanillaReg n VNonGcPtr) }
F@decimal { global_regN FloatReg }
D@decimal { global_regN DoubleReg }
L@decimal { global_regN LongReg }
F@decimal { global_regN FloatReg }
D@decimal { global_regN DoubleReg }
L@decimal { global_regN LongReg }
@@
-138,8
+145,10
@@
data CmmToken
| CmmT_if
| CmmT_jump
| CmmT_foreign
| CmmT_if
| CmmT_jump
| CmmT_foreign
+ | CmmT_never
| CmmT_prim
| CmmT_return
| CmmT_prim
| CmmT_return
+ | CmmT_returns
| CmmT_import
| CmmT_switch
| CmmT_case
| CmmT_import
| CmmT_switch
| CmmT_case
@@
-150,6
+159,7
@@
data CmmToken
| CmmT_bits64
| CmmT_float32
| CmmT_float64
| CmmT_bits64
| CmmT_float32
| CmmT_float64
+ | CmmT_gcptr
| CmmT_GlobalReg GlobalReg
| CmmT_Name FastString
| CmmT_String String
| CmmT_GlobalReg GlobalReg
| CmmT_Name FastString
| CmmT_String String
@@
-163,7
+173,7
@@
data CmmToken
-- -----------------------------------------------------------------------------
-- Lexer actions
-- -----------------------------------------------------------------------------
-- Lexer actions
-type Action = SrcSpan -> StringBuffer -> Int -> P (Located CmmToken)
+type Action = RealSrcSpan -> StringBuffer -> Int -> P (RealLocated CmmToken)
begin :: Int -> Action
begin code _span _str _len = do pushLexState code; lexToken
begin :: Int -> Action
begin code _span _str _len = do pushLexState code; lexToken
@@
-214,8
+224,10
@@
reservedWordsFM = listToUFM $
( "if", CmmT_if ),
( "jump", CmmT_jump ),
( "foreign", CmmT_foreign ),
( "if", CmmT_if ),
( "jump", CmmT_jump ),
( "foreign", CmmT_foreign ),
+ ( "never", CmmT_never ),
( "prim", CmmT_prim ),
( "return", CmmT_return ),
( "prim", CmmT_prim ),
( "return", CmmT_return ),
+ ( "returns", CmmT_returns ),
( "import", CmmT_import ),
( "switch", CmmT_switch ),
( "case", CmmT_case ),
( "import", CmmT_import ),
( "switch", CmmT_switch ),
( "case", CmmT_case ),
@@
-225,7
+237,15
@@
reservedWordsFM = listToUFM $
( "bits32", CmmT_bits32 ),
( "bits64", CmmT_bits64 ),
( "float32", CmmT_float32 ),
( "bits32", CmmT_bits32 ),
( "bits64", CmmT_bits64 ),
( "float32", CmmT_float32 ),
- ( "float64", CmmT_float64 )
+ ( "float64", CmmT_float64 ),
+-- New forms
+ ( "b8", CmmT_bits8 ),
+ ( "b16", CmmT_bits16 ),
+ ( "b32", CmmT_bits32 ),
+ ( "b64", CmmT_bits64 ),
+ ( "f32", CmmT_float32 ),
+ ( "f64", CmmT_float64 ),
+ ( "gcptr", CmmT_gcptr )
]
tok_decimal span buf len
]
tok_decimal span buf len
@@
-248,7
+268,7
@@
tok_string str = CmmT_String (read str)
setLine :: Int -> Action
setLine code span buf len = do
let line = parseUnsignedInteger buf len 10 octDecDigit
setLine :: Int -> Action
setLine code span buf len = do
let line = parseUnsignedInteger buf len 10 octDecDigit
- setSrcLoc (mkSrcLoc (srcSpanFile span) (fromIntegral line - 1) 0)
+ setSrcLoc (mkRealSrcLoc (srcSpanFile span) (fromIntegral line - 1) 1)
-- subtract one: the line number refers to the *following* line
-- trace ("setLine " ++ show line) $ do
popLexState
-- subtract one: the line number refers to the *following* line
-- trace ("setLine " ++ show line) $ do
popLexState
@@
-258,7
+278,7
@@
setLine code span buf len = do
setFile :: Int -> Action
setFile code span buf len = do
let file = lexemeToFastString (stepOn buf) (len-2)
setFile :: Int -> Action
setFile code span buf len = do
let file = lexemeToFastString (stepOn buf) (len-2)
- setSrcLoc (mkSrcLoc file (srcSpanEndLine span) (srcSpanEndCol span))
+ setSrcLoc (mkRealSrcLoc file (srcSpanEndLine span) (srcSpanEndCol span))
popLexState
pushLexState code
lexToken
popLexState
pushLexState code
lexToken
@@
-269,17
+289,17
@@
setFile code span buf len = do
cmmlex :: (Located CmmToken -> P a) -> P a
cmmlex cont = do
cmmlex :: (Located CmmToken -> P a) -> P a
cmmlex cont = do
- tok@(L _ tok__) <- lexToken
- --trace ("token: " ++ show tok__) $ do
- cont tok
+ (L span tok) <- lexToken
+ --trace ("token: " ++ show tok) $ do
+ cont (L (RealSrcSpan span) tok)
-lexToken :: P (Located CmmToken)
+lexToken :: P (RealLocated CmmToken)
lexToken = do
inp@(loc1,buf) <- getInput
sc <- getLexState
case alexScan inp sc of
lexToken = do
inp@(loc1,buf) <- getInput
sc <- getLexState
case alexScan inp sc of
- AlexEOF -> do let span = mkSrcSpan loc1 loc1
- setLastToken span 0 0
+ AlexEOF -> do let span = mkRealSrcSpan loc1 loc1
+ setLastToken span 0
return (L span CmmT_EOF)
AlexError (loc2,_) -> do failLocMsgP loc1 loc2 "lexical error"
AlexSkip inp2 _ -> do
return (L span CmmT_EOF)
AlexError (loc2,_) -> do failLocMsgP loc1 loc2 "lexical error"
AlexSkip inp2 _ -> do
@@
-287,15
+307,15
@@
lexToken = do
lexToken
AlexToken inp2@(end,buf2) len t -> do
setInput inp2
lexToken
AlexToken inp2@(end,buf2) len t -> do
setInput inp2
- let span = mkSrcSpan loc1 end
- span `seq` setLastToken span len len
+ let span = mkRealSrcSpan loc1 end
+ span `seq` setLastToken span len
t span buf len
-- -----------------------------------------------------------------------------
-- Monad stuff
-- Stuff that Alex needs to know about our input type:
t span buf len
-- -----------------------------------------------------------------------------
-- Monad stuff
-- Stuff that Alex needs to know about our input type:
-type AlexInput = (SrcLoc,StringBuffer)
+type AlexInput = (RealSrcLoc,StringBuffer)
alexInputPrevChar :: AlexInput -> Char
alexInputPrevChar (_,s) = prevChar s '\n'
alexInputPrevChar :: AlexInput -> Char
alexInputPrevChar (_,s) = prevChar s '\n'