source: azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/value.rb@ 388

Last change on this file since 388 was 388, checked in by coas-nagasima, 5 years ago

Azure IoT Hub Device C SDK を使ったサンプルの追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-ruby
File size: 13.9 KB
Line 
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$
53#++
54
55#= BaseVal 整数、浮動小数などの値を扱うクラスの基底クラス
56#
57# TECS の CDL で扱う値は、以下に分類される
58# ・整数
59# ・浮動小数
60# ・文字列
61# ・ブール値
62# 集成型(構造体、é…
63åˆ—)と C_EXP はここでは扱わない
64#
65# このクラスで定義済みの演算子は、エラーとなる
66# 型により演算可能な場合、演算子をオーバーライドする
67#
68class 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
160end
161
162#= Pointer 値 (IntegerVal の Pointer 版)
163#
164# ポインタ値は、CDL で直接生成されることはない
165# 整数値のキャスト演算により生成される
166class 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
213end
214
215#= IntegerVal: 整数値を扱うクラス
216class 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
395end
396
397#= BoolVal: bool 値を扱うクラス
398class 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
478end
479
480#= FloatVal: 実数値を扱うクラス
481class 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
565end
566
567#= 文字列リテラルを扱うクラス
568class 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
602end
Note: See TracBrowser for help on using the repository browser.