Changeset 318 for asp3_gr_sakura/trunk/tecsgen/tecslib/core/expression.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/expression.rb
-
Property svn:mime-type
changed from
text/x-ruby
totext/x-ruby; charset=UTF-8
r317 r318 6 6 # Copyright (C) 2008-2014 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 : expression.rb 2061 2014-05-31 22:15:33Z okuma-top$37 # $Id$ 53 38 #++ 54 39 … … 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 … … 246 229 end 247 230 248 # å®æ°å¼(elements)ãè©ä¾¡ãã231 # 定数式(elements)を評価する 249 232 # 250 # ãã®ã¡ã½ãã㯠Expression ã¯ã©ã¹ã®ã¡ã½ããã§ããå¿ 251 è¦ã¯ãªãï¼é¢æ°åã§ããï¼ 233 # このメソッドは Expression クラスのメソッドである必要はない(関数化できる) 252 234 # 253 # elements ã¯å¼ã®è¦ç´235 # elements は式の要素 254 236 # 255 # name_list, name_list2 㯠eval_const ãåç 256 § 237 # name_list, name_list2 は eval_const を参照 257 238 # 258 # RETURN: è©ä¾¡ããå®æ°ãè©ä¾¡ã§ããªãã£ãå ´å㯠nil ãè¿ã 259 260 MAX_NEST_LEVEL = 64 # ç°¡æã®ã«ã¼ãæ¤åºï¼åç 261 §ã®ãã¹ãã 64 ã¾ã§è¨±å¯ããï¼ 239 # RETURN: 評価した定数、評価できなかった場合は nil を返す 240 241 MAX_NEST_LEVEL = 64 # 簡易のループ検出(参照のネストを 64 まで許可する) 262 242 def elements_eval_const( elements, name_list, name_list2 = nil, nest = nil ) 263 243 … … 266 246 nsp = elements[1] 267 247 268 # #809 ã®ä¿®æ£ããã (å¥ã®åé¡ã解決ãããã¦ããªã) 269 # nest += 1 # åç 270 §ãã«ã¼ãã«ãªã£ã¦ããªããã®ãã§ã㯠271 # # mikan æ¬å½ã«ã«ã¼ããã¦ãããã©ããã§ã¯ãªããåç´ã«å¤æ°ã®åç 272 §ãç¹°ãè¿ãã¦ãããã¨ã§å¤å®ãã¦ãã 248 # #809 の修正しかけ (別の問題が解決しきれていない) 249 # nest += 1 # 参照がループになっていないかのチェック 250 # # mikan 本当にループしているかどうかではなく、単純に多数の参照を繰り返していることで判定している 273 251 # if nest > MAX_NEST_LEVEL then 274 252 # cdl_error( "E9999: '$1' too many reference (maybe loop) max=$1" , nsp.to_s, MAX_NEST_LEVEL ) … … 285 263 end 286 264 287 # è¦ã¤ãããªããã°å®æ°å®ç¾©ããæ¢ã265 # 見つからなければ定数定義から探す 288 266 if object == nil then 289 object = Namespace.find( nsp )# mikan namespace ã®å¯¾å¿ #1 290 end 291 292 # ãã®å®è£ 293 ã¯ãããå°ãæ´çãããã¹ã 294 # ãããå¼åºãããã®ã¯ã以ä¸ã®å ´å 295 # ã»attribute, var ã®å³è¾ºå¼ã®è©ä¾¡ 296 # ã»size_is å¼æ°ã®è©ä¾¡ï¼é¢æ°ãã©ã¡ã¼ã¿ã®å ´åã¨attribute, var ã®å ´åããã 297 # 以ä¸ã®ã¨ã©ã¼ãã§ãã¯ã§ã¯ããããããã£ã¡ãã«ãªã£ã¦èª¤ããæ¤åºãããã¨ãã¦ãã 298 299 # IDENTIFIER ã¯è¦ã¤ãããªãã£ãï¼ 267 object = Namespace.find( nsp )# mikan namespace の対応 #1 268 end 269 270 # この実装は、もう少し整理されるべき 271 # これが呼出されるのは、以下の場合 272 # ・attribute, var の右辺式の評価 273 # ・size_is 引数の評価:関数パラメータの場合とattribute, var の場合がある 274 # 以下のエラーチェックでは、これらがごっちゃになって誤りを検出しようとしている 275 276 # IDENTIFIER は見つからなかった? 300 277 if object == nil then 301 278 cdl_error( "E1001 $1: not found" , nsp.get_path_str ) … … 303 280 return nil 304 281 elsif object.instance_of?( Join ) then 305 # Join ã®å ´åï¼ cell ã®ä¸ã® attribute, var, call ã®ã©ãããè¦ã¤ãã£ã306 # Decl (attribute, var) ã§ãªãï¼282 # Join の場合: cell の中の attribute, var, call のどれかが見つかった 283 # Decl (attribute, var) でない? 307 284 if ! object.get_definition.instance_of?( Decl ) then 308 285 cdl_error( "E1002 $1: not constant (port)" , nsp.get_path_str ) … … 311 288 return object.get_rhs.eval_const2( name_list, name_list2, nest ) 312 289 elsif ! object.instance_of?( Decl ) then 313 # Decl ã§ãªãå ´åï¼ å®æ°ã§ããªã290 # Decl でない場合: 定数でもない 314 291 if ( ! object.instance_of?( ParamDecl ) ) then 315 # mikan paramdecl ã¯ç¡è¦ãã316 # ParamList ããå¼ã°ããã¨ã292 # mikan paramdecl は無視する 293 # ParamList から呼ばれたとき 317 294 cdl_error( "E1003 $1: not constant" , nsp.get_path_str ) 318 295 else … … 324 301 object.referenced 325 302 if object.get_initializer == nil then 326 # åæååã®åå¨ããªãå¤æ° # mikan ããã¸ããã®ã¯ãé常ããããªãã¯ãï¼æªæ¤è¨¼ï¼303 # 初期化子の存在しない変数 # mikan ここへくるのは、通常ありえないはず(未検証) 327 304 return IntegerVal.new( 0 ) 328 305 else 329 # Decl ã®å³è¾ºã®è©ä¾¡330 # mikan size_is å¼æ°ã«ç¾ããå¤æ°ã®åãé©åãã®ãã§ãã¯ãã306 # Decl の右辺の評価 307 # mikan size_is 引数に現れる変数の型が適切かのチェックする 331 308 if object.get_initializer.instance_of?( Expression ) || object.get_initializer.instance_of?( C_EXP ) then 332 309 return object.get_initializer.eval_const2( name_list, name_list2, nest ) 333 310 else 334 # Array ã®å ´å311 # Array の場合 335 312 return object.get_initializer 336 313 end … … 440 417 # p "val.respond_to?( \"-@\" )=#{val.respond_to?( "-@" )} #{val.class}" 441 418 # p "val.respond_to?( \"~@\" )=#{val.respond_to?( "~@" )}" 442 #2.0 if val.respond_to?( "~@" ) then # Ruby 1.9, 2.0 preview çã§ã¯ä¾å¤ãçºçãã¦ãã¾ã419 #2.0 if val.respond_to?( "~@" ) then # Ruby 1.9, 2.0 preview 版では例外が発生してしまう 443 420 if val.kind_of? IntegerVal then 444 421 return ~ val … … 586 563 def elements_get_type( elements, namedList ) 587 564 type = elements_get_type_sub( elements, namedList ) 588 # è¿ãããæ¹ã DefinedType ã®å ´å å 589 ã®åãè¿ã 565 # 返された方が DefinedType の場合 元の型を返す 590 566 if type.kind_of?( DefinedType ) then 591 567 type = type.get_type … … 626 602 unless type.kind_of?( PtrType ) then 627 603 cdl_error( "E1013 \'*\': operand is not pointer value" ) 628 return IntType.new( 8 ) # IntType ãè¿ãã¦ãã604 return IntType.new( 8 ) # IntType を返しておく 629 605 end 630 606 return type.get_referto 631 607 632 608 when :OP_U_PLUS, :OP_U_MINUS 633 # mikan operand ãé©åãªåããã§ãã¯ãã¦ããªã609 # mikan operand が適切な型かチェックしていない 634 610 return elements_get_type( elements[1], namedList ) 635 611 636 612 when :OP_ADD, :OP_SUB, :OP_MULT, :OP_DIV, :OP_REMAIN 637 # mikan operand ãé©åãªåããã§ãã¯ãã¦ããªãï¼å·¦è¾ºã®åãæ¡ç¨ãã¦ãã613 # mikan operand が適切な型かチェックしていない&左辺の型を採用している 638 614 return elements_get_type( elements[1], namedList ) 639 615 640 616 when :OP_U_TILDE 641 # mikan operand ãæ´æ°ããã§ãã¯ãã¦ããªã617 # mikan operand が整数かチェックしていない 642 618 return elements_get_type( elements[1], namedList ) 643 619 when :OP_AND, :OP_EOR, :OP_OR, :OP_LSFT, :OP_RSFT 644 # mikan operand ãæ´æ°ããã§ãã¯ãã¦ããªã620 # mikan operand が整数かチェックしていない 645 621 return BoolType.new 646 622 when :OP_U_EXCLAM 647 # mikan operand ãæ´æ°ããã§ãã¯ãã¦ããªã623 # mikan operand が整数かチェックしていない 648 624 return BoolType.new 649 625 … … 655 631 end 656 632 657 # å¼ã size_is, count_is, string ã®å¼æ°ã§ããå ´åã®æ¹åã®ãã§ãã¯633 # 式が size_is, count_is, string の引数である場合の方向のチェック 658 634 def elements_check_dir_for_param( elements, namedList, dir, spec ) 659 # dir ï¼ å 660 ã®å¼æ°ã®æ¹å 661 # direct: size_is ãªã©ã®å¼æ°ã®å¤æ°ã®æ¹å 635 # dir : 元の引数の方向 636 # direct: size_is などの引数の変数の方向 662 637 663 638 case elements[0] … … 690 665 judge = true if ( direct == :IN || direct == :INOUT ) 691 666 req_direct = "in or inout" 692 when :OUT, :RECEIVE # mikan out 㧠count_is ã®ã¿æå®ããã¦ããå ´å in ã§ãªãã¦ã¯ãªããªã667 when :OUT, :RECEIVE # mikan out で count_is のみ指定されている場合 in でなくてはならない 693 668 judge = true if ( direct == :OUT || direct == :INOUT ) 694 669 req_direct = "out or inout" … … 706 681 return true 707 682 708 # åé 709 æ¼ç®å 683 # 単項演算子 710 684 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, 711 685 elements_check_dir_for_param( elements[1], namedList, dir, spec ) 712 686 713 # 2é 714 æ¼ç®å 687 # 2項演算子 715 688 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 716 689 return elements_check_dir_for_param( elements[1], namedList, dir, spec ) && elements_check_dir_for_param( elements[2], namedList, dir, spec ) 717 690 718 # 3é 719 æ¼ç®å 691 # 3項演算子 720 692 when :OP_CEX 721 693 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 ) … … 729 701 #Express# get_allocator_rhs_elem 730 702 #alloc_type::Symbol :NORMAL_ALLOC|:INTERNAL_ALLOC|:RELAY_ALLOC 731 # å¼ãã¢ãã±ã¼ã¿æå®åã®å³è¾ºã¨ãã¦å¦¥å½ããã§ãã¯ããæ£ãããã°å解ããå¤ãè¿ã703 #式がアロケータ指定子の右辺として妥当かチェックし、正しければ分解した値を返す 732 704 #return: 733 705 # :NORMAL_ALLOC [ cell_nsp, ep_name ] # rhs = cell_nsp.ep_name ex) Alloc.eAlloc … … 767 739 end 768 740 769 #Expression#Expression ã®ã¯ãã¼ã³ãä½æãã741 #Expression#Expression のクローンを作成する 770 742 def clone_for_composite 771 743 cl = self.clone … … 775 747 end 776 748 777 #Expression#elements ã®ã¯ãã¼ã³ãä½æ749 #Expression#elements のクローンを作成 778 750 #elements::Array 779 # ãã®ã¡ã½ããã¯ãArray ã®ãã£ã¼ãã³ãã¼ãè¡ã751 # このメソッドは、Array のディープコピーを行う 780 752 def clone_elements elements 781 753 elements = elements.clone … … 794 766 end 795 767 796 #=== Expression# ã»ã«çµåã®å¼ã解æãã768 #=== Expression#セル結合の式を解析する 797 769 # Cell.eEntry => [ :OP_DOT, [ :IDENTIFIER, token ], token ] 798 770 # Cell.eEntry[expression] => [ :OP_SUBSC, [ :OP_DOT, [ :IDENTIFIER, token ], token ], expression ] 799 771 # Return: [ NamespacePath(cell_name), Integer(subscript) or nil, Token(port_name)] 800 772 def analyze_cell_join_expression 801 # å³è¾ºã® Expression ã®è¦ç´ ãåãåºã773 # 右辺の Expression の要素を取り出す 802 774 elements = @elements 803 if elements[0] == :OP_SUBSC then # å³è¾ºï¼åãå£é 804 åï¼ 775 if elements[0] == :OP_SUBSC then # 右辺:受け口配列? 805 776 # elements = [ :OP_SUBSC, [ :OP_DOT, [ :IDENTIFIER, token ], token ], expression ] 806 subscript = elements[2].eval_const(nil) # åãå£é 807 åã®æ·»æ° 808 elements = elements[1] # mikan é 809 åã ã£ãå ´å 777 subscript = elements[2].eval_const(nil) # 受け口配列の添数 778 elements = elements[1] # mikan 配列だった場合 810 779 else 811 780 subscript = nil … … 823 792 end 824 793 825 #=== Expression# ã»ã«ã¸ã®çµåã®å¼ãçæãã794 #=== Expression# セルへの結合の式を生成する 826 795 #nsp:: NamespacePath 827 796 #subscript:: Integer 828 797 #port_name:: Symbol 829 # analyze_cell_join_expression ã¨å¯¾ã«ãªã£ã¦ãã798 # analyze_cell_join_expression と対になっている 830 799 def self.create_cell_join_expression( nsp, subscript, port_name, locale = nil ) 831 800 if ! port_name.instance_of?( Symbol ) then … … 843 812 end 844 813 845 #=== Expression# æ´æ°å®æ°ã®å¼ãçæãã846 #val:: Integer : å¤ï¼ æ´æ°814 #=== Expression#整数定数の式を生成する 815 #val:: Integer : 値: 整数 847 816 def self.create_integer_constant( val, locale = nil ) 848 817 if val != Integer( val ) || val < 0 then … … 852 821 end 853 822 854 #=== Expression# åä¸ã®èå¥åã®å¼ã解æãã823 #=== Expression#単一の識別子の式を解析する 855 824 # Identifier => [ :IDENTIFIER, token ] 856 825 # Return: NamespacePath(Identifier) 857 826 def analyze_single_identifier 858 # å³è¾ºã® Expression ã®è¦ç´ ãåãåºã827 # 右辺の Expression の要素を取り出す 859 828 elements = @elements 860 829 if elements[0] == :IDENTIFIER … … 866 835 867 836 #=== Expression# 868 #nsp:: NamespacePath : åç 869 §ãããã®èå¥å 837 #nsp:: NamespacePath : 参照するもの識別子 870 838 def self.create_single_identifier( nsp, locale ) 871 839 if ! nsp.instance_of?( NamespacePath ) then … … 875 843 end 876 844 877 #=== è©ä¾¡å¯è½ããã§ãã¯ãã878 #*v:: å¯å¤åå¼æ°ï¼ä»»æã®åï¼879 # ãã¹ã¦ã BaseVal ã®åã¯ã©ã¹ï¼å¤ï¼ã§ããã°ãè©ä¾¡å¯è½ã¨å¤æãã845 #=== 評価可能かチェックする 846 #*v:: 可変個引数(任意の型) 847 # すべてが BaseVal の子クラス(値)であれば、評価可能と判断する 880 848 def evaluable?( *v ) 881 849 v.each{ |val| … … 896 864 897 865 #c_exp_string::String 898 #b_renew::Bool : true ãªã C_EXP ã® clone ä½æï¼ã¨ã¹ã±ã¼ãå¦ççãããªãï¼866 #b_renew::Bool : true なら C_EXP の clone 作成(エスケープ処理等をしない) 899 867 def initialize( c_exp_string, b_renew = false ) 900 868 if b_renew then 901 869 @c_exp_string = c_exp_string 902 870 else 903 # åå¾ã® " ãåãé¤ã871 # 前後の " を取り除く 904 872 # str = c_exp_string.to_s.sub( /^\"(.*)\"$/, "\\1" ) 905 873 str = CDLString.remove_dquote c_exp_string.to_s … … 908 876 end 909 877 910 #=== composite ç¨ã« C_EXP ã clone ãã878 #=== composite 用に C_EXP を clone する 911 879 #ct_name:: 912 880 #cell_name:: 913 # composite ã® attribute ã«ç¾ãã C_EXP ãæååç½®æãã¦çæããªããï¼914 # ãã®æååç½®æã¯ãæå³è§£é段éã§è¡ãï¼915 # ä»ã® C_EXP ã®æååç½®æã¯ãã³ã¼ãçæ段éã§è¡ãï¼881 # composite の attribute に現れる C_EXP を文字列置換して生成しなおす. 882 # この文字列置換は、意味解釈段階で行う. 883 # 他の C_EXP の文字列置換は、コード生成段階で行う. 916 884 def clone_for_composite( ct_name, cell_name, locale ) 917 885 dbgPrint "C_EXP: #{ct_name} #{cell_name} #{@c_exp_string}\n" … … 928 896 end 929 897 930 #=== C_EXP ãè©ä¾¡ãã931 # C_EXP ã®å¼ãæ°æååãè¿ã932 # æ¬æ¥ C_EXP 㯠eval_const ãã対象ã§ã¯ãªããã便å®ä¸ eval_const ã§å¯¾å¿898 #=== C_EXP を評価する 899 # C_EXP の引き数文字列を返す 900 # 本来 C_EXP は eval_const する対象ではないが、便宜上 eval_const で対応 933 901 def eval_const( name_list, name_list2 = nil ) 934 902 return self -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.