- Timestamp:
- May 22, 2019, 10:03:37 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/types.rb
-
Property svn:mime-type
changed from
text/x-ruby
totext/x-ruby;charset=UTF-8
r388 r389 6 6 # Copyright (C) 2008-2017 by TOPPERS Project 7 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 責ãããã¨ï¼ 8 # 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ 9 # ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 10 # 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 11 # (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 12 # 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 13 # スコード中に含まれていること. 14 # (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 15 # 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 16 # 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 17 # の無保証規定を掲載すること. 18 # (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 19 # 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 20 # と. 21 # (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 22 # 作権表示,この利用条件および下記の無保証規定を掲載すること. 23 # (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 24 # 報告すること. 25 # (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 26 # 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 27 # また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 28 # 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 29 # 免責すること. 44 30 # 45 # æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 46 ã 47 # ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 48 # ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 49 # ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 50 # ã®è²¬ä»»ãè² ããªãï¼ 31 # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 32 # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 33 # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 34 # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 35 # の責任を負わない. 51 36 # 52 37 # $Id$ 53 38 #++ 54 39 55 #= HasType: @type ãå 56 é¨ã«æã¤åã®ããã®ã¢ã¸ã¥ã¼ã« 40 #= HasType: @type を内部に持つ型のためのモジュール 57 41 # @b_cloned::Bool : true if @type is cloned 58 42 # 59 # ãã®ã¢ã¸ã¥ã¼ã«ã¯ DefinedType, PtrType, ArrayType ã« include ããã 60 # æ¬å½ã¯ typedef ãããæã® Decl ã®è¦ç´ ã®ã¿ clone ããã°ããã®ã ããget_type, get_original_type 㧠61 # åãåºãããã¨ããset_scs, set_qualifier ãããã¨ãã«ç¡æ¡ä»¶ã§ clone ãã (ç¡é§ã«ã¡ã¢ãªã使ç¨ãã) 62 # ãã ããclone ããã®ã¯ä¸åã®ã¿ã§ãã (äºå clone ããã¨å¥ã®åãåç 63 §ãã¦ãã¾ã) 43 # このモジュールは DefinedType, PtrType, ArrayType に include される 44 # 本当は typedef された時の Decl の要素のみ clone すればよいのだが、get_type, get_original_type で 45 # 取り出されたとき、set_scs, set_qualifier されたときに無条件で clone する (無駄にメモリを使用する) 46 # ただし、clone するのは一回のみである (二回 clone すると別の型を参照してしまう) 64 47 # 65 # initialize 㧠clone ãã¦ããå 66 ±æããã¦ããã¨ãã« clone ãããªã 48 # initialize で clone しても、共有されているときに clone されない 67 49 # 68 50 module HasType … … 71 53 end 72 54 73 #=== HasType# @type ãã¯ãã¼ã³ãã55 #=== HasType# @type をクローンする 74 56 def clone_type 75 57 # if @b_cloned == false then … … 131 113 end 132 114 133 #=== size_is, count_is, string ãè¨å®134 # æ´¾çã¯ã©ã¹ã§ãªã¼ãã¼ã©ã¤ãããï¼ããã©ã«ãã§ã¯ã¨ã©ã¼ï¼115 #=== size_is, count_is, string を設定 116 # 派生クラスでオーバーライドする(デフォルトではエラー) 135 117 def set_scs( size, count, string, max = nil, b_nullable = false ) 136 118 str = "" … … 170 152 end 171 153 172 #=== åããã§ãã¯173 # æ£å½ãªåå®ç¾©ãã©ããããã§ãã¯ãã154 #=== 型をチェック 155 # 正当な型定義かどうか、チェックする 174 156 def check 175 # åã«èª¤ããããã°ãã¨ã©ã¼æååãè¿ã 176 end 177 178 #=== struct ã® tag ããã§ã㯠179 # æ£å½ãªåå®ç¾©ãã©ããããã§ãã¯ãã 180 #kind:: Decl ã® @kind ãåç 181 § 157 # 型に誤りがあれば、エラー文字列を返す 158 end 159 160 #=== struct の tag をチェック 161 # 正当な型定義かどうか、チェックする 162 #kind:: Decl の @kind を参照 182 163 def check_struct_tag kind 183 # tag ãåå¨ããªããã°ã¨ã©ã¼ãåºåãã 184 # é 185 ååã§ã¯ãè¦ç´ ã®åãå帰çã«ãã§ã㯠186 # ãã¤ã³ã¿åã§ã¯ãæãå 187 ã® tag ãã§ãã¯ã¯ããªã 188 # é¢æ°åã§ã¯ãã©ã¡ã¼ã¿ãªã¹ãã®ãã¹ã¦ã«ã¤ãã¦è¡ã 189 end 190 191 #=== åæåå¯è½ããã§ã㯠192 # attribute ãªã©åæåå¯è½ããã§ãã¯ããï¼åã«å¯¾ãæ£å½ãªåæååãä¸ãããã¦ãããï¼ 193 #ident:: string 被代å 194 ¥å¤æ°å½ 164 # tag が存在しなければエラーを出力する 165 # 配列型では、要素の型を再帰的にチェック 166 # ポインタ型では、指す先の tag チェックはしない 167 # 関数型ではパラメータリストのすべてについて行う 168 end 169 170 #=== 初期化可能かチェック 171 # attribute など初期化可能かチェックする(型に対し正当な初期化子が与えられているか) 172 #ident:: string 被代入変数命 195 173 #initialize:: Expression, Array of initializer or C_EXP 196 # 代å 197 ¥å¤ãC_EXP ãä¸ããããã®ã¯ IntType ã®å ´åã®ã¿ 174 # 代入値、C_EXP が与えられるのは IntType の場合のみ 198 175 #kind:: symbol (:ATTRIBUTE, :VAR, :CONSTNAT ) 199 #attribute:: NameList kind == :VAR ã®ã¨ãåç 200 §ã§ãã attribute 176 #attribute:: NameList kind == :VAR のとき参照できる attribute 201 177 # 202 # locale ã第ä¸å¼æ°ã¨ãã¦åãã®ã¯ã以ä¸ã®çç±ã«ããã 203 # ãã®ã¡ã½ããã¯ãå¤æ°ã¸ã®ä»£å 204 ¥ãè¡ããããè¡ãã«å¯¾ãã¦å¼ã³åºããããã 205 # Type ã¯ã©ã¹ã®ã¤ã³ã¹ã¿ã³ã¹ã¯ãå¤æ°ãå®ç¾©ããããè¡ããè¨æ¶ãã¦ããã 178 # locale を第一引数として取るのは、以下の理由による。 179 # このメソッドは、変数への代入が行われる「行」に対して呼び出されるが、 180 # Type クラスのインスタンスは、変数が定義された「行」を記憶している。 206 181 # 207 182 # STAGE: S … … 210 185 end 211 186 212 #=== const_val ãæå®ã®åã«ãã£ã¹ããã213 # æ´¾çã¯ã©ã¹ã§ãªã¼ãã¼ã©ã¤ããã¦ããªãã¨ã¨ã©ã¼187 #=== const_val を指定の型にキャストする 188 # 派生クラスでオーバーライドしていないとエラー 214 189 def cast( const_val ) 215 190 cdl_error( "T1004 cannot cast to $1" , self.class ) 216 191 end 217 192 218 #=== åãä¸è´ãããã®ãã§ã㯠219 # ååã®åé¢ã§ãã§ãã¯ï¼ 220 # typedef ãããåãåé¢ã§ä¸è´ãè¦ããããå 221 ã®åãåãã§ãååãç°ãªãã°ä¸ä¸è´ã¨ãªã 193 #=== 型が一致するかのチェック 194 # 型名の字面でチェック. 195 # typedef された型も字面で一致を見るため、元の型が同じでも型名が異なれば不一致となる 222 196 def equal? type2 223 197 return ( get_type_str == type2.get_type_str ) && ( get_type_str_post == type2.get_type_str_post ) 224 198 end 225 199 226 #=== bit size ãå¾ã227 # IntType, FloatType 以å¤ã¯0200 #=== bit size を得る 201 # IntType, FloatType 以外は0 228 202 def get_bit_size 229 203 return 0 230 204 end 231 205 232 #=== å 233 ã®åãå¾ã 234 # typedef ãããåã®å ´åããã®å 235 ã®åãè¿ã. 236 # ãã以å¤ã¯ãèªåèªèº«ãè¿ãï¼ 237 # (DefinedType ã§ã¯æ¬ã¡ã½ããããªã¼ãã¼ã©ã¤ãããã) 206 #=== 元の型を得る 207 # typedef された型の場合、その元の型を返す. 208 # それ以外は、自分自身を返す. 209 # (DefinedType では本メソッドがオーバーライドされる) 238 210 def get_original_type 239 211 return self 240 212 end 241 213 242 #=== å 243 é¨ã«ãã¤ã³ã¿åãæ㤠244 # ãã¤ã³ã¿åãã¾ãã¯ãã¤ã³ã¿åã¡ã³ããæã¤æ§é ä½ãã¾ãã¯è¦ç´ ããã¤ã³ã¿åãæã¤é 245 å 214 #=== 内部にポインタ型を持つ 215 # ポインタ型、またはポインタ型メンバを持つ構造体、または要素がポインタ型を持つ配列 246 216 def has_pointer? 247 217 false 248 218 end 249 219 250 #=== size_is, count_is, string æå®ããããã¤ã³ã¿ãæã¤ã 251 # size_is, count_is, string æå®ããããã¤ã³ã¿åãã¾ãã¯ãããã¡ã³ãã«æã¤æ§é ä½ãã¾ãã¯ããããè¦ç´ ã«æã¤é 252 å 220 #=== size_is, count_is, string 指定されたポインタを持つか 221 # size_is, count_is, string 指定されたポインタ型、またはそれをメンバに持つ構造体、またはそれをを要素に持つ配列 253 222 def has_sized_pointer? 254 223 false 255 224 end 256 225 257 #=== é·ãæå®ã®ãªã string ãæ㤠258 # ãªãæå®ã®ãªã string æå®ããããã¤ã³ã¿åãã¾ãã¯ãããã¡ã³ãã«æã¤æ§é ä½ãã¾ãã¯ãããè¦ç´ ã«æã¤é 259 å 226 #=== 長さ指定のない string を持つ 227 # なさ指定のない string 指定されたポインタ型、またはそれをメンバに持つ構造体、またはそれを要素に持つ配列 260 228 def has_unsized_string? 261 229 false … … 281 249 @type_name = type_name 282 250 283 # mikan type_name ã path ã«ãªã£ã¦ããªãããæ«å®251 # mikan type_name が path になっていないため暫定 284 252 @typedef = Namespace.find( [ type_name ] ) #1 285 253 … … 317 285 end 318 286 319 #=== qualifier(const, volatile) ã®è¨å®287 #=== qualifier(const, volatile) の設定 320 288 def set_qualifier( qualifier ) 321 289 clone_type … … 338 306 end 339 307 340 def check # æå³ç誤ããããã°ãæååãè¿ã341 nil # typedef ã®æ®µéã§æå³ãã§ãã¯ããã¦ãã308 def check # 意味的誤りがあれば、文字列を返す 309 nil # typedef の段階で意味チェックされている 342 310 end 343 311 … … 346 314 end 347 315 348 #=== å 349 é¨ã«ãã¤ã³ã¿åãæ㤠350 # ãã¤ã³ã¿åãã¾ãã¯ãã¤ã³ã¿åã¡ã³ããæã¤æ§é ä½ãã¾ãã¯è¦ç´ ããã¤ã³ã¿åãæã¤é 351 å 316 #=== 内部にポインタ型を持つ 317 # ポインタ型、またはポインタ型メンバを持つ構造体、または要素がポインタ型を持つ配列 352 318 def has_pointer? 353 319 @type.has_pointer? 354 320 end 355 321 356 #=== size_is, count_is, string æå®ããããã¤ã³ã¿ãæã¤ã 357 # size_is, count_is, string æå®ããããã¤ã³ã¿åãã¾ãã¯ãããã¡ã³ãã«æã¤æ§é ä½ãã¾ãã¯ããããè¦ç´ ã«æã¤é 358 å 322 #=== size_is, count_is, string 指定されたポインタを持つか 323 # size_is, count_is, string 指定されたポインタ型、またはそれをメンバに持つ構造体、またはそれをを要素に持つ配列 359 324 def has_sized_pointer? 360 325 @type.has_sized_pointer? 361 326 end 362 327 363 #=== é·ãæå®ã®ãªã string ãæ㤠364 # ãªãæå®ã®ãªã string æå®ããããã¤ã³ã¿åãã¾ãã¯ãããã¡ã³ãã«æã¤æ§é ä½ãã¾ãã¯ãããè¦ç´ ã«æã¤é 365 å 328 #=== 長さ指定のない string を持つ 329 # なさ指定のない string 指定されたポインタ型、またはそれをメンバに持つ構造体、またはそれを要素に持つ配列 366 330 def has_unsized_string? 367 331 @type.has_unsized_string? … … 383 347 class VoidType < Type 384 348 385 def check # æå³ç誤ããããã°ãæååãè¿ã349 def check # 意味的誤りがあれば、文字列を返す 386 350 nil 387 351 end … … 408 372 class BoolType < Type 409 373 410 def check # æå³ç誤ããããã°ãæååãè¿ã374 def check # 意味的誤りがあれば、文字列を返す 411 375 nil 412 376 end … … 458 422 end 459 423 460 def check # æå³ç誤ããããã°ãæååãè¿ã424 def check # 意味的誤りがあれば、文字列を返す 461 425 nil 462 426 end … … 466 430 if val.instance_of?( Expression ) then 467 431 val = val.eval_const2( nil, attribute ) 468 # è©ä¾¡ã®çµæ C_EXP ã Array ã¨ãªãå¯è½æ§ããã 469 end 470 471 if val.instance_of? Token then # StringVal å°å 472 ¥ã«ããããã¯ã Token ã¯æ¥ãªãã¯ã 473 # val ã Token ã®å ´å == ã®å³è¾ºã String ã ã¨ã¨ã©ã¼ãèµ·ãã (#198) 432 # 評価の結果 C_EXP や Array となる可能性がある 433 end 434 435 if val.instance_of? Token then # StringVal 導入により、もはや Token は来ないはず 436 # val が Token の場合 == の右辺が String だとエラーを起こす (#198) 474 437 cdl_error2( locale, "T1009 $1: $2: not integer" , ident, val ) 475 438 return 476 439 elsif val.is_a? C_EXP then 477 # #192 var ã attribute ãåç 478 §ããattribute ã®å³è¾ºã C_EXP ã®å ´å 479 # const ã®å³è¾ºã C_EXP ã®å ´åã 440 # #192 var が attribute を参照し、attribute の右辺が C_EXP の場合 441 # const の右辺が C_EXP の場合も 480 442 return 481 443 elsif val.kind_of? FloatVal then … … 521 483 end 522 484 523 #=== IntType# æ大å¤ãæå°å¤ããã§ãã¯ãã¦ã¯ãªãããã524 # ãã£ã¹ãæ¼ç®ãè¡ã525 #in_val:: IntegerVal, FloatVal: ãã®åã«ãã£ã¹ãããå¤526 #from_type:: Symbol: :IntType, :FloatType IntType ã®å ´åã¯ãããæ°ã§ã¯ãªãããFloatType ã®å ´åã¯æ大å¤ã§ã¯ãªãã485 #=== IntType# 最大値、最小値をチェックしてクリップする 486 # キャスト演算を行う 487 #in_val:: IntegerVal, FloatVal: この型にキャストする値 488 #from_type:: Symbol: :IntType, :FloatType IntType の場合はビット数でクリップ、FloatType の場合は最大値でクリップ 527 489 def check_and_clip( in_val, from_type = :IntType ) 528 490 bit_size = get_bit_size … … 533 495 if get_max && val > get_max then 534 496 if from_type == :IntType then 535 rval = ((1 << bit_size)-1) & val # bit æ°ã§ã¯ãªãã497 rval = ((1 << bit_size)-1) & val # bit 数でクリップ 536 498 else 537 rval = get_max # æ大å¤ã§ã¯ãªãã(FloatType)499 rval = get_max # 最大値でクリップ (FloatType) 538 500 end 539 501 cdl_warning( "W2003 $1: too large to cast to $2, clipped($3)" , in_val, get_type_str, rval ) … … 546 508 if @sign == :SIGNED || @sign == nil then 547 509 cdl_warning( "W2004 $1: too small to cast to $2, clipped($3)" , in_val, get_type_str, rval ) 548 else # @sign == :UNSIGNED || @sign == nil (char ã®å ´å)510 else # @sign == :UNSIGNED || @sign == nil (char の場合) 549 511 cdl_warning( "W2005 $1: negative value for unsigned: convert to $2" , in_val, rval ) 550 512 end … … 558 520 if @sign == :SIGNED || @sign == nil then 559 521 if @bit_size == -1 then 560 bit_sz = 8 # char_t ã¯ãæ符å·ã«æ±ã522 bit_sz = 8 # char_t は、有符号に扱う 561 523 else 562 524 bit_sz = @bit_size … … 576 538 if @bit_size == -1 then 577 539 if @sign == nil then 578 return 255 # char_t ã¯ãç¡ç¬¦å·ã«æ±ã540 return 255 # char_t は、無符号に扱う 579 541 else 580 542 bit_sz = 8 … … 600 562 end 601 563 602 #=== IntType# C è¨èªã«ãããååï¼ä¿®é£¾åä»ãï¼564 #=== IntType# C 言語における型名(修飾子付き) 603 565 def get_type_str 604 566 str = super … … 620 582 621 583 case @bit_size 622 when -1 # char_t å584 when -1 # char_t 型 623 585 if @sign == :SIGNED then 624 586 sign = "s" 625 587 end 626 588 str = "#{str}#{sign}char_t" 627 when -11 # char å(obsolete)589 when -11 # char 型(obsolete) 628 590 str = "#{str}#{signL}char" 629 when -2 # short å591 when -2 # short 型 630 592 str = "#{str}#{signL}short" 631 when -3 # int å593 when -3 # int 型 632 594 str = "#{str}#{signL}int" 633 when -4 # long å595 when -4 # long 型 634 596 str = "#{str}#{signL}long" 635 when -5 # long long å597 when -5 # long long 型 636 598 str = "#{str}#{signL}long long" 637 when 8, 16, 32, 64, 128 # int16, int32, int64, int128 å599 when 8, 16, 32, 64, 128 # int16, int32, int64, int128 型 638 600 str = "#{str}#{sign}int#{@bit_size}_t" 639 601 end … … 642 604 end 643 605 644 #=== IntType# C è¨èªã«ãããååï¼å¾ç½®æååï¼606 #=== IntType# C 言語における型名(後置文字列) 645 607 def get_type_str_post 646 608 "" 647 609 end 648 610 649 #=== IntType#bit_size ãå¾ã 650 # è¿ãããå¤ã¯ @bit_size ã®ä»æ§ãåç 651 § 611 #=== IntType#bit_size を得る 612 # 返される値は @bit_size の仕様を参照 652 613 def get_bit_size 653 614 return @bit_size 654 615 end 655 616 656 #=== IntType# sign ãå¾ã 657 # @sign ã®èª¬æãåç 658 § 617 #=== IntType# sign を得る 618 # @sign の説明を参照 659 619 def get_sign 660 620 @sign … … 676 636 end 677 637 678 def check # æå³ç誤ããããã°ãæååãè¿ã638 def check # 意味的誤りがあれば、文字列を返す 679 639 nil 680 640 end 681 641 682 # mikan Float åã® C_EXP å¯¾å¿ (generate.rb ã«ãå¤æ´å¿ 683 è¦) 642 # mikan Float 型の C_EXP 対応 (generate.rb にも変更必要) 684 643 def check_init( locale, ident, initializer, kind, attribute = nil ) 685 # åã«å¯¾ããåæå¤ã«èª¤ããããã°ãã¨ã©ã¼æååãè¿ã644 # 型に対する初期値に誤りがあれば、エラー文字列を返す 686 645 val = initializer 687 646 if val.instance_of?( Expression ) then 688 647 val = val.eval_const2( nil, attribute ) 689 # è©ä¾¡ã®çµæ C_EXP ã Array ã¨ãªãå¯è½æ§ããã648 # 評価の結果 C_EXP や Array となる可能性がある 690 649 end 691 650 692 651 if val.instance_of? Token then 693 # val ã Token ã®å ´å == ã®å³è¾ºã String ã ã¨ã¨ã©ã¼ãèµ·ãã652 # val が Token の場合 == の右辺が String だとエラーを起こす 694 653 cdl_error2( locale, "T1018 $1: $2: not number" , ident, val ) 695 654 return … … 774 733 # @members_decl:: NamedList 775 734 # @definition:: StructType 776 # @b_has_pointer_member:: bool : ã¡ã³ãã«ãã¤ã³ã¿åããã777 # @b_has_sized_pointer_member:: bool : ã¡ã³ãã«ãã¤ã³ã¿åããã778 # @b_has_unsized_string_member:: bool : ã¡ã³ãã«ãã¤ã³ã¿åããã779 # @b_hasTag:: bool : ã¿ã°ããã780 # @member_types_symbol:: Symbol : tag ãç¡ãæã®ã¿è¨å® (ãã以å¤ã§ã¯nil)735 # @b_has_pointer_member:: bool : メンバにポインタ型がある 736 # @b_has_sized_pointer_member:: bool : メンバにポインタ型がある 737 # @b_has_unsized_string_member:: bool : メンバにポインタ型がある 738 # @b_hasTag:: bool : タグがある 739 # @member_types_symbol:: Symbol : tag が無い時のみ設定 (それ以外では nil) 781 740 782 741 @@structtype_current_stack = [] 783 742 @@structtype_current_sp = -1 784 743 785 # tag ãªãstruct744 # tag なし struct 786 745 @@no_struct_tag_num = 0 787 746 @@no_tag_struct_list = {} … … 811 770 if @b_define then 812 771 @members_decl = NamedList.new( nil, "in struct #{@tag}" ) 813 # if @tag then ç»é²ã¿ã¤ãã³ã°ãçµããã«å¤æ´V1.0.2.19772 # if @tag then 登録タイミングを終わりに変更 V1.0.2.19 814 773 # Namespace.new_structtype( self ) 815 774 # end 816 775 else 817 776 @definition = Namespace.find_tag( @tag ) 818 # check_struct_tag ã«ç§»ãV1.0.2.19777 # check_struct_tag に移す V1.0.2.19 819 778 # if @definition == nil then 820 779 # cdl_error( "T1021 \'$1\': struct not defined" , @tag ) … … 841 800 end 842 801 843 def check # æå³ç誤ããããã°ãæååãè¿ã802 def check # 意味的誤りがあれば、文字列を返す 844 803 nil 845 804 end 846 805 847 #=== æ§é ä½ã®ã¿ã°ããã§ã㯠848 # declarator ã®æç¹ã§ãã§ãã¯ãã 849 #kind:: Decl ã® @kind ãåç 850 § 806 #=== 構造体のタグをチェック 807 # declarator の時点でチェックする 808 #kind:: Decl の @kind を参照 851 809 def check_struct_tag kind 852 810 if @tag == nil … … 860 818 end 861 819 862 # mikan Float åã® C_EXP å¯¾å¿ (generate.rb ã«ãå¤æ´å¿ 863 è¦) 820 # mikan Float 型の C_EXP 対応 (generate.rb にも変更必要) 864 821 def check_init( locale, ident, initializer, kind, attribute = nil ) 865 822 … … 870 827 end 871 828 872 # åæååãå¼ã®å ´åãåï¼ã¿ã°ï¼ãä¸è´ããããã§ãã¯829 # 初期化子が式の場合、型(タグ)が一致するかチェック 873 830 if initializer.instance_of?( Expression ) then 874 831 t = initializer.get_type( attribute ) … … 906 863 907 864 def end_of_parse() 908 if @members_decl == nil # @b_define = false ã¾ãã¯ã¡ã³ãã¼ã®ãªãæ§é ä½ï¼ã¨ã©ã¼ï¼865 if @members_decl == nil # @b_define = false またはメンバーのない構造体(エラー) 909 866 return 910 867 end … … 932 889 string = md.get_string 933 890 if string == -1 then 934 # é·ãæå®ãªã891 # 長さ指定なし 935 892 elsif string then 936 893 val = string.eval_const( @members_decl ) … … 970 927 971 928 if @b_hasTag then 972 # typedef struct tag StructType; ã®å½¢å¼ã®å ´å973 # struct ã®æ¬ä½ã¯ãå¥ã«çæããã929 # typedef struct tag StructType; の形式の場合 930 # struct の本体は、別に生成される 974 931 return "#{str}struct #{@tag}" 975 932 976 933 else 977 # typedef struct { int a; } StructType; ã®å½¢å¼ã®å ´å934 # typedef struct { int a; } StructType; の形式の場合 978 935 str += "struct {" 979 936 @members_decl.get_items.each{ |i| … … 1026 983 end 1027 984 1028 #=== åãæ§é ä½ãã©ãããã§ãã¯ãã1029 # tag ã®ãã§ãã¯ã¯è¡ããªã1030 # ãã¹ã¦ã®ã¡ã³ãã®ååã¨åãä¸è´ãããã¨ã確èªãã985 #=== 同じ構造体かどうかチェックする 986 # tag のチェックは行わない 987 # すべてのメンバの名前と型が一致することを確認する 1031 988 def same? another 1032 989 md = another.get_members_decl … … 1118 1075 end 1119 1076 1120 def check # æå³ç誤ããããã°ãæååãè¿ã 1121 if @type.class == ArrayType then # é 1122 åãè¿ãé¢æ° 1077 def check # 意味的誤りがあれば、文字列を返す 1078 if @type.class == ArrayType then # 配列を返す関数 1123 1079 return "function returning array" 1124 elsif @type.class == FuncType then # é¢æ°ãè¿ãé¢æ°1080 elsif @type.class == FuncType then # 関数を返す関数 1125 1081 return "function returning function" 1126 1082 end 1127 return @type.check # é¢æ°ã® return ããåã®ãã§ãã¯1128 1129 # ãã©ã¡ã¼ã¿ã®åã®ãã§ãã¯ã¯ ParamList#check_param ã§è¡ã1083 return @type.check # 関数の return する型のチェック 1084 1085 # パラメータの型のチェックは ParamList#check_param で行う 1130 1086 end 1131 1087 1132 1088 def check_struct_tag kind 1133 1089 @type.check_struct_tag kind 1134 # ParamDecl ã§ããã§ãã¯ãããã®ã§ãããã§ã¯ãã§ãã¯ããªã1090 # ParamDecl でもチェックされるので、ここではチェックしない 1135 1091 # @paramlist.check_struct_tag kind 1136 1092 end … … 1149 1105 end 1150 1106 1151 #=== return type ãè¿ã1107 #=== return type を返す 1152 1108 # 1153 # return type ãè¿ã1154 # get_return_type ã¨ãã¹ãã ã£ã1109 # return type を返す 1110 # get_return_type とすべきだった 1155 1111 def get_type 1156 1112 @type … … 1162 1118 1163 1119 def get_type_str_post 1164 # åã ããè¿ã (ä»®å¼æ°ã®ååãå«ããªã)1120 # 型だけを返す (仮引数の名前を含めない) 1165 1121 @paramlist.to_str( false ) 1166 1122 end … … 1190 1146 end 1191 1147 1192 #=== Push Pop Allocator ãå¿ 1193 è¦ãï¼ 1194 # Transparent RPC ã®å ´å oneway ã㤠in ã®é 1195 å(size_is, count_is, string ã®ããããã§ä¿®é£¾ï¼ããã 1148 #=== Push Pop Allocator が必要か? 1149 # Transparent RPC の場合 oneway かつ in の配列(size_is, count_is, string のいずれかで修飾)がある 1196 1150 def need_PPAllocator?( b_opaque = false ) 1197 1151 if @b_oneway || b_opaque then … … 1202 1156 end 1203 1157 1204 #=== ãã©ã¡ã¼ã¿ã in, inout, out, send, receive ãæã¤ã1158 #=== パラメータが in, inout, out, send, receive を持つか 1205 1159 def has_in? 1206 1160 @has_in … … 1219 1173 end 1220 1174 1221 #=== å 1222 ¥åæ¹åã®ãã©ã¡ã¼ã¿ãæã¤ã 1175 #=== 入力方向のパラメータを持つか 1223 1176 def has_inward? 1224 1177 @has_in || @has_inout || @has_send 1225 1178 end 1226 #=== åºåæ¹åã®ãã©ã¡ã¼ã¿ãæã¤ã1179 #=== 出力方向のパラメータを持つか 1227 1180 def has_outward? 1228 1181 @has_inout || @has_out || @has_receive … … 1266 1219 end 1267 1220 1268 #=== Array#qualifier(const, volatile) ã®è¨å®1221 #=== Array#qualifier(const, volatile) の設定 1269 1222 def set_qualifier( qualifier ) 1270 1223 clone_type … … 1273 1226 end 1274 1227 1275 # é 1276 åè¦ç´ ã const ãªã const 1228 # 配列要素が const なら const 1277 1229 def is_const? 1278 1230 @type.is_const? 1279 1231 end 1280 1232 1281 # é 1282 åè¦ç´ ã volatile ãªã volatile 1233 # 配列要素が volatile なら volatile 1283 1234 def is_volatile? 1284 1235 @type.is_volatile? … … 1306 1257 end 1307 1258 1308 def check # æå³ç誤ããããã°ãæååãè¿ã 1309 if @type.class == FuncType then # é¢æ°ã®é 1310 å 1259 def check # 意味的誤りがあれば、文字列を返す 1260 if @type.class == FuncType then # 関数の配列 1311 1261 return "array of function" 1312 elsif @type.class == ArrayType then # æ·»æ°ãªãé 1313 åã®é 1314 å 1262 elsif @type.class == ArrayType then # 添数なし配列の配列 1315 1263 unless @type.get_subscript then 1316 1264 return "subscript not specified" … … 1318 1266 end 1319 1267 1320 return @type.check # é 1321 åè¦ç´ ã®åããã§ã㯠1268 return @type.check # 配列要素の型をチェック 1322 1269 end 1323 1270 … … 1328 1275 def check_init( locale, ident, initializer, kind, attribute = nil ) 1329 1276 if ( initializer.instance_of?( Array ) ) then 1330 # è¦ç´ æ°ãæå®ããã¦ããå ´åãåæåè¦ç´ æ°ããã§ãã¯1277 # 要素数が指定されている場合、初期化要素数をチェック 1331 1278 if @subscript then 1332 1279 n_sub = @subscript.eval_const( nil ) … … 1381 1328 # @size:: Expr, or nil if not specified 1382 1329 # @count:: Expr, or nil if not specified 1383 # @string:: Expr or -1(if size not specified) ï¼string å¼æ°ï¼, or nil if not specified1330 # @string:: Expr or -1(if size not specified) (string 引数), or nil if not specified 1384 1331 1385 1332 include HasType … … 1398 1345 @type = type 1399 1346 else 1400 @type.set_type( type ) # æå 1401 ã® type ãè¨å® 1347 @type.set_type( type ) # 枝先の type を設定 1402 1348 end 1403 1349 end … … 1421 1367 end 1422 1368 1423 def check # æå³ç誤ããããã°ãæååãè¿ã1369 def check # 意味的誤りがあれば、文字列を返す 1424 1370 return nil if @type == nil 1425 1371 @type.check … … 1427 1373 1428 1374 def check_struct_tag kind 1429 if kind != :MEMBER # æ§é ä½ã¡ã³ãã¼ã®å ´åããã¤ã³ã¿ã®å 1430 ã®æ§é ä½ã¿ã°ããã§ãã¯ããªã 1375 if kind != :MEMBER # 構造体メンバーの場合、ポインタの先の構造体タグをチェックしない 1431 1376 @type.check_struct_tag kind 1432 1377 end … … 1445 1390 if ( t1.class == t2.class ) && ( t1.get_bit_size == t2.get_bit_size ) then 1446 1391 elsif ( t1.kind_of?( CDefinedType) || t2.kind_of?( CDefinedType ) )&& t1.get_type_str == t2.get_type_str && t1.get_type_str_post && t2.get_type_str_post then 1447 # int8_t ãªã©ããä¸æ¹ã¯ .h ã«å®ç¾©ããã¦ããã±ã¼ã¹1392 # int8_t などが、一方は .h に定義されているケース 1448 1393 else 1449 1394 cdl_error2( locale, "T1032 $1: incompatible pointer type" , ident ) … … 1456 1401 end 1457 1402 elsif val.kind_of? StringVal then 1458 # æååå®æ°1403 # 文字列定数 1459 1404 # mikan L"wide string" 1460 1405 if @type.get_bit_size != -1 && @type.get_bit_size != -11 then # -1: char_t … … 1500 1445 @b_nullable = b_nullable 1501 1446 1502 # string ã¯æãå·¦å´ã® ptr ã«ä½ç¨ãã1447 # string は最も左側の ptr に作用する 1503 1448 if @type.kind_of?( PtrType ) then 1504 # ptr_level ã 2 以ä¸ã§ãããã¨ã¯ ParamDecl#initializer ã§ãã§ãã¯ããã1449 # ptr_level が 2 以上であることは ParamDecl#initializer でチェックされる 1505 1450 clone_type 1506 1451 @type.set_scs( nil, nil, string, nil, false ) … … 1549 1494 end 1550 1495 1551 #=== PtrType# size_is ã®æ大å¤1496 #=== PtrType# size_is の最大値 1552 1497 def get_max 1553 1498 @max … … 1612 1557 end 1613 1558 1614 #== DescriptorType ã¯ã©ã¹1615 # åççµåã§æ¸¡ããã¹ã¯ãªãã¿å1559 #== DescriptorType クラス 1560 # 動的結合で渡すデスクリプタ型 1616 1561 class DescriptorType < Type 1617 1562 # @sinagure_nsp::NamespacePath … … 1643 1588 case kind 1644 1589 when :PARAMETER 1645 # å¼æ°ã¯åæåã§ããªã1590 # 引数は初期化できない 1646 1591 else 1647 1592 cdl_error2( locale, "T9999 Descriptor cannot be used for $1", kind) … … 1677 1622 end 1678 1623 1679 # 以ä¸åä½ãã¹ãã³ã¼ã1624 # 以下単体テストコード 1680 1625 if $unit_test then 1681 1626 puts( "===== Unit Test: IntType ===== (types.rb)") -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.