1 | # -*- coding: utf-8 -*-
|
---|
2 | #
|
---|
3 | # TECS Generator
|
---|
4 | # Generator for TOPPERS Embedded Component System
|
---|
5 | #
|
---|
6 | # Copyright (C) 2008-2014 by TOPPERS Project
|
---|
7 | #--
|
---|
8 | # ä¸è¨èä½æ¨©è
|
---|
9 | ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§
|
---|
10 | # ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹
|
---|
11 | # å¤ã»åé
|
---|
12 | å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼
|
---|
13 | # (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½
|
---|
14 | # 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼
|
---|
15 | # ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼
|
---|
16 | # (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿
|
---|
17 | # ç¨ã§ããå½¢ã§åé
|
---|
18 | å¸ããå ´åã«ã¯ï¼åé
|
---|
19 | å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨
|
---|
20 | # è
|
---|
21 | ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨
|
---|
22 | # ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼
|
---|
23 | # (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿
|
---|
24 | # ç¨ã§ããªãå½¢ã§åé
|
---|
25 | å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã
|
---|
26 | # ã¨ï¼
|
---|
27 | # (a) åé
|
---|
28 | å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è
|
---|
29 | ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è
|
---|
30 | # ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼
|
---|
31 | # (b) åé
|
---|
32 | å¸ã®å½¢æ
|
---|
33 | ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã«
|
---|
34 | # å ±åãããã¨ï¼
|
---|
35 | # (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ
|
---|
36 | # 害ãããï¼ä¸è¨èä½æ¨©è
|
---|
37 | ããã³TOPPERSããã¸ã§ã¯ããå
|
---|
38 | 責ãããã¨ï¼
|
---|
39 | # ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç
|
---|
40 | # ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è
|
---|
41 | ããã³TOPPERSããã¸ã§ã¯ãã
|
---|
42 | # å
|
---|
43 | 責ãããã¨ï¼
|
---|
44 | #
|
---|
45 | # æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è
|
---|
46 | ã
|
---|
47 | # ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç
|
---|
48 | # ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§
|
---|
49 | # ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã
|
---|
50 | # ã®è²¬ä»»ãè² ããªãï¼
|
---|
51 | #
|
---|
52 | # $Id: value.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
|
---|
53 | #++
|
---|
54 |
|
---|
55 | #= BaseVal æ´æ°ãæµ®åå°æ°ãªã©ã®å¤ãæ±ãã¯ã©ã¹ã®åºåºã¯ã©ã¹
|
---|
56 | #
|
---|
57 | # TECS ã® CDL ã§æ±ãå¤ã¯ã以ä¸ã«åé¡ããã
|
---|
58 | # ã»æ´æ°
|
---|
59 | # ã»æµ®åå°æ°
|
---|
60 | # ã»æåå
|
---|
61 | # ã»ãã¼ã«å¤
|
---|
62 | # éæåï¼æ§é ä½ãé
|
---|
63 | åï¼ã¨ C_EXP ã¯ããã§ã¯æ±ããªã
|
---|
64 | #
|
---|
65 | # ãã®ã¯ã©ã¹ã§å®ç¾©æ¸ã¿ã®æ¼ç®åã¯ãã¨ã©ã¼ã¨ãªã
|
---|
66 | # åã«ããæ¼ç®å¯è½ãªå ´åãæ¼ç®åããªã¼ãã¼ã©ã¤ããã
|
---|
67 | #
|
---|
68 | class BaseVal < Node
|
---|
69 | def ~@
|
---|
70 | unsupport "~"
|
---|
71 | end
|
---|
72 | def -@
|
---|
73 | unsupport "unary -"
|
---|
74 | end
|
---|
75 | def +@
|
---|
76 | unsupport "unary +"
|
---|
77 | end
|
---|
78 | def not # ! val
|
---|
79 | unsupport "!"
|
---|
80 | end
|
---|
81 |
|
---|
82 | def * val
|
---|
83 | unsupport "*"
|
---|
84 | end
|
---|
85 | def / val
|
---|
86 | unsupport "/"
|
---|
87 | end
|
---|
88 | def % val
|
---|
89 | unsupport "%"
|
---|
90 | end
|
---|
91 | def + val
|
---|
92 | unsupport "+"
|
---|
93 | end
|
---|
94 | def - val
|
---|
95 | unsupport "-"
|
---|
96 | end
|
---|
97 | def << val
|
---|
98 | unsupport "<<"
|
---|
99 | end
|
---|
100 | def >> val
|
---|
101 | unsupport ">>"
|
---|
102 | end
|
---|
103 | def > val
|
---|
104 | unsupport ">"
|
---|
105 | end
|
---|
106 | def < val
|
---|
107 | unsupport "<"
|
---|
108 | end
|
---|
109 | def >= val
|
---|
110 | unsupport ">="
|
---|
111 | end
|
---|
112 | def <= val
|
---|
113 | unsupport "<="
|
---|
114 | end
|
---|
115 | def eq val # == val
|
---|
116 | unsupport "=="
|
---|
117 | end
|
---|
118 | def neq val # != val
|
---|
119 | unsupport "!="
|
---|
120 | end
|
---|
121 | def & val
|
---|
122 | unsupport "&"
|
---|
123 | end
|
---|
124 | def ^ val
|
---|
125 | unsupport "^"
|
---|
126 | end
|
---|
127 | def | val
|
---|
128 | unsupport "|"
|
---|
129 | end
|
---|
130 | def lAND val # && val
|
---|
131 | unsupport "&&"
|
---|
132 | end
|
---|
133 | def lOR val # || val
|
---|
134 | unsupport "||"
|
---|
135 | end
|
---|
136 | def cast( type )
|
---|
137 | unsupport "CAST"
|
---|
138 | end
|
---|
139 |
|
---|
140 | def unsupport op
|
---|
141 | cdl_error( "V1001 $1: unable for $2" , op, self.class )
|
---|
142 | end
|
---|
143 |
|
---|
144 | def to_s
|
---|
145 | raise "to_s not overridden"
|
---|
146 | end
|
---|
147 |
|
---|
148 | def to_b
|
---|
149 | cdl_error( "V1002 $1: cannot cast to bool (implicitly)" , self.class )
|
---|
150 | false
|
---|
151 | end
|
---|
152 | def to_i
|
---|
153 | cdl_error( "V1003 $1: cannot cast to integer (implicitly)" , self.class )
|
---|
154 | 1
|
---|
155 | end
|
---|
156 | def to_f
|
---|
157 | cdl_error( "V1004 $1: cannot cast to float (implicitly)" , self.class )
|
---|
158 | 1.0
|
---|
159 | end
|
---|
160 | end
|
---|
161 |
|
---|
162 | #= Pointer å¤ (IntegerVal ã® Pointer ç)
|
---|
163 | #
|
---|
164 | # ãã¤ã³ã¿å¤ã¯ãCDL ã§ç´æ¥çæããããã¨ã¯ãªã
|
---|
165 | # æ´æ°å¤ã®ãã£ã¹ãæ¼ç®ã«ããçæããã
|
---|
166 | class PointerVal < BaseVal
|
---|
167 | #@int_val:: IntegerVal: IntegerVal ã§ãªãã¦ã¯ãªããªã
|
---|
168 | #@ptr_type:: PtrType: ãã¤ã³ã¿ã®æãå
|
---|
169 | ã®å
|
---|
170 |
|
---|
171 | def initialize( int_val, ptr_type )
|
---|
172 | super()
|
---|
173 | @int_val = int_val
|
---|
174 | @ptr_type = ptr_type
|
---|
175 | end
|
---|
176 |
|
---|
177 | #=== ãã¤ã³ã¿ã®æãå
|
---|
178 | ã®åãå¾ã
|
---|
179 | # PointerVal å°ç¨ã®ã¡ã½ãã
|
---|
180 | def get_type
|
---|
181 | @ptr_type
|
---|
182 | end
|
---|
183 |
|
---|
184 | def cast type
|
---|
185 | t = type.get_original_type # typedef ã®å
|
---|
186 | ãå¾ã
|
---|
187 | if t.kind_of? IntType then
|
---|
188 | val = t.check_and_clip( @int_val, :IntType )
|
---|
189 | return IntegerVal.new( val )
|
---|
190 | elsif t.kind_of? FloatType then
|
---|
191 | cdl_error( "V1005 Cannot cast pointer to float" )
|
---|
192 | return FloatVal.new( @int_val )
|
---|
193 | elsif t.kind_of? PtrType then
|
---|
194 | return PointerVal.new( @int_val, type )
|
---|
195 | else
|
---|
196 | cdl_error( "V1006 pointer value cannot cast to $1" , type.class )
|
---|
197 | return nil
|
---|
198 | end
|
---|
199 | end
|
---|
200 |
|
---|
201 | def to_s
|
---|
202 | "(#{@ptr_type.get_type_str}#{@ptr_type.get_type_str_post})#{sprintf("0x%X", @int_val)}"
|
---|
203 | end
|
---|
204 |
|
---|
205 | def to_b
|
---|
206 | cdl_error( "V1007 convert pointer value to bool" )
|
---|
207 | false
|
---|
208 | end
|
---|
209 | def to_i
|
---|
210 | cdl_error( "V1008 convert pointer value to integer without cast" )
|
---|
211 | @val.to_i
|
---|
212 | end
|
---|
213 | end
|
---|
214 |
|
---|
215 | #= IntegerVal: æ´æ°å¤ãæ±ãã¯ã©ã¹
|
---|
216 | class IntegerVal < BaseVal
|
---|
217 | #@val:: Integer: value
|
---|
218 | #@str:: string: literal
|
---|
219 | #@sign:: Symbol: :SIGNED | :UNSIGNED
|
---|
220 | #@size:: Symbol: :NORMAL | :SHORT | :LONG | :LONGLONG
|
---|
221 |
|
---|
222 | def initialize( val, str = nil, sign = :SIGNED, size = :NORMAL )
|
---|
223 | super()
|
---|
224 | @val = val.to_i
|
---|
225 | @str = str
|
---|
226 | @sign = sign
|
---|
227 | @size = size
|
---|
228 | end
|
---|
229 |
|
---|
230 | def ~@
|
---|
231 | IntegerVal.new( ~ @val )
|
---|
232 | end
|
---|
233 | def -@
|
---|
234 | IntegerVal.new( - @val )
|
---|
235 | end
|
---|
236 | def +@
|
---|
237 | self
|
---|
238 | end
|
---|
239 | def not # !
|
---|
240 | BoolVal.new( self.to_b )
|
---|
241 | end
|
---|
242 |
|
---|
243 | def * val
|
---|
244 | if val.kind_of? FloatVal then
|
---|
245 | return FloatVal.new( @val.to_f * val.to_f )
|
---|
246 | else
|
---|
247 | return IntegerVal.new( @val * val.to_i )
|
---|
248 | end
|
---|
249 | end
|
---|
250 | def / val
|
---|
251 | if val.kind_of? FloatVal then
|
---|
252 | v2 = val.to_f # to_f ã2åè©ä¾¡ããªã
|
---|
253 | if v2 == 0.0 then
|
---|
254 | cdl_error( "V1009 / : divieded by zero" )
|
---|
255 | return FloatVal.new( 1.0 )
|
---|
256 | end
|
---|
257 | return FloatVal.new( @val.to_f / v2 )
|
---|
258 | else
|
---|
259 | v2 = val.to_i # to_i ã2åè©ä¾¡ããªã
|
---|
260 | if v2 == 0 then
|
---|
261 | cdl_error( "V1010 / : divieded by zero" )
|
---|
262 | return IntegerVal.new( 1 )
|
---|
263 | end
|
---|
264 | return IntegerVal.new( @val / v2 )
|
---|
265 | end
|
---|
266 | end
|
---|
267 | def % val
|
---|
268 | if val.kind_of? FloatVal then
|
---|
269 | v2 = val.to_f # to_f ã2åè©ä¾¡ããªã
|
---|
270 | if v2 == 0.0 then
|
---|
271 | cdl_error( "V1011 % : divieded by zero" )
|
---|
272 | return FloatVal.new( 1.0 )
|
---|
273 | end
|
---|
274 | return FloatVal.new( @val.to_f % v2 )
|
---|
275 | else
|
---|
276 | v2 = val.to_i # to_i ã2åè©ä¾¡ããªã
|
---|
277 | if v2 == 0 then
|
---|
278 | cdl_error( "V1012 % : divieded by zero" )
|
---|
279 | return IntegerVal.new( 1 )
|
---|
280 | end
|
---|
281 | return IntegerVal.new( @val % v2 )
|
---|
282 | end
|
---|
283 | end
|
---|
284 | def + val
|
---|
285 | if val.kind_of? FloatVal then
|
---|
286 | return FloatVal.new( @val.to_f + val.to_f )
|
---|
287 | else
|
---|
288 | return IntegerVal.new( @val + val.to_i )
|
---|
289 | end
|
---|
290 | end
|
---|
291 | def - val
|
---|
292 | if val.kind_of? FloatVal then
|
---|
293 | return FloatVal.new( @val.to_f - val.to_f )
|
---|
294 | else
|
---|
295 | return IntegerVal.new( @val - val.to_i )
|
---|
296 | end
|
---|
297 | end
|
---|
298 | def << val
|
---|
299 | return IntegerVal.new( @val << val.to_i )
|
---|
300 | end
|
---|
301 | def >> val
|
---|
302 | return IntegerVal.new( @val >> val.to_i )
|
---|
303 | end
|
---|
304 | def > val
|
---|
305 | if val.kind_of? FloatVal then
|
---|
306 | return BoolVal.new( @val.to_f > val.to_f )
|
---|
307 | else
|
---|
308 | return BoolVal.new( @val > val.to_i )
|
---|
309 | end
|
---|
310 | end
|
---|
311 | def < val
|
---|
312 | if val.kind_of? FloatVal then
|
---|
313 | return BoolVal.new( @val.to_f < val.to_f )
|
---|
314 | else
|
---|
315 | return BoolVal.new( @val < val.to_i )
|
---|
316 | end
|
---|
317 | end
|
---|
318 | def >= val
|
---|
319 | if val.kind_of? FloatVal then
|
---|
320 | return BoolVal.new( @val.to_f >= val.to_f )
|
---|
321 | else
|
---|
322 | return BoolVal.new( @val >= val.to_i )
|
---|
323 | end
|
---|
324 | end
|
---|
325 | def <= val
|
---|
326 | if val.kind_of? FloatVal then
|
---|
327 | return BoolVal.new( @val.to_f <= val.to_f )
|
---|
328 | else
|
---|
329 | return BoolVal.new( @val <= val.to_i )
|
---|
330 | end
|
---|
331 | end
|
---|
332 | def eq val # == val
|
---|
333 | if val.kind_of? FloatVal then
|
---|
334 | return BoolVal.new( @val.to_f == val.to_f )
|
---|
335 | else
|
---|
336 | return BoolVal.new( @val == val.to_i )
|
---|
337 | end
|
---|
338 | end
|
---|
339 | def neq val # != val
|
---|
340 | if val.kind_of? FloatVal then
|
---|
341 | return BoolVal.new( @val.to_f != val.to_f )
|
---|
342 | else
|
---|
343 | return BoolVal.new( @val != val.to_i )
|
---|
344 | end
|
---|
345 | end
|
---|
346 | def & val
|
---|
347 | IntegerVal.new( @val & val.to_i )
|
---|
348 | end
|
---|
349 | def ^ val
|
---|
350 | IntegerVal.new( @val ^ val.to_i )
|
---|
351 | end
|
---|
352 | def | val
|
---|
353 | IntegerVal.new( @val | val.to_i )
|
---|
354 | end
|
---|
355 | def lAND val # && val
|
---|
356 | BoolVal.new( self.to_b && val.to_b )
|
---|
357 | end
|
---|
358 | def lOR val # || val
|
---|
359 | BoolVal.new( self.to_b || val.to_b )
|
---|
360 | end
|
---|
361 | def cast( type )
|
---|
362 | t = type.get_original_type # typedef ã®å
|
---|
363 | ãå¾ã
|
---|
364 | if t.kind_of? IntType then
|
---|
365 | val = t.check_and_clip( @val, :IntType )
|
---|
366 | return IntegerVal.new( val )
|
---|
367 | elsif t.kind_of? FloatType then
|
---|
368 | return FloatVal.new( @val )
|
---|
369 | elsif t.kind_of? PtrType then
|
---|
370 | return PointerVal.new( @val, type )
|
---|
371 | elsif t.kind_of? BoolType then
|
---|
372 | return BoolVal.new( @val.to_b )
|
---|
373 | else
|
---|
374 | cdl_error( "V1013 integer value cannot cast to $1" , type.class )
|
---|
375 | return nil
|
---|
376 | end
|
---|
377 | end
|
---|
378 |
|
---|
379 | def to_s
|
---|
380 | if @str then
|
---|
381 | @str
|
---|
382 | else
|
---|
383 | @val.to_s
|
---|
384 | end
|
---|
385 | end
|
---|
386 | def to_b
|
---|
387 | @val != 0
|
---|
388 | end
|
---|
389 | def to_i
|
---|
390 | @val
|
---|
391 | end
|
---|
392 | def to_f
|
---|
393 | @val.to_f
|
---|
394 | end
|
---|
395 | end
|
---|
396 |
|
---|
397 | #= BoolVal: bool å¤ãæ±ãã¯ã©ã¹
|
---|
398 | class BoolVal < BaseVal
|
---|
399 | #@val:: bool: true, false
|
---|
400 |
|
---|
401 | def initialize( val )
|
---|
402 | super()
|
---|
403 | if val == true || val == false
|
---|
404 | @val = val
|
---|
405 | elsif val.to_i != 0
|
---|
406 | @val = true
|
---|
407 | else
|
---|
408 | @val = false
|
---|
409 | end
|
---|
410 | # raise "No boolean val" if val != true && val != false
|
---|
411 | end
|
---|
412 |
|
---|
413 | def not # ! val
|
---|
414 | BoolVal.new( ! @val )
|
---|
415 | end
|
---|
416 | def eq val # == val
|
---|
417 | if val.kind_of? BoolVal then
|
---|
418 | return BoolVal.new( self.to_i == val.to_i )
|
---|
419 | else
|
---|
420 | cdl_error( "V1014 comparing bool value with \'$1\'" , val.class )
|
---|
421 | return BoolVal.new( false )
|
---|
422 | end
|
---|
423 | end
|
---|
424 | def neq val # != val
|
---|
425 | if val.kind_of? BoolVal then
|
---|
426 | return BoolVal.new( self.to_i != val.to_i )
|
---|
427 | else
|
---|
428 | cdl_error( "V1015 comparing bool value with \'$1\'" , val.class )
|
---|
429 | return BoolVal.new( false )
|
---|
430 | end
|
---|
431 | end
|
---|
432 | def lAND val # && val
|
---|
433 | BoolVal.new( self.to_b && val.to_b )
|
---|
434 | end
|
---|
435 | def lOR val # || val
|
---|
436 | BoolVal.new( self.to_b || val.to_b )
|
---|
437 | end
|
---|
438 | def cast( type )
|
---|
439 | t = type.get_original_type # typedef ã®å
|
---|
440 | ãå¾ã
|
---|
441 | if @val then
|
---|
442 | val = 1
|
---|
443 | else
|
---|
444 | val = 0
|
---|
445 | end
|
---|
446 | if t.kind_of? IntType then
|
---|
447 | return IntegerVal.new( val )
|
---|
448 | elsif t.kind_of? FloatType then
|
---|
449 | return FloatVal.new( val )
|
---|
450 | elsif t.kind_of? BoolType then
|
---|
451 | return self
|
---|
452 | else
|
---|
453 | cdl_error( "V1016 bool value cannot cast to $1" , type.class )
|
---|
454 | return nil
|
---|
455 | end
|
---|
456 | end
|
---|
457 |
|
---|
458 | def to_s
|
---|
459 | if @val
|
---|
460 | return "true"
|
---|
461 | else
|
---|
462 | return "false"
|
---|
463 | end
|
---|
464 | end
|
---|
465 | def to_b
|
---|
466 | @val
|
---|
467 | end
|
---|
468 | def to_i
|
---|
469 | return 0 if @val == false
|
---|
470 | return 1
|
---|
471 | end
|
---|
472 | def to_f
|
---|
473 | return 0.0 if @val == false
|
---|
474 | return 1.0
|
---|
475 | end
|
---|
476 |
|
---|
477 | attr_reader :val
|
---|
478 | end
|
---|
479 |
|
---|
480 | #= FloatVal: å®æ°å¤ãæ±ãã¯ã©ã¹
|
---|
481 | class FloatVal < BaseVal
|
---|
482 | #@val:: Float
|
---|
483 | def initialize( val )
|
---|
484 | super()
|
---|
485 | @val = val.to_f
|
---|
486 | end
|
---|
487 |
|
---|
488 | def -@
|
---|
489 | FloatVal.new( - @val )
|
---|
490 | end
|
---|
491 | def +@
|
---|
492 | self
|
---|
493 | end
|
---|
494 | def * val
|
---|
495 | FloatVal.new( @val * val.to_f )
|
---|
496 | end
|
---|
497 | def / val
|
---|
498 | v2 = val.to_f # to_f ã2åè©ä¾¡ããªã
|
---|
499 | if v2 == 0.0 then
|
---|
500 | cdl_error( "V1017 / : divieded by zero" )
|
---|
501 | return FloatVal.new( 1.0 )
|
---|
502 | end
|
---|
503 | return FloatVal.new( @val.to_f / v2 )
|
---|
504 | end
|
---|
505 | def % val
|
---|
506 | v2 = val.to_f # to_f ã2åè©ä¾¡ããªã
|
---|
507 | if v2 == 0.0 then
|
---|
508 | cdl_error( "V1018 % : divieded by zero" )
|
---|
509 | return FloatVal.new( 1.0 )
|
---|
510 | end
|
---|
511 | return FloatVal.new( @val.to_f % v2 )
|
---|
512 | end
|
---|
513 | def + val
|
---|
514 | FloatVal.new( @val + val.to_f )
|
---|
515 | end
|
---|
516 | def - val
|
---|
517 | FloatVal.new( @val - val.to_f )
|
---|
518 | end
|
---|
519 | def > val
|
---|
520 | BoolVal.new( @val > val.to_f )
|
---|
521 | end
|
---|
522 | def < val
|
---|
523 | BoolVal.new( @val < val.to_f )
|
---|
524 | end
|
---|
525 | def >= val
|
---|
526 | BoolVal.new( @val >= val.to_f )
|
---|
527 | end
|
---|
528 | def <= val
|
---|
529 | BoolVal.new( @val <= val.to_f )
|
---|
530 | end
|
---|
531 | def eq val # == val
|
---|
532 | BoolVal.new( @val == val.to_f )
|
---|
533 | end
|
---|
534 | def neq val # != val
|
---|
535 | BoolVal.new( @val != val.to_f )
|
---|
536 | end
|
---|
537 | def cast( type )
|
---|
538 | t = type.get_original_type # typedef ã®å
|
---|
539 | ãå¾ã
|
---|
540 | if t.kind_of? IntType then
|
---|
541 | val = t.check_and_clip( @val, :FloatType )
|
---|
542 | return IntegerVal.new( val )
|
---|
543 | elsif t.kind_of? FloatType then
|
---|
544 | return self
|
---|
545 | else
|
---|
546 | cdl_error( "V1019 floating value cannot cast to $1" , type )
|
---|
547 | return self
|
---|
548 | end
|
---|
549 | end
|
---|
550 |
|
---|
551 | def to_b
|
---|
552 | cdl_error( "V1020 convert floating value to bool without cast" )
|
---|
553 | @val.to_i
|
---|
554 | end
|
---|
555 | def to_i
|
---|
556 | cdl_error( "V1021 convert floating value to integer without cast" )
|
---|
557 | @val.to_i
|
---|
558 | end
|
---|
559 | def to_s
|
---|
560 | @val.to_s
|
---|
561 | end
|
---|
562 | def to_f
|
---|
563 | @val
|
---|
564 | end
|
---|
565 | end
|
---|
566 |
|
---|
567 | #= æååãªãã©ã«ãæ±ãã¯ã©ã¹
|
---|
568 | class StringVal < BaseVal
|
---|
569 | #@str:: Token:
|
---|
570 | #@specifier:: Symbol: :WIDE, :NORMAL
|
---|
571 |
|
---|
572 | def initialize( str, spec = :NORMAL )
|
---|
573 | super()
|
---|
574 | @str = str
|
---|
575 | @specifier = spec # mikan L"str" wide æååæªå¯¾å¿
|
---|
576 | end
|
---|
577 |
|
---|
578 | #===
|
---|
579 | #
|
---|
580 | # string ã® cast ã¯ã§ããªã mikan ãã¤ã³ã¿åã¸ã® cast ã¯ã§ããã¹ã
|
---|
581 | def cast type
|
---|
582 | t = type.get_original_type # typedef ã®å
|
---|
583 | ãå¾ã
|
---|
584 | if t.kind_of? IntType then
|
---|
585 | cdl_error( "V1022 string cannot cast to integer" )
|
---|
586 | elsif t.kind_of? FloatType then
|
---|
587 | cdl_error( "V1023 string cannot cast to float" )
|
---|
588 | elsif t.kind_of? PtrType then
|
---|
589 | cdl_error( "V1024 string cannot cast to pointer" )
|
---|
590 | else
|
---|
591 | cdl_error( "V1025 string cannot cast to $1" , type )
|
---|
592 | end
|
---|
593 | end
|
---|
594 |
|
---|
595 | def to_s
|
---|
596 | @str.to_s
|
---|
597 | end
|
---|
598 |
|
---|
599 | def val
|
---|
600 | @str.to_s # Token ã§æ±ããã¦ããåæ® (val ãåãåºã)
|
---|
601 | end
|
---|
602 | end
|
---|