Changeset 318 for asp3_gr_sakura/trunk/tecsgen/tecslib/core/types.rb
- Timestamp:
- Aug 3, 2017, 10:46:41 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_gr_sakura/trunk/tecsgen/tecslib/core/types.rb
-
Property svn:mime-type
changed from
text/x-ruby
totext/x-ruby; charset=UTF-8
r317 r318 6 6 # Copyright (C) 2008-2015 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 # $Id : types.rb 2296 2015-11-29 11:57:33Z okuma-top$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 … … 772 731 # @members_decl:: NamedList 773 732 # @definition:: StructType 774 # @b_has_pointer_member:: bool : ã¡ã³ãã«ãã¤ã³ã¿åããã775 # @b_has_sized_pointer_member:: bool : ã¡ã³ãã«ãã¤ã³ã¿åããã776 # @b_has_unsized_string_member:: bool : ã¡ã³ãã«ãã¤ã³ã¿åããã777 # @member_types_symbol:: Symbol : tag ãç¡ãæã®ã¿è¨å® (ãã以å¤ã§ã¯nil)733 # @b_has_pointer_member:: bool : メンバにポインタ型がある 734 # @b_has_sized_pointer_member:: bool : メンバにポインタ型がある 735 # @b_has_unsized_string_member:: bool : メンバにポインタ型がある 736 # @member_types_symbol:: Symbol : tag が無い時のみ設定 (それ以外では nil) 778 737 779 738 @@structtype_current_stack = [] 780 739 @@structtype_current_sp = -1 781 740 782 # tag ãªãstruct741 # tag なし struct 783 742 @@no_struct_tag_num = 0 784 743 @@no_tag_struct_list = {} … … 803 762 if @b_define then 804 763 @members_decl = NamedList.new( nil, "in struct #{@tag}" ) 805 # if @tag then ç»é²ã¿ã¤ãã³ã°ãçµããã«å¤æ´V1.0.2.19764 # if @tag then 登録タイミングを終わりに変更 V1.0.2.19 806 765 # Namespace.new_structtype( self ) 807 766 # end 808 767 else 809 768 @definition = Namespace.find_tag( @tag ) 810 # check_struct_tag ã«ç§»ãV1.0.2.19769 # check_struct_tag に移す V1.0.2.19 811 770 # if @definition == nil then 812 771 # cdl_error( "T1021 \'$1\': struct not defined" , @tag ) … … 833 792 end 834 793 835 def check # æå³ç誤ããããã°ãæååãè¿ã794 def check # 意味的誤りがあれば、文字列を返す 836 795 nil 837 796 end 838 797 839 #=== æ§é ä½ã®ã¿ã°ããã§ã㯠840 # declarator ã®æç¹ã§ãã§ãã¯ãã 841 #kind:: Decl ã® @kind ãåç 842 § 798 #=== 構造体のタグをチェック 799 # declarator の時点でチェックする 800 #kind:: Decl の @kind を参照 843 801 def check_struct_tag kind 844 802 if @tag == nil … … 852 810 end 853 811 854 # mikan Float åã® C_EXP å¯¾å¿ (generate.rb ã«ãå¤æ´å¿ 855 è¦) 812 # mikan Float 型の C_EXP 対応 (generate.rb にも変更必要) 856 813 def check_init( locale, ident, initializer, kind, attribute = nil ) 857 814 … … 862 819 end 863 820 864 # åæååãå¼ã®å ´åãåï¼ã¿ã°ï¼ãä¸è´ããããã§ãã¯821 # 初期化子が式の場合、型(タグ)が一致するかチェック 865 822 if initializer.instance_of?( Expression ) then 866 823 t = initializer.get_type( attribute ) … … 898 855 899 856 def end_of_parse() 900 if @members_decl == nil # @b_define = false ã¾ãã¯ã¡ã³ãã¼ã®ãªãæ§é ä½ï¼ã¨ã©ã¼ï¼857 if @members_decl == nil # @b_define = false またはメンバーのない構造体(エラー) 901 858 return 902 859 end … … 924 881 string = md.get_string 925 882 if string == -1 then 926 # é·ãæå®ãªã883 # 長さ指定なし 927 884 elsif string then 928 885 val = string.eval_const( @members_decl ) … … 962 919 963 920 if @tag then 964 # typedef struct tag StructType; ã®å½¢å¼ã®å ´å965 # struct ã®æ¬ä½ã¯ãå¥ã«çæããã921 # typedef struct tag StructType; の形式の場合 922 # struct の本体は、別に生成される 966 923 return "#{str}struct #{@tag} " 967 924 968 925 else 969 # typedef struct { int a; } StructType; ã®å½¢å¼ã®å ´å926 # typedef struct { int a; } StructType; の形式の場合 970 927 str += "struct {\n" 971 928 @members_decl.get_items.each{ |i| … … 1018 975 end 1019 976 1020 #=== åãæ§é ä½ãã©ãããã§ãã¯ãã1021 # tag ã®ãã§ãã¯ã¯è¡ããªã1022 # ãã¹ã¦ã®ã¡ã³ãã®ååã¨åãä¸è´ãããã¨ã確èªãã977 #=== 同じ構造体かどうかチェックする 978 # tag のチェックは行わない 979 # すべてのメンバの名前と型が一致することを確認する 1023 980 def same? another 1024 981 md = another.get_members_decl … … 1110 1067 end 1111 1068 1112 def check # æå³ç誤ããããã°ãæååãè¿ã 1113 if @type.class == ArrayType then # é 1114 åãè¿ãé¢æ° 1069 def check # 意味的誤りがあれば、文字列を返す 1070 if @type.class == ArrayType then # 配列を返す関数 1115 1071 return "function returning array" 1116 elsif @type.class == FuncType then # é¢æ°ãè¿ãé¢æ°1072 elsif @type.class == FuncType then # 関数を返す関数 1117 1073 return "function returning function" 1118 1074 end 1119 return @type.check # é¢æ°ã® return ããåã®ãã§ãã¯1120 1121 # ãã©ã¡ã¼ã¿ã®åã®ãã§ãã¯ã¯ ParamList#check_param ã§è¡ã1075 return @type.check # 関数の return する型のチェック 1076 1077 # パラメータの型のチェックは ParamList#check_param で行う 1122 1078 end 1123 1079 1124 1080 def check_struct_tag kind 1125 1081 @type.check_struct_tag kind 1126 # ParamDecl ã§ããã§ãã¯ãããã®ã§ãããã§ã¯ãã§ãã¯ããªã1082 # ParamDecl でもチェックされるので、ここではチェックしない 1127 1083 # @paramlist.check_struct_tag kind 1128 1084 end … … 1141 1097 end 1142 1098 1143 #=== return type ãè¿ã1099 #=== return type を返す 1144 1100 # 1145 # return type ãè¿ã1146 # get_return_type ã¨ãã¹ãã ã£ã1101 # return type を返す 1102 # get_return_type とすべきだった 1147 1103 def get_type 1148 1104 @type … … 1154 1110 1155 1111 def get_type_str_post 1156 # åã ããè¿ã (ä»®å¼æ°ã®ååãå«ããªã)1112 # 型だけを返す (仮引数の名前を含めない) 1157 1113 @paramlist.to_str( false ) 1158 1114 end … … 1182 1138 end 1183 1139 1184 #=== Push Pop Allocator ãå¿ 1185 è¦ãï¼ 1186 # Transparent RPC ã®å ´å oneway ã㤠in ã®é 1187 å(size_is, count_is, string ã®ããããã§ä¿®é£¾ï¼ããã 1140 #=== Push Pop Allocator が必要か? 1141 # Transparent RPC の場合 oneway かつ in の配列(size_is, count_is, string のいずれかで修飾)がある 1188 1142 def need_PPAllocator?( b_opaque = false ) 1189 1143 if @b_oneway || b_opaque then … … 1194 1148 end 1195 1149 1196 #=== ãã©ã¡ã¼ã¿ã in, inout, out, send, receive ãæã¤ã1150 #=== パラメータが in, inout, out, send, receive を持つか 1197 1151 def has_in? 1198 1152 @has_in … … 1211 1165 end 1212 1166 1213 #=== å 1214 ¥åæ¹åã®ãã©ã¡ã¼ã¿ãæã¤ã 1167 #=== 入力方向のパラメータを持つか 1215 1168 def has_inward? 1216 1169 @has_in || @has_inout || @has_send 1217 1170 end 1218 #=== åºåæ¹åã®ãã©ã¡ã¼ã¿ãæã¤ã1171 #=== 出力方向のパラメータを持つか 1219 1172 def has_outward? 1220 1173 @has_inout || @has_out || @has_receive … … 1258 1211 end 1259 1212 1260 #=== Array#qualifier(const, volatile) ã®è¨å®1213 #=== Array#qualifier(const, volatile) の設定 1261 1214 def set_qualifier( qualifier ) 1262 1215 clone_type … … 1265 1218 end 1266 1219 1267 # é 1268 åè¦ç´ ã const ãªã const 1220 # 配列要素が const なら const 1269 1221 def is_const? 1270 1222 @type.is_const? 1271 1223 end 1272 1224 1273 # é 1274 åè¦ç´ ã volatile ãªã volatile 1225 # 配列要素が volatile なら volatile 1275 1226 def is_volatile? 1276 1227 @type.is_volatile? … … 1298 1249 end 1299 1250 1300 def check # æå³ç誤ããããã°ãæååãè¿ã 1301 if @type.class == FuncType then # é¢æ°ã®é 1302 å 1251 def check # 意味的誤りがあれば、文字列を返す 1252 if @type.class == FuncType then # 関数の配列 1303 1253 return "array of function" 1304 elsif @type.class == ArrayType then # æ·»æ°ãªãé 1305 åã®é 1306 å 1254 elsif @type.class == ArrayType then # 添数なし配列の配列 1307 1255 unless @type.get_subscript then 1308 1256 return "subscript not specified" … … 1310 1258 end 1311 1259 1312 return @type.check # é 1313 åè¦ç´ ã®åããã§ã㯠1260 return @type.check # 配列要素の型をチェック 1314 1261 end 1315 1262 … … 1364 1311 # @size:: Expr, or nil if not specified 1365 1312 # @count:: Expr, or nil if not specified 1366 # @string:: Expr or -1(if size not specified) ï¼string å¼æ°ï¼, or nil if not specified1313 # @string:: Expr or -1(if size not specified) (string 引数), or nil if not specified 1367 1314 1368 1315 include HasType … … 1381 1328 @type = type 1382 1329 else 1383 @type.set_type( type ) # æå 1384 ã® type ãè¨å® 1330 @type.set_type( type ) # 枝先の type を設定 1385 1331 end 1386 1332 end … … 1404 1350 end 1405 1351 1406 def check # æå³ç誤ããããã°ãæååãè¿ã1352 def check # 意味的誤りがあれば、文字列を返す 1407 1353 return nil if @type == nil 1408 1354 @type.check … … 1410 1356 1411 1357 def check_struct_tag kind 1412 if kind != :MEMBER # æ§é ä½ã¡ã³ãã¼ã®å ´åããã¤ã³ã¿ã®å 1413 ã®æ§é ä½ã¿ã°ããã§ãã¯ããªã 1358 if kind != :MEMBER # 構造体メンバーの場合、ポインタの先の構造体タグをチェックしない 1414 1359 @type.check_struct_tag kind 1415 1360 end … … 1428 1373 if ( t1.class == t2.class ) && ( t1.get_bit_size == t2.get_bit_size ) then 1429 1374 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 1430 # int8_t ãªã©ããä¸æ¹ã¯ .h ã«å®ç¾©ããã¦ããã±ã¼ã¹1375 # int8_t などが、一方は .h に定義されているケース 1431 1376 else 1432 1377 cdl_error2( locale, "T1032 $1: incompatible pointer type" , ident ) … … 1439 1384 end 1440 1385 elsif val.kind_of? StringVal then 1441 # æååå®æ°1386 # 文字列定数 1442 1387 # mikan L"wide string" 1443 1388 if @type.get_bit_size != -1 && @type.get_bit_size != -11 then # -1: char_t … … 1483 1428 @b_nullable = b_nullable 1484 1429 1485 # string ã¯æãå·¦å´ã® ptr ã«ä½ç¨ãã1430 # string は最も左側の ptr に作用する 1486 1431 if @type.kind_of?( PtrType ) then 1487 # ptr_level ã 2 以ä¸ã§ãããã¨ã¯ ParamDecl#initializer ã§ãã§ãã¯ããã1432 # ptr_level が 2 以上であることは ParamDecl#initializer でチェックされる 1488 1433 clone_type 1489 1434 @type.set_scs( nil, nil, string, nil, false ) … … 1532 1477 end 1533 1478 1534 #=== PtrType# size_is ã®æ大å¤1479 #=== PtrType# size_is の最大値 1535 1480 def get_max 1536 1481 @max … … 1595 1540 end 1596 1541 1597 #== DescriptorType ã¯ã©ã¹1598 # åççµåã§æ¸¡ããã¹ã¯ãªãã¿å1542 #== DescriptorType クラス 1543 # 動的結合で渡すデスクリプタ型 1599 1544 class DescriptorType < Type 1600 1545 # @sinagure_nsp::NamespacePath … … 1630 1575 case kind 1631 1576 when :PARAMETER 1632 # å¼æ°ã¯åæåã§ããªã1577 # 引数は初期化できない 1633 1578 else 1634 1579 cdl_error2( locale, "T9999 Descriptor cannot be used for $1", kind) … … 1637 1582 1638 1583 #== DescriptorType# 1639 # æå³è§£æ段éã§ã¯ nil ãè¿ãããå¯è½æ§ã«æ³¨æ1584 # 意味解析段階では nil が返される可能性に注意 1640 1585 def get_signature 1641 1586 Namespace.find @signature_nsp … … 1643 1588 end 1644 1589 1645 # 以ä¸åä½ãã¹ãã³ã¼ã1590 # 以下単体テストコード 1646 1591 if $unit_test then 1647 1592 puts( "===== Unit Test: IntType ===== (types.rb)") -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.