Mercurial > hg > index.cgi
comparison lwcc/tree.c @ 502:14a40f8bb4eb
Add various operators to lwcc
Add various binary and ternary operators to lwcc, but only those which can
work with constant operands. Seems like variables are probably required
next.
author | William Astle <lost@l-w.ca> |
---|---|
date | Wed, 25 Sep 2019 20:23:49 -0600 |
parents | f3e9732973f1 |
children | 7e8298f7bc0a |
comparison
equal
deleted
inserted
replaced
501:f3e9732973f1 | 502:14a40f8bb4eb |
---|---|
55 "CONST_INT", | 55 "CONST_INT", |
56 "OPER_PLUS", | 56 "OPER_PLUS", |
57 "OPER_MINUS", | 57 "OPER_MINUS", |
58 "OPER_TIMES", | 58 "OPER_TIMES", |
59 "OPER_DIVIDE", | 59 "OPER_DIVIDE", |
60 "OPER_MOD", | |
61 "OPER_COND", | |
62 "OPER_FNCALL", | |
63 "OPER_SUBSCRIPT", | |
64 "OPER_POSTINC", | |
65 "OPER_POSTDEC", | |
66 "OPER_PTRMEM", | |
67 "OPER_OBJMEM", | |
68 "OPER_LSH", | |
69 "OPER_RSH", | |
70 "OPER_LT", | |
71 "OPER_LE", | |
72 "OPER_GT", | |
73 "OPER_GE", | |
74 "OPER_EQ", | |
75 "OPER_NE", | |
76 "OPER_BWAND", | |
77 "OPER_BWXOR", | |
78 "OPER_BWOR", | |
79 "OPER_BAND", | |
80 "OPER_BOR", | |
81 "OPER_ASS", | |
82 "OPER_ADDASS", | |
83 "OPER_SUBASS", | |
84 "OPER_MULASS", | |
85 "OPER_DIVASS", | |
86 "OPER_MODASS", | |
87 "OPER_LSHASS", | |
88 "OPER_RSHASS", | |
89 "OPER_BWANDASS", | |
90 "OPER_BWXORASS", | |
91 "OPER_BWORASS", | |
92 "OPER_COMMA", | |
60 }; | 93 }; |
61 | 94 |
62 | 95 |
63 | 96 |
64 node_t *node_create(int type, ...) | 97 node_t *node_create(int type, ...) |
76 { | 109 { |
77 case NODE_OPER_PLUS: | 110 case NODE_OPER_PLUS: |
78 case NODE_OPER_MINUS: | 111 case NODE_OPER_MINUS: |
79 case NODE_OPER_TIMES: | 112 case NODE_OPER_TIMES: |
80 case NODE_OPER_DIVIDE: | 113 case NODE_OPER_DIVIDE: |
114 case NODE_OPER_MOD: | |
115 case NODE_OPER_BWAND: | |
116 case NODE_OPER_BWXOR: | |
117 case NODE_OPER_BWOR: | |
118 case NODE_OPER_BAND: | |
119 case NODE_OPER_BOR: | |
120 case NODE_OPER_SUBSCRIPT: | |
121 case NODE_OPER_PTRMEM: | |
122 case NODE_OPER_OBJMEM: | |
123 case NODE_OPER_ASS: | |
124 case NODE_OPER_ADDASS: | |
125 case NODE_OPER_SUBASS: | |
126 case NODE_OPER_MULASS: | |
127 case NODE_OPER_DIVASS: | |
128 case NODE_OPER_MODASS: | |
129 case NODE_OPER_LSH: | |
130 case NODE_OPER_LSHASS: | |
131 case NODE_OPER_RSH: | |
132 case NODE_OPER_RSHASS: | |
133 case NODE_OPER_BWANDASS: | |
134 case NODE_OPER_BWORASS: | |
135 case NODE_OPER_BWXORASS: | |
136 case NODE_OPER_LT: | |
137 case NODE_OPER_LE: | |
138 case NODE_OPER_GT: | |
139 case NODE_OPER_GE: | |
140 case NODE_OPER_EQ: | |
141 case NODE_OPER_NE: | |
142 case NODE_OPER_COMMA: | |
143 nargs = 2; | |
144 break; | |
145 | |
146 case NODE_OPER_FNCALL: | |
81 nargs = 2; | 147 nargs = 2; |
82 break; | 148 break; |
83 | 149 |
84 case NODE_DECL: | 150 case NODE_DECL: |
85 nargs = 2; | 151 nargs = 2; |
152 break; | |
153 | |
154 case NODE_OPER_POSTINC: | |
155 case NODE_OPER_POSTDEC: | |
156 nargs = 1; | |
86 break; | 157 break; |
87 | 158 |
88 case NODE_TYPE_PTR: | 159 case NODE_TYPE_PTR: |
89 nargs = 1; | 160 nargs = 1; |
90 break; | 161 break; |
94 r -> strval = lw_strdup(va_arg(args, char *)); | 165 r -> strval = lw_strdup(va_arg(args, char *)); |
95 break; | 166 break; |
96 | 167 |
97 case NODE_FUNDEF: | 168 case NODE_FUNDEF: |
98 nargs = 4; | 169 nargs = 4; |
170 break; | |
171 | |
172 case NODE_OPER_COND: | |
173 nargs = 3; | |
99 break; | 174 break; |
100 | 175 |
101 case NODE_FUNDECL: | 176 case NODE_FUNDECL: |
102 nargs = 3; | 177 nargs = 3; |
103 break; | 178 break; |