3a_asm: .define support
[calu.git] / 3a_asm / Main.hs
index 2952e8b53925251ba684962ee0b4455ccfcb0ecc..fa5a12c386a5315ddc8d0a6704747fa2aa8d495b 100644 (file)
@@ -58,6 +58,7 @@ convertDTF ((lno,str):xs) state datacnt instrcnt dict = (newdict, (actlist newdt
        where
        actlist (DTF_Org _) = next
        actlist (DTF_State _) = next
+       actlist (DTF_Define _ _ _) = next
        actlist y = y:next
 
        (newdict,next) = convertDTF xs (nstate newdtf) (ndatacnt newdtf) (ninstrcnt newdtf) (ndict newdtf)
@@ -83,6 +84,7 @@ convertDTF ((lno,str):xs) state datacnt instrcnt dict = (newdict, (actlist newdt
        ndict (DTF_InstrToParse a _ _ l _) = dict `add_elem` (l,a)
        ndict (DTF_Data a _ _ l _) = dict `add_elem` (l,a)
        ndict (DTF_Instr a _ _ l _) = dict `add_elem` (l,a)
+       ndict (DTF_Define l v _) = dict `add_elem` (l,v)
        ndict _ = dict
 
        newdtf = case (parse parseDTFLine "" (str++"\n")) of
@@ -103,7 +105,7 @@ convertDTF ((lno,str):xs) state datacnt instrcnt dict = (newdict, (actlist newdt
                                NoState -> error "missing .data or .text"
                                InData -> (DTF_Label l c datacnt)
                                InText -> (DTF_Label l c instrcnt)
-               Right z -> z -- DTF_Comment, DTF_State
+               Right z -> z -- DTF_Comment, DTF_State, DTF_Define
 
 
 
@@ -116,15 +118,20 @@ testDTF input =
 parseDTFLine :: Parser DTF
 parseDTFLine = foldl1 (<|>) (fmap try lineFormats) <* char '\n'
 
-lineFormats = [lf_sdata, lf_stext, lf_org, lf_data, lf_comment, lf_toparse, lf_label]
+lineFormats = [lf_define, lf_sdata, lf_stext, lf_org, lf_data, lf_comment, lf_toparse, lf_label]
 
 -- helper
+parseIdent :: Parser String
+parseIdent = do
+       ident <- letter
+       idents <- many $ (letter <|> digit <|> char '_')
+       return $ (ident:idents)
+
 parseLabel :: Parser String
 parseLabel = do
-       label <- letter 
-       labels <- many $ (letter <|> digit <|> char '_')
+       l <- parseIdent
        char ':'
-       return $ (label:labels)
+       return $ l
 
 parseComment :: Parser String
 parseComment = do
@@ -189,3 +196,12 @@ lf_stext = do
        parseMySpaces
        return $ DTF_State InText
 
+lf_define = do
+       skipMany space
+       string ".define"
+       parseMySpaces
+       id <- parseIdent
+       parseMySpaces; char ','; parseMySpaces
+       ret <- parseConst
+       comment <- try(parseComment) <|> parseMySpaces
+       return $ DTF_Define id ret comment