tools/pas2c.hs
changeset 6860 f4238c683ec7
parent 6859 cd0697c7e88b
child 6872 0f6eef4a07c8
equal deleted inserted replaced
6859:cd0697c7e88b 6860:f4238c683ec7
   325 
   325 
   326     
   326     
   327 initExpr2C :: InitExpression -> State RenderState Doc
   327 initExpr2C :: InitExpression -> State RenderState Doc
   328 initExpr2C InitNull = return $ text "NULL"
   328 initExpr2C InitNull = return $ text "NULL"
   329 initExpr2C (InitAddress expr) = liftM ((<>) (text "&")) (initExpr2C expr)
   329 initExpr2C (InitAddress expr) = liftM ((<>) (text "&")) (initExpr2C expr)
   330 initExpr2C (InitPrefixOp op expr) = liftM2 (<>) (op2C op) (initExpr2C expr)
   330 initExpr2C (InitPrefixOp op expr) = liftM (text (op2C op) <>) (initExpr2C expr)
   331 initExpr2C (InitBinOp op expr1 expr2) = do
   331 initExpr2C (InitBinOp op expr1 expr2) = do
   332     e1 <- initExpr2C expr1
   332     e1 <- initExpr2C expr1
   333     e2 <- initExpr2C expr2
   333     e2 <- initExpr2C expr2
   334     o <- op2C op
   334     return $ parens $ e1 <+> text (op2C op) <+> e2
   335     return $ parens $ e1 <+> o <+> e2
       
   336 initExpr2C (InitNumber s) = return $ text s
   335 initExpr2C (InitNumber s) = return $ text s
   337 initExpr2C (InitFloat s) = return $ text s
   336 initExpr2C (InitFloat s) = return $ text s
   338 initExpr2C (InitHexNumber s) = return $ text "0x" <> (text . map toLower $ s)
   337 initExpr2C (InitHexNumber s) = return $ text "0x" <> (text . map toLower $ s)
   339 initExpr2C (InitString s) = return $ doubleQuotes $ text s 
   338 initExpr2C (InitString s) = return $ doubleQuotes $ text s 
   340 initExpr2C (InitChar a) = return $ quotes $ text "\\x" <> text (showHex (read a) "")
   339 initExpr2C (InitChar a) = return $ quotes $ text "\\x" <> text (showHex (read a) "")
   453 
   452 
   454 expr2C :: Expression -> State RenderState Doc
   453 expr2C :: Expression -> State RenderState Doc
   455 expr2C (Expression s) = return $ text s
   454 expr2C (Expression s) = return $ text s
   456 expr2C (BinOp op expr1 expr2) = do
   455 expr2C (BinOp op expr1 expr2) = do
   457     e1 <- expr2C expr1
   456     e1 <- expr2C expr1
       
   457     t1 <- gets lastType
   458     e2 <- expr2C expr2
   458     e2 <- expr2C expr2
   459     o <- op2C op
   459     case (op2C op, t1) of
   460     return $ parens $ e1 <+> o <+> e2
   460         ("+", BTString) -> expr2C $ BuiltInFunCall [expr1, expr2] (SimpleReference $ Identifier "_strconcat" (BTFunction BTString))
       
   461         --("==", BTString) -> expr2C $ BuiltInFunCall [expr1, expr2] (SimpleReference $ Identifier "_strcompare" (BTFunction BTBool))
       
   462         --("!=", BTString) -> expr2C $ BuiltInFunCall [expr1, expr2] (SimpleReference $ Identifier "_strncompare" (BTFunction BTBool))
       
   463         ("&", BTBool) -> return $ parens $ e1 <+> text "&&" <+> e2
       
   464         ("|", BTBool) -> return $ parens $ e1 <+> text "||" <+> e2
       
   465         (o, _) -> return $ parens $ e1 <+> text o <+> e2
   461 expr2C (NumberLiteral s) = return $ text s
   466 expr2C (NumberLiteral s) = return $ text s
   462 expr2C (FloatLiteral s) = return $ text s
   467 expr2C (FloatLiteral s) = return $ text s
   463 expr2C (HexNumber s) = return $ text "0x" <> (text . map toLower $ s)
   468 expr2C (HexNumber s) = return $ text "0x" <> (text . map toLower $ s)
   464 expr2C (StringLiteral s) = return $ doubleQuotes $ text s 
   469 expr2C (StringLiteral s) = return $ doubleQuotes $ text s 
   465 expr2C (Reference ref) = ref2C ref
   470 expr2C (Reference ref) = ref2C ref
   466 expr2C (PrefixOp op expr) = liftM2 (<>) (op2C op) (expr2C expr)
   471 expr2C (PrefixOp op expr) = liftM (text (op2C op) <>) (expr2C expr)
   467 expr2C Null = return $ text "NULL"
   472 expr2C Null = return $ text "NULL"
   468 expr2C (BuiltInFunCall params ref) = do
   473 expr2C (BuiltInFunCall params ref) = do
   469     r <- ref2C ref 
   474     r <- ref2C ref 
   470     ps <- mapM expr2C params
   475     ps <- mapM expr2C params
   471     return $ 
   476     return $ 
   538     e <- expr2C expr
   543     e <- expr2C expr
   539     return $ parens t <> e
   544     return $ parens t <> e
   540 ref2C (RefExpression expr) = expr2C expr
   545 ref2C (RefExpression expr) = expr2C expr
   541 
   546 
   542 
   547 
   543 op2C :: String -> State RenderState Doc
   548 op2C :: String -> String
   544 op2C "or" = return $ text "|"
   549 op2C "or" = "|"
   545 op2C "and" = return $ text "&"
   550 op2C "and" = "&"
   546 op2C "not" = return $ text "!"
   551 op2C "not" = "!"
   547 op2C "xor" = return $ text "^"
   552 op2C "xor" = "^"
   548 op2C "div" = return $ text "/"
   553 op2C "div" = "/"
   549 op2C "mod" = return $ text "%"
   554 op2C "mod" = "%"
   550 op2C "shl" = return $ text "<<"
   555 op2C "shl" = "<<"
   551 op2C "shr" = return $ text ">>"
   556 op2C "shr" = ">>"
   552 op2C "<>" = return $ text "!="
   557 op2C "<>" = "!="
   553 op2C "=" = return $ text "=="
   558 op2C "=" = "=="
   554 op2C a = return $ text a
   559 op2C a = a
   555 
   560