tools/pas2c.hs
changeset 6854 873929cbd54b
parent 6853 affeaba0af71
child 6855 807156c01475
equal deleted inserted replaced
6853:affeaba0af71 6854:873929cbd54b
   113 toCFiles ns p@(fn, pu) = do
   113 toCFiles ns p@(fn, pu) = do
   114     hPutStrLn stderr $ "Rendering '" ++ fn ++ "'..."
   114     hPutStrLn stderr $ "Rendering '" ++ fn ++ "'..."
   115     toCFiles' p
   115     toCFiles' p
   116     where
   116     where
   117     toCFiles' (fn, p@(Program {})) = writeFile (fn ++ ".c") $ (render2C initialState . pascal2C) p
   117     toCFiles' (fn, p@(Program {})) = writeFile (fn ++ ".c") $ (render2C initialState . pascal2C) p
   118     toCFiles' (fn, (Unit _ interface implementation _ _)) = do
   118     toCFiles' (fn, (Unit unitId interface implementation _ _)) = do
   119         let (a, s) = runState (interface2C interface) initialState
   119         let (a, s) = runState (id2C IOInsert (setBaseType BTUnit unitId) >> interface2C interface) initialState
   120         writeFile (fn ++ ".h") $ "#pragma once\n" ++ (render a)
   120         writeFile (fn ++ ".h") $ "#pragma once\n" ++ (render a)
   121         writeFile (fn ++ ".c") $ (render2C s . implementation2C) implementation
   121         writeFile (fn ++ ".c") $ (render2C s . implementation2C) implementation
   122     initialState = emptyState ns
   122     initialState = emptyState ns
   123 
   123 
   124     render2C :: RenderState -> State RenderState Doc -> String
   124     render2C :: RenderState -> State RenderState Doc -> String
   449         r <> parens (hsep . punctuate (char ',') $ ps)
   449         r <> parens (hsep . punctuate (char ',') $ ps)
   450 expr2C _ = return $ text "<<expression>>"
   450 expr2C _ = return $ text "<<expression>>"
   451 
   451 
   452 
   452 
   453 ref2C :: Reference -> State RenderState Doc
   453 ref2C :: Reference -> State RenderState Doc
       
   454 -- rewrite into proper form
       
   455 ref2C r@(RecordField ref1 (ArrayElement exprs ref2)) = ref2C $ ArrayElement exprs (RecordField ref1 ref2)
       
   456 ref2C r@(RecordField ref1 (Dereference ref2)) = ref2C $ Dereference (RecordField ref1 ref2)
       
   457 ref2C r@(RecordField ref1 (RecordField ref2 ref3)) = ref2C $ RecordField (RecordField ref1 ref2) ref3
       
   458 -- conversion routines
   454 ref2C ae@(ArrayElement exprs ref) = do
   459 ref2C ae@(ArrayElement exprs ref) = do
   455     es <- mapM expr2C exprs
   460     es <- mapM expr2C exprs
   456     r <- ref2C ref 
   461     r <- ref2C ref 
   457     t <- gets lastType
   462     t <- gets lastType
   458     ns <- gets currentScope
   463     ns <- gets currentScope