Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Diff of /branches/pure-cfg/src/compiler/codegen/clang.sml
ViewVC logotype

Diff of /branches/pure-cfg/src/compiler/codegen/clang.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 520, Thu Feb 10 19:25:53 2011 UTC revision 521, Thu Feb 10 23:17:06 2011 UTC
# Line 8  Line 8 
8   *)   *)
9    
10  structure CLang =  structure CLang =
11    sig    struct
12    
13      datatype exp      datatype exp
14        = E_Grp of exp                    (* "(" e ")" *)        = E_Grp of exp                    (* "(" e ")" *)
15        | E_BinOp of exp * binop * exp    (* e op e *)        | E_BinOp of exp * binop * exp    (* e op e *)
16        | E_UnOp of unop * exp            (* op e *)        | E_UnOp of unop * exp            (* op e *)
17        | E_Apply of string * exp list    (* f "(" ... ")" *)        | E_Apply of string * exp list    (* f "(" ... ")" *)
18          | E_Subscript of exp * exp        (* e "[" e "]" *)
19          | E_Select of exp * string        (* e "." f *)
20          | E_Cast of ty * exp              (* "(" ty ")" e *)
21          | E_Var of var
22    
23      (* binary operators in increasing order of precedence *)
24        and binop
25          = #||
26          | #&&
27          | #== | #!=
28          | #< | #<= | #>= | #>
29          | #+ | #-
30          | #* | #/ | #%
31    
32        and unop = %- | %! | %& | %* | %~
33    
34        local
35          val commaP        = 0
36          val assignP       = 1
37          val condP         = 2
38          val lorP          = 3
39          val landP         = 4
40          val borP          = 5
41          val bandP         = 6
42          val eqP           = 7
43          val relP          = 8
44          val shiftP        = 9
45          val addP          = 10
46          val mulP          = 11
47          val unaryP        = 12
48          val preP          = 13
49          val compundP      = 14    (* compound literal *)
50          val postP         = 15
51          val callP         = 16
52          val subP          = 17
53          val atomP         = 18
54          fun precOfBinop rator = (case rator
55                 of #|| => lorP
56                  | #&& => landP
57                  | #== => eqP | #!= => eqP
58                  | #< => relP | #<= => relP | #>= => relP | #> => relP
59                  | #+ => addP | #- => addP
60                  | #* => mulP | #/ => mulP | #% => mulP
61                (* end case *))
62          fun prec (E_Grp _) = atomP
63            | prec (E_BinOp(_, rator, _)) = precOfBinop rator
64            | prec (E_UnOp(rator, _)) = preP
65            | prec (E_Apply _) = callP
66            | prec (E_Subscript _) = postP
67            | prec (E_Select _) = postP
68            | prec (E_Cast _) = unaryP
69            | prec (E_Var _) = atomP
70        in
71        fun mkGrp e = if (prec e < atomP) then E_Grp e else e
72      (* A smart constructor for binary operators that adds parens as necessary.
73       * Note that all C binary operators are left associative.
74       *)
75        fun mkBinOp (e1, rator, e2) = let
76              val p = precOfBinop rator
77              val e1' = if prec e1 < p then E_Grp e1 else e1
78              val e2' = if prec e2 <= p then E_Grp e2 else e2
79              in
80                E_BinOp(e1', rator, e2')
81              end
82        fun mkUnOp (rator, e) = if prec e < unaryP
83              then E_UnOp(rator, E_Grp e)
84              else E_UnOp(rator, e)
85        fun mkApply (f, args) = E_Apply(f, args)
86        fun mkSubscript(e1, e2) = if prec e1 < postP
87              then E_Subscript(E_Grp e1, e2)
88              else E_Subscript(e1, e2)
89        fun mkSelect (e, f) = if prec e < postP
90              then E_Select(E_Grp e, f)
91              else E_Select(e, f)
92        fun mkCast (ty, e) = E_Cast(ty, e)
93        val mkVar = E_Var
94        end (* local *)
95    
96    end    end

Legend:
Removed from v.520  
changed lines
  Added in v.521

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0