- 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/expression.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$ … … 71 56 72 57 #=== Expression# to_s 73 # C è¨èªã½ã¼ã¹åãã®æååãçæ(globa_name)58 # C 言語ソース向きの文字列を生成 (globa_name) 74 59 def to_s 75 60 elements_to_s( @elements ) … … 77 62 78 63 #=== Expression# to_str 79 # C è¨èªã½ã¼ã¹åãã®æååãçæ(globa_name)64 # C 言語ソース向きの文字列を生成 (globa_name) 80 65 def to_str( name_list, pre, post ) 81 66 elements_to_s( @elements, name_list, pre, post ) … … 83 68 84 69 #=== Expression#to_CDL_str 85 # CDL 表ç¾ã®æååãçæ70 # CDL 表現の文字列を生成 86 71 def to_CDL_str 87 72 return to_s 88 73 end 89 74 90 #=== å®æ°å¼ã¨ãã¦è©ä¾¡ãã(ãã©ã¤ãã¦ã¿ã)75 #=== 定数式として評価する(トライしてみる) 91 76 # 92 # ãã®ã¡ã½ããã¯ãå®æ°å¼ãè©ä¾¡ãã 93 # ã»attribute, var ã®åæåå 94 # ã»size_is, count_is å¼æ° 95 # ã»é 96 åã®æ·»æ° 77 # このメソッドは、定数式を評価する 78 # ・attribute, var の初期化子 79 # ・size_is, count_is 引数 80 # ・配列の添数 97 81 # 98 # name_list(NamedList|Nil): å¼ããåç 99 §å¯è½ãªãªã¹ãï¼ 100 # NamedList ã®è¦ç´ 㯠size_is, count_is ã®å¼æ°è©ä¾¡ã®å ´å ParamDecl (é¢æ°ä»®å¼æ°) 82 # name_list(NamedList|Nil): 式から参照可能なリスト. 83 # NamedList の要素は size_is, count_is の引数評価の場合 ParamDecl (関数仮引数) 101 84 # 102 # name_list2(NamedList|Nil) : NamedList ã®è¦ç´ 㯠Decl (attribute, var) ã§ããï¼çç¥ænil85 # name_list2(NamedList|Nil) : NamedList の要素は Decl (attribute, var) である.省略時 nil 103 86 # 104 # RETURN: è©ä¾¡ããå®æ°ï¼è©ä¾¡ã§ããªãã£ãå ´å㯠nil ãè¿ã87 # RETURN: 評価した定数.評価できなかった場合は nil を返す 105 88 # 106 # å㯠get_type ã§ãè©ä¾¡ããï¼å®æ°ã¨ãã¦æ±ããããªãã¨ãã«ä½¿ç¨ã§ããï¼107 # Array ãè¿ãã®ã¯ attr{ int *a = {1, 2, 3}; int *b = a; }; ã® b ã®å³è¾ºãè©ä¾¡ããå ´å89 # 型は get_type で、評価する(定数として求められないときに使用できる) 90 # Array を返すのは attr{ int *a = {1, 2, 3}; int *b = a; }; の b の右辺を評価した場合 108 91 109 92 def eval_const( name_list, name_list2 = nil ) … … 116 99 return val.to_i 117 100 elsif val.kind_of? PointerVal then 118 return val.to_i # mikan ã¨ã©ã¼ V1008 ãçºçãã¦ãã¾ã101 return val.to_i # mikan エラー V1008 が発生してしまう 119 102 # elsif val.kind_of? EnumVal then 120 103 # enum mikan 121 104 else 122 # C_EXP, Array ã¾ã㯠nil ï¼ãã®ã¾ã¾è¿ã105 # C_EXP, Array または nil :そのまま返す 123 106 return val 124 107 end 125 108 end 126 109 127 #=== å®æ°å¼ã¨ãã¦è©ä¾¡ãã2(ãã©ã¤ãã¦ã¿ã)110 #=== 定数式として評価する2(トライしてみる) 128 111 # 129 # IntegerVal, FloatVal ããã®ã¾ã¾è¿ãï¼eval_const ã§ã¯ Integer, Float ã«å¤æï¼112 # IntegerVal, FloatVal をそのまま返す(eval_const では Integer, Float に変換) 130 113 def eval_const2( name_list, name_list2 = nil, nest = 0 ) 131 114 val = elements_eval_const( @elements, name_list, name_list2, nest ) 132 115 end 133 116 134 #=== å¼ã®åãè©ä¾¡ãã117 #=== 式の型を評価する 135 118 # 136 # eval_const ã§å¤ãå¾ãããªãå ´åãåãå°åºå¯è½ã§ããã°åãå¾ã137 # param ãå«ãã å¼ã¯å®æ°å¤ãæ±ããããªãããåãå¾ããã¨ã¯ã§ãã138 # æªå®ç¾©å¤æ°ãå«ãã åã¯ãå¾ããã¨ãã§ããªã (ããã¼åå®ç¾©ãè¿ã)139 def get_type( namedList ) # åå空éã® NamedList ãæå®119 # eval_const で値が得られない場合、型を導出可能であれば型を得る 120 # param を含んだ式は定数値を求められないが、型を得ることはできる 121 # 未定義変数を含んだ型は、得ることができない (ダミー型定義が返る) 122 def get_type( namedList ) # 名前空間の NamedList を指定 140 123 elements_get_type( @elements, namedList ) 141 124 end … … 150 133 151 134 def show_tree( indent ) 152 # mikan override ãã¦ãã¾ã£ã print ãå¼åºãæ¹æ³ãããããªãã®ã§ãããã135 # mikan override してしまった print を呼出す方法がわからないのでこうした 153 136 str = "" 154 137 indent.times { str += " " } … … 158 141 ## private 159 142 160 #=== å¼ãæååã«å¤æ161 #name_list:: attribute (Celltype::@attribute_list), struct ã® @member_list ãä»®å®ãã¦ãã143 #=== 式を文字列に変換 144 #name_list:: attribute (Celltype::@attribute_list), struct の @member_list を仮定している 162 145 def elements_to_s( elements, name_list = nil, pre = nil, post = nil ) 163 146 if elements.instance_of? Token then 164 return elements.to_s # OP_DOT, OP_REF ã®å³è¾º147 return elements.to_s # OP_DOT, OP_REF の右辺 165 148 end 166 149 … … 247 230 end 248 231 249 #=== Expression# éãã¼ã©ã³ãæååå250 #param_list:: ParamlList é¢æ°ã®å¼æ°ãªã¹ã232 #=== Expression# 逆ポーランド文字列化 233 #param_list:: ParamlList 関数の引数リスト 251 234 def get_rpn( param_list = nil, name_list2 = nil ) 252 235 return elements_rpn( @elements, param_list, name_list2 ) 253 236 end 254 237 255 #=== Expression# éãã¼ã©ã³ãæååå(private)256 #name_list:: ParamlList é¢æ°ã®å¼æ°ãªã¹ã238 #=== Expression# 逆ポーランド文字列化 (private) 239 #name_list:: ParamlList 関数の引数リスト 257 240 def elements_rpn( elements, name_list = nil, name_list2 = nil ) 258 241 if elements.instance_of? Token then 259 242 print "rpn: #{elements.to_s}\n" 260 return elements.to_s # OP_DOT, OP_REF ã®å³è¾º243 return elements.to_s # OP_DOT, OP_REF の右辺 261 244 end 262 245 … … 354 337 end 355 338 356 # å®æ°å¼(elements)ãè©ä¾¡ãã339 # 定数式(elements)を評価する 357 340 # 358 # ãã®ã¡ã½ãã㯠Expression ã¯ã©ã¹ã®ã¡ã½ããã§ããå¿ 359 è¦ã¯ãªãï¼é¢æ°åã§ããï¼ 341 # このメソッドは Expression クラスのメソッドである必要はない(関数化できる) 360 342 # 361 # elements ã¯å¼ã®è¦ç´343 # elements は式の要素 362 344 # 363 # name_list, name_list2 㯠eval_const ãåç 364 § 345 # name_list, name_list2 は eval_const を参照 365 346 # 366 # RETURN: è©ä¾¡ããå®æ°ãè©ä¾¡ã§ããªãã£ãå ´å㯠nil ãè¿ã 367 368 MAX_NEST_LEVEL = 64 # ç°¡æã®ã«ã¼ãæ¤åºï¼åç 369 §ã®ãã¹ãã 64 ã¾ã§è¨±å¯ããï¼ 347 # RETURN: 評価した定数、評価できなかった場合は nil を返す 348 349 MAX_NEST_LEVEL = 64 # 簡易のループ検出(参照のネストを 64 まで許可する) 370 350 def elements_eval_const( elements, name_list, name_list2 = nil, nest = nil ) 371 351 … … 374 354 nsp = elements[1] 375 355 376 # #809 ã®ä¿®æ£ããã (å¥ã®åé¡ã解決ãããã¦ããªã) 377 # nest += 1 # åç 378 §ãã«ã¼ãã«ãªã£ã¦ããªããã®ãã§ã㯠379 # # mikan æ¬å½ã«ã«ã¼ããã¦ãããã©ããã§ã¯ãªããåç´ã«å¤æ°ã®åç 380 §ãç¹°ãè¿ãã¦ãããã¨ã§å¤å®ãã¦ãã 356 # #809 の修正しかけ (別の問題が解決しきれていない) 357 # nest += 1 # 参照がループになっていないかのチェック 358 # # mikan 本当にループしているかどうかではなく、単純に多数の参照を繰り返していることで判定している 381 359 # if nest > MAX_NEST_LEVEL then 382 360 # cdl_error( "E9999: '$1' too many reference (maybe loop) max=$1" , nsp.to_s, MAX_NEST_LEVEL ) … … 393 371 end 394 372 395 # è¦ã¤ãããªããã°å®æ°å®ç¾©ããæ¢ã373 # 見つからなければ定数定義から探す 396 374 if object == nil then 397 object = Namespace.find( nsp )# mikan namespace ã®å¯¾å¿ #1 398 end 399 400 # ãã®å®è£ 401 ã¯ãããå°ãæ´çãããã¹ã 402 # ãããå¼åºãããã®ã¯ã以ä¸ã®å ´å 403 # ã»attribute, var ã®å³è¾ºå¼ã®è©ä¾¡ 404 # ã»size_is å¼æ°ã®è©ä¾¡ï¼é¢æ°ãã©ã¡ã¼ã¿ã®å ´åã¨attribute, var ã®å ´åããã 405 # 以ä¸ã®ã¨ã©ã¼ãã§ãã¯ã§ã¯ããããããã£ã¡ãã«ãªã£ã¦èª¤ããæ¤åºãããã¨ãã¦ãã 406 407 # IDENTIFIER ã¯è¦ã¤ãããªãã£ãï¼ 375 object = Namespace.find( nsp )# mikan namespace の対応 #1 376 end 377 378 # この実装は、もう少し整理されるべき 379 # これが呼出されるのは、以下の場合 380 # ・attribute, var の右辺式の評価 381 # ・size_is 引数の評価:関数パラメータの場合とattribute, var の場合がある 382 # 以下のエラーチェックでは、これらがごっちゃになって誤りを検出しようとしている 383 384 # IDENTIFIER は見つからなかった? 408 385 if object == nil then 409 386 cdl_error( "E1001 $1: not found" , nsp.get_path_str ) … … 411 388 return nil 412 389 elsif object.instance_of?( Join ) then 413 # Join ã®å ´åï¼ cell ã®ä¸ã® attribute, var, call ã®ã©ãããè¦ã¤ãã£ã414 # Decl (attribute, var) ã§ãªãï¼390 # Join の場合: cell の中の attribute, var, call のどれかが見つかった 391 # Decl (attribute, var) でない? 415 392 if ! object.get_definition.instance_of?( Decl ) then 416 393 cdl_error( "E1002 $1: not constant (port)" , nsp.get_path_str ) … … 419 396 return object.get_rhs.eval_const2( name_list, name_list2, nest ) 420 397 elsif ! object.instance_of?( Decl ) then 421 # Decl ã§ãªãå ´åï¼ å®æ°ã§ããªã398 # Decl でない場合: 定数でもない 422 399 if ( ! object.instance_of?( ParamDecl ) ) then 423 # mikan paramdecl ã¯ç¡è¦ãã424 # ParamList ããå¼ã°ããã¨ã400 # mikan paramdecl は無視する 401 # ParamList から呼ばれたとき 425 402 cdl_error( "E1003 $1: not constant" , nsp.get_path_str ) 426 403 else … … 432 409 object.referenced 433 410 if object.get_initializer == nil then 434 # åæååã®åå¨ããªãå¤æ° # mikan ããã¸ããã®ã¯ãé常ããããªãã¯ãï¼æªæ¤è¨¼ï¼411 # 初期化子の存在しない変数 # mikan ここへくるのは、通常ありえないはず(未検証) 435 412 return IntegerVal.new( 0 ) 436 413 else 437 # Decl ã®å³è¾ºã®è©ä¾¡438 # mikan size_is å¼æ°ã«ç¾ããå¤æ°ã®åãé©åãã®ãã§ãã¯ãã414 # Decl の右辺の評価 415 # mikan size_is 引数に現れる変数の型が適切かのチェックする 439 416 if object.get_initializer.instance_of?( Expression ) || object.get_initializer.instance_of?( C_EXP ) then 440 417 return object.get_initializer.eval_const2( name_list, name_list2, nest ) 441 418 else 442 # Array ã®å ´å419 # Array の場合 443 420 return object.get_initializer 444 421 end … … 556 533 # p "val.respond_to?( \"-@\" )=#{val.respond_to?( "-@" )} #{val.class}" 557 534 # p "val.respond_to?( \"~@\" )=#{val.respond_to?( "~@" )}" 558 #2.0 if val.respond_to?( "~@" ) then # Ruby 1.9, 2.0 preview çã§ã¯ä¾å¤ãçºçãã¦ãã¾ã535 #2.0 if val.respond_to?( "~@" ) then # Ruby 1.9, 2.0 preview 版では例外が発生してしまう 559 536 if val.kind_of? IntegerVal then 560 537 return ~ val … … 702 679 def elements_get_type( elements, namedList ) 703 680 type = elements_get_type_sub( elements, namedList ) 704 # è¿ãããæ¹ã DefinedType ã®å ´å å 705 ã®åãè¿ã 681 # 返された方が DefinedType の場合 元の型を返す 706 682 if type.kind_of?( DefinedType ) then 707 683 type = type.get_type … … 742 718 unless type.kind_of?( PtrType ) then 743 719 cdl_error( "E1013 \'*\': operand is not pointer value" ) 744 return IntType.new( 8 ) # IntType ãè¿ãã¦ãã720 return IntType.new( 8 ) # IntType を返しておく 745 721 end 746 722 return type.get_referto 747 723 748 724 when :OP_U_PLUS, :OP_U_MINUS 749 # mikan operand ãé©åãªåããã§ãã¯ãã¦ããªã725 # mikan operand が適切な型かチェックしていない 750 726 return elements_get_type( elements[1], namedList ) 751 727 752 728 when :OP_ADD, :OP_SUB, :OP_MULT, :OP_DIV, :OP_REMAIN 753 # mikan operand ãé©åãªåããã§ãã¯ãã¦ããªãï¼å·¦è¾ºã®åãæ¡ç¨ãã¦ãã729 # mikan operand が適切な型かチェックしていない&左辺の型を採用している 754 730 return elements_get_type( elements[1], namedList ) 755 731 756 732 when :OP_U_TILDE 757 # mikan operand ãæ´æ°ããã§ãã¯ãã¦ããªã733 # mikan operand が整数かチェックしていない 758 734 return elements_get_type( elements[1], namedList ) 759 735 when :OP_AND, :OP_EOR, :OP_OR, :OP_LSFT, :OP_RSFT 760 # mikan operand ãæ´æ°ããã§ãã¯ãã¦ããªã736 # mikan operand が整数かチェックしていない 761 737 return BoolType.new 762 738 when :OP_U_EXCLAM 763 # mikan operand ãæ´æ°ããã§ãã¯ãã¦ããªã739 # mikan operand が整数かチェックしていない 764 740 return BoolType.new 765 741 … … 771 747 end 772 748 773 # å¼ã size_is, count_is, string ã®å¼æ°ã§ããå ´åã®æ¹åã®ãã§ãã¯749 # 式が size_is, count_is, string の引数である場合の方向のチェック 774 750 def elements_check_dir_for_param( elements, namedList, dir, spec ) 775 # dir ï¼ å 776 ã®å¼æ°ã®æ¹å 777 # direct: size_is ãªã©ã®å¼æ°ã®å¤æ°ã®æ¹å 751 # dir : 元の引数の方向 752 # direct: size_is などの引数の変数の方向 778 753 779 754 case elements[0] … … 806 781 judge = true if ( direct == :IN || direct == :INOUT ) 807 782 req_direct = "in or inout" 808 when :OUT, :RECEIVE # mikan out 㧠count_is ã®ã¿æå®ããã¦ããå ´å in ã§ãªãã¦ã¯ãªããªã783 when :OUT, :RECEIVE # mikan out で count_is のみ指定されている場合 in でなくてはならない 809 784 judge = true if ( direct == :OUT || direct == :INOUT ) 810 785 req_direct = "out or inout" … … 822 797 return true 823 798 824 # åé 825 æ¼ç®å 799 # 単項演算子 826 800 when :OP_U_ASTER, :OP_SIZEOF_EXPR, :OP_SIZEOF_TYPE, :OP_U_PLUS, :OP_U_MINUS, :OP_U_TILDE, :OP_U_EXCLAM, :CAST, :OP_U_AMP, :PARENTHESES, 827 801 elements_check_dir_for_param( elements[1], namedList, dir, spec ) 828 802 829 # 2é 830 æ¼ç®å 803 # 2項演算子 831 804 when :OP_SUBSC, :OP_DOT, :OP_REF, :OP_MULT, :OP_DIV, :OP_REMAIN, :OP_ADD, :OP_SUB, :OP_LSFT, :OP_RSFT, :OP_LT, :OP_GT, :OP_LE, :OP_GE, :OP_EQ, :OP_NE, :OP_AND, :OP_EOR, :OP_OR, :OP_LAND, :OP_LOR 832 805 return elements_check_dir_for_param( elements[1], namedList, dir, spec ) && elements_check_dir_for_param( elements[2], namedList, dir, spec ) 833 806 834 # 3é 835 æ¼ç®å 807 # 3項演算子 836 808 when :OP_CEX 837 809 return elements_check_dir_for_param( elements[1], namedList, dir, spec ) && elements_check_dir_for_param( elements[2], namedList, dir, spec ) && elements_check_dir_for_param( elements[3], namedList, dir, spec ) … … 845 817 #Express# get_allocator_rhs_elem 846 818 #alloc_type::Symbol :NORMAL_ALLOC|:INTERNAL_ALLOC|:RELAY_ALLOC 847 # å¼ãã¢ãã±ã¼ã¿æå®åã®å³è¾ºã¨ãã¦å¦¥å½ããã§ãã¯ããæ£ãããã°å解ããå¤ãè¿ã819 #式がアロケータ指定子の右辺として妥当かチェックし、正しければ分解した値を返す 848 820 #return: 849 821 # :NORMAL_ALLOC [ cell_nsp, ep_name ] # rhs = cell_nsp.ep_name ex) Alloc.eAlloc … … 883 855 end 884 856 885 #Expression#Expression ã®ã¯ãã¼ã³ãä½æãã857 #Expression#Expression のクローンを作成する 886 858 def clone_for_composite 887 859 cl = self.clone … … 891 863 end 892 864 893 #Expression#elements ã®ã¯ãã¼ã³ãä½æ865 #Expression#elements のクローンを作成 894 866 #elements::Array 895 # ãã®ã¡ã½ããã¯ãArray ã®ãã£ã¼ãã³ãã¼ãè¡ã867 # このメソッドは、Array のディープコピーを行う 896 868 def clone_elements elements 897 869 elements = elements.clone … … 910 882 end 911 883 912 #=== Expression# ã»ã«çµåã®å¼ã解æãã884 #=== Expression#セル結合の式を解析する 913 885 # Cell.eEntry => [ :OP_DOT, [ :IDENTIFIER, token ], token ] 914 886 # Cell.eEntry[expression] => [ :OP_SUBSC, [ :OP_DOT, [ :IDENTIFIER, token ], token ], expression ] 915 887 # Return: [ NamespacePath(cell_name), Integer(subscript) or nil, Token(port_name)] 916 888 def analyze_cell_join_expression 917 # å³è¾ºã® Expression ã®è¦ç´ ãåãåºã889 # 右辺の Expression の要素を取り出す 918 890 elements = @elements 919 if elements[0] == :OP_SUBSC then # å³è¾ºï¼åãå£é 920 åï¼ 891 if elements[0] == :OP_SUBSC then # 右辺:受け口配列? 921 892 # elements = [ :OP_SUBSC, [ :OP_DOT, [ :IDENTIFIER, token ], token ], expression ] 922 subscript = elements[2].eval_const(nil) # åãå£é 923 åã®æ·»æ° 924 elements = elements[1] # mikan é 925 åã ã£ãå ´å 893 subscript = elements[2].eval_const(nil) # 受け口配列の添数 894 elements = elements[1] # mikan 配列だった場合 926 895 else 927 896 subscript = nil … … 939 908 end 940 909 941 #=== Expression# ã»ã«ã¸ã®çµåã®å¼ãçæãã910 #=== Expression# セルへの結合の式を生成する 942 911 #nsp:: NamespacePath 943 912 #subscript:: Integer 944 913 #port_name:: Symbol 945 # analyze_cell_join_expression ã¨å¯¾ã«ãªã£ã¦ãã914 # analyze_cell_join_expression と対になっている 946 915 def self.create_cell_join_expression( nsp, subscript, port_name, locale = nil ) 947 916 if ! port_name.instance_of?( Symbol ) then … … 959 928 end 960 929 961 #=== Expression# æ´æ°å®æ°ã®å¼ãçæãã962 #val:: Integer : å¤ï¼ æ´æ°930 #=== Expression#整数定数の式を生成する 931 #val:: Integer : 値: 整数 963 932 def self.create_integer_constant( val, locale = nil ) 964 933 if val != Integer( val ) || val < 0 then … … 968 937 end 969 938 970 #=== Expression# åä¸ã®èå¥åã®å¼ã解æãã939 #=== Expression#単一の識別子の式を解析する 971 940 # Identifier => [ :IDENTIFIER, token ] 972 941 # Return: NamespacePath(Identifier) 973 942 def analyze_single_identifier 974 # å³è¾ºã® Expression ã®è¦ç´ ãåãåºã943 # 右辺の Expression の要素を取り出す 975 944 elements = @elements 976 945 if elements[0] == :IDENTIFIER … … 982 951 983 952 #=== Expression# 984 #nsp:: NamespacePath : åç 985 §ãããã®èå¥å 953 #nsp:: NamespacePath : 参照するもの識別子 986 954 def self.create_single_identifier( nsp, locale ) 987 955 if ! nsp.instance_of?( NamespacePath ) then … … 991 959 end 992 960 993 #=== è©ä¾¡å¯è½ããã§ãã¯ãã994 #*v:: å¯å¤åå¼æ°ï¼ä»»æã®åï¼995 # ãã¹ã¦ã BaseVal ã®åã¯ã©ã¹ï¼å¤ï¼ã§ããã°ãè©ä¾¡å¯è½ã¨å¤æãã961 #=== 評価可能かチェックする 962 #*v:: 可変個引数(任意の型) 963 # すべてが BaseVal の子クラス(値)であれば、評価可能と判断する 996 964 def evaluable?( *v ) 997 965 v.each{ |val| … … 1012 980 1013 981 #c_exp_string::String 1014 #b_renew::Bool : true ãªã C_EXP ã® clone ä½æï¼ã¨ã¹ã±ã¼ãå¦ççãããªãï¼982 #b_renew::Bool : true なら C_EXP の clone 作成(エスケープ処理等をしない) 1015 983 def initialize( c_exp_string, b_renew = false ) 1016 984 if b_renew then 1017 985 @c_exp_string = c_exp_string 1018 986 else 1019 # åå¾ã® " ãåãé¤ã987 # 前後の " を取り除く 1020 988 # str = c_exp_string.to_s.sub( /^\"(.*)\"$/, "\\1" ) 1021 989 str = CDLString.remove_dquote c_exp_string.to_s … … 1024 992 end 1025 993 1026 #=== composite ç¨ã« C_EXP ã clone ãã994 #=== composite 用に C_EXP を clone する 1027 995 #ct_name:: 1028 996 #cell_name:: 1029 # composite ã® attribute ã«ç¾ãã C_EXP ãæååç½®æãã¦çæããªããï¼1030 # ãã®æååç½®æã¯ãæå³è§£é段éã§è¡ãï¼1031 # ä»ã® C_EXP ã®æååç½®æã¯ãã³ã¼ãçæ段éã§è¡ãï¼997 # composite の attribute に現れる C_EXP を文字列置換して生成しなおす. 998 # この文字列置換は、意味解釈段階で行う. 999 # 他の C_EXP の文字列置換は、コード生成段階で行う. 1032 1000 def clone_for_composite( ct_name, cell_name, locale ) 1033 1001 dbgPrint "C_EXP: #{ct_name} #{cell_name} #{@c_exp_string}\n" … … 1044 1012 end 1045 1013 1046 #=== C_EXP ãè©ä¾¡ãã1047 # C_EXP ã®å¼ãæ°æååãè¿ã1048 # æ¬æ¥ C_EXP 㯠eval_const ãã対象ã§ã¯ãªããã便å®ä¸ eval_const ã§å¯¾å¿1014 #=== C_EXP を評価する 1015 # C_EXP の引き数文字列を返す 1016 # 本来 C_EXP は eval_const する対象ではないが、便宜上 eval_const で対応 1049 1017 def eval_const( name_list, name_list2 = nil ) 1050 1018 return self -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.