- Timestamp:
- Aug 23, 2017, 9:27:43 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/syntaxobj.rb
-
Property svn:mime-type
changed from
text/x-ruby
totext/x-ruby;charset=UTF-8
r270 r321 6 6 # Copyright (C) 2008-2016 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 : syntaxobj.rb 1011 2016-07-11 02:20:01Z coas-nagasima$37 # $Id$ 53 38 #++ 54 39 55 # mikan ruby ã® symbol ã¨æååã®ä½¿ãåããã©ããã¦ããã¾ããããªããã¨ãæã 56 ããã®ã§ name.to_sym ãå 57 ¥ãããã¨ã«ãã 40 # mikan ruby の symbol と文字列の使い分けがどうしてもうまくいかないことが時々あるので name.to_sym を入れることにした 58 41 59 42 #== Node 60 43 # 61 # Node ã®ç´æ¥ã®åã¯ã©ã¹ï¼ C_EXP, Type, BaseVal, BDNode(ã»ã¨ãã©ã®ãã®ã¯ BDNode ã®åã¯ã©ã¹) 62 # Node ã« (BDNodeã«ã) å 63 ¥ããªããã®: Token, Import, Import_C, Generate 44 # Node の直接の子クラス: C_EXP, Type, BaseVal, BDNode(ほとんどのものは BDNode の子クラス) 45 # Node に (BDNodeにも) 入らないもの: Token, Import, Import_C, Generate 64 46 # 65 # owner ãæããªããã®ã Node ã¨ãªã66 # ã¨ã©ã¼ã¯ãcdl_error ãéãã¦å ±åãã (æå³è§£æãæ§æ解æå¾ã«è¡ãããå ´åã«ã¯ãè¡çªå·ãæ£ããåºåã§ãã47 # owner を持たないものが Node となる 48 # エラーは、cdl_error を通じて報告する (意味解析が構文解析後に行われる場合には、行番号が正しく出力できる 67 49 # 68 50 … … 74 56 end 75 57 76 #=== ã¨ã©ã¼ãåºåãã58 #=== エラーを出力する 77 59 def cdl_error( message, *arg ) 78 60 Generator.error2( @locale, message, *arg ) 79 61 end 80 62 81 #=== ã¨ã©ã¼ãåºåãã82 #locale:: Array(locale info) : æ§æ解æä¸ã¯ç¡è¦ããã63 #=== エラーを出力する 64 #locale:: Array(locale info) : 構文解析中は無視される 83 65 def cdl_error2( locale, message, *arg ) 84 66 Generator.error2( locale, message, *arg ) 85 67 end 86 68 87 #=== ã¨ã©ã¼ãåºåãã69 #=== エラーを出力する 88 70 #locale:: Array(locale info) 89 # æ§æ解æä¸ cdl_error2 ã§ã¯ locale ãç¡è¦ããããããå¥ã« locale ãåºåãã71 # 構文解析中 cdl_error2 では locale が無視されるため、別に locale を出力する 90 72 def cdl_error3( locale, message, *arg ) 91 73 Generator.error( message, *arg ) … … 93 75 end 94 76 95 #=== ã¦ã©ã¼ãã³ã°åºåãã77 #=== ウォーニング出力する 96 78 def cdl_warning( message, *arg ) 97 79 Generator.warning2( @locale, message, *arg ) 98 80 end 99 81 100 #=== ã¦ã©ã¼ãã³ã°åºåãã82 #=== ウォーニング出力する 101 83 def cdl_warning2( locale, message, *arg ) 102 84 Generator.warning2( locale, message, *arg ) 103 85 end 104 86 105 #=== æ 106 å ±ã表示ãã 87 #=== 情報を表示する 107 88 def cdl_info( message ) 108 89 Console.puts "info: #{message}" … … 122 103 end 123 104 124 #== åæ¹åNode (Bi Direction Node)105 #== 双方向 Node (Bi Direction Node) 125 106 # 126 # Node ã®åã¯ã©ã¹ 127 # owner Node ããåç 128 §ããã¦ãããã® (owner ã¸ã®ãªã³ã¯ãåãåºãã) 107 # Node の子クラス 108 # owner Node から参照されているもの (owner へのリンクも取り出せる) 129 109 # 130 # get_owner ã§å¾ããããã®110 # get_owner で得られるもの 131 111 # FuncHead => Signature 132 112 # Decl => Namespace(const), Typedef(typedef), … … 134 114 # Struct(member), ParamDecl(parameter), FuncHead(funchead) 135 115 # Signature, Celltype, CompositeCelltype, Typedef => Namespace 136 #, Namespace => Namespace, Generator.class (root Namespace ã®å ´å)116 #, Namespace => Namespace, Generator.class (root Namespace の場合) 137 117 # Cell => Region, CompositeCelltype(in_composite) 138 118 # Port => Celltype, Composite … … 144 124 # ParamList => FuncHead 145 125 # Expression => Namespace 146 # 大åã®ãã®ã¯ new_* ã¡ã½ãã㧠owner Node ã«ä¼éããã147 # ãã®ã¡ã½ãããå¼ã³åºãããã¨ãã« owner Node ãè¨é²ããã148 # new_* ããªããã®ï¼126 # 大半のものは new_* メソッドで owner Node に伝達される 127 # そのメソッドが呼び出されたときに owner Node が記録される 128 # new_* がないもの: 149 129 # Decl(parameter), ParamDecl, ParamList, FuncHead, Expression 150 130 # 151 # Expression ã¯ãowner Node ã¨ãªããã®ãå¤ãããããæ¹é ãå°é£ã§ãããã152 # Expression ãå®ç¾©ãããã¨ãã® Namespace ã owner Node ã¨ãã153 # StructType 㯠Type ã®ä¸ç¨®ãªã®ã§ owner ãæããªã131 # Expression は、owner Node となるものが多くあるが、改造が困難であるため 132 # Expression が定義されたときの Namespace を owner Node とする 133 # StructType は Type の一種なので owner を持たない 154 134 # 155 135 class BDNode < Node … … 167 147 end 168 148 169 #=== owner ãè¨å®ãã149 #=== owner を設定する 170 150 def set_owner owner 171 151 dbgPrint "set_owner: #{owner.class.name}\n" … … 173 153 end 174 154 175 #=== owner ãå¾ã 176 # class ã®èª¬æãåç 177 § 155 #=== owner を得る 156 # class の説明を参照 178 157 def get_owner 179 158 if @owner == nil … … 184 163 end 185 164 186 #== Namespace åãæã¤BDNode165 #== Namespace 名を持つ BDNode 187 166 # Namespace(Region), Signature, Celltype, CompositeCelltype, Cell 188 167 class NSBDNode < BDNode … … 192 171 end 193 172 194 #=== å±ãã namespace ãå¾ã195 # owner ã namespace ã«ãã©ãçãã¾ã§ä¸ã«ãã©ã173 #=== 属する namespace を得る 174 # owner を namespace にたどり着くまで上にたどる 196 175 def get_namespace 197 176 if @owner.kind_of? Namespace … … 200 179 return @owner.get_namespace 201 180 else 202 # @owner == nil ãªã"::"181 # @owner == nil なら "::" 203 182 if @name != "::" then 204 183 raise "non-root namespace has no owner #{self.class.name}##{@name} #{self}" … … 217 196 end 218 197 219 #=== NamespacePath ãå¾ã198 #=== NamespacePath を得る 220 199 def get_namespace_path 221 200 return @NamespacePath … … 226 205 return @import.is_imported? 227 206 else 228 return false # mikan: ä»® @import ã nil ã«ãªãã±ã¼ã¹ã追æ±ã§ãã¦ããªã207 return false # mikan: 仮 @import が nil になるケースが追求できていない 229 208 end 230 209 end … … 233 212 class NamedList 234 213 # @names:: {} of items 235 # @items:: [] of items : item ã® CLASS 㯠get_name ã¡ã½ãããæã¤ã㨠get_name ã®æ»ãå¤ã¯ Symbol ã§ãªãã¦ã¯ãªããªã 236 # NamedList ã clone_for_composite ããå ´åã¯ãitem ã«ãã¡ã½ãããå¿ 237 è¦ 238 # @type:: string ã¨ã©ã¼ã¡ãã»ã¼ã¸ 214 # @items:: [] of items : item の CLASS は get_name メソッドを持つこと get_name の戻り値は Symbol でなくてはならない 215 # NamedList を clone_for_composite する場合は、item にもメソッドが必要 216 # @type:: string エラーメッセージ 239 217 240 218 def initialize( item, type ) … … 245 223 end 246 224 247 #=== è¦ç´ ãå ãã248 # parse ããæç¹ã§å ãããã¨(å ´æãè¨æ¶ãã)225 #=== 要素を加える 226 # parse した時点で加えること(場所を記憶する) 249 227 def add_item( item ) 250 228 … … 305 283 end 306 284 307 #=== composite cell ã clone ããæã«è¦ç´ (JOIN) ã® clone ãã285 #=== composite cell を clone した時に要素(JOIN) の clone する 308 286 # 309 # mikan ãã®ã¡ã½ãã㯠Join ã«ç¹åããã¦ããã®ã§ NamedList ããåé¢ãã¹ã287 # mikan このメソッドは Join に特化されているので NamedList から分離すべき 310 288 def clone_for_composite( ct_name, cell_name, locale ) 311 289 cl = self.clone … … 314 292 end 315 293 316 #=== clone ããã NamedList ã¤ã³ã¹ã¿ã³ã¹ã®åç 317 §ãããã®(item)ã clone 294 #=== clone された NamedList インスタンスの参照するもの(item)を clone 318 295 # 319 # mikan ãã®ã¡ã½ãã㯠Join ã«ç¹åããã¦ããã®ã§ NamedList ããåé¢ãã¹ã296 # mikan このメソッドは Join に特化されているので NamedList から分離すべき 320 297 def set_cloned( ct_name, cell_name, locale ) 321 298 items = [] … … 379 356 end 380 357 381 #== é¢æ°é é¨382 # signature ã«ç»é²ãããé¢æ°358 #== 関数頭部 359 # signature に登録される関数 383 360 class FuncHead <BDNode 384 361 # @declarator:: Decl … … 425 402 end 426 403 427 #=== FuncHead# é¢æ°ã®ååãè¿ã404 #=== FuncHead# 関数の名前を返す 428 405 def get_name 429 406 return @declarator.get_name 430 407 end 431 408 432 #=== FuncHead# é¢æ°ã®æ»ãå¤ã®åãè¿ã 433 # types.rb ã«å®ç¾©ããã¦ããå 434 # é¢æ°ãããã®å®ç¾©ã¨ãã¦ä¸å®å 435 ¨ãªå ´å nil ãè¿ã 409 #=== FuncHead# 関数の戻り値の型を返す 410 # types.rb に定義されている型 411 # 関数ヘッダの定義として不完全な場合 nil を返す 436 412 def get_return_type 437 413 if is_function? then … … 440 416 end 441 417 442 #=== FuncHead# é¢æ°ã®å¼æ°ã®ãªã¹ããè¿ã 443 # ParamList ãè¿ã 444 # é¢æ°ãããã®å®ç¾©ã¨ãã¦ä¸å®å 445 ¨ãªå ´å nil ãè¿ã 418 #=== FuncHead# 関数の引数のリストを返す 419 # ParamList を返す 420 # 関数ヘッダの定義として不完全な場合 nil を返す 446 421 def get_paramlist 447 422 if is_function? then … … 457 432 end 458 433 459 #=== 宣è¨460 # @kind ã§ç¤ºãããå種ã®å®£è¨434 #=== 宣言 435 # @kind で示される各種の宣言 461 436 class Decl < BDNode 462 437 463 438 # @identifer:: String 464 # @global_name:: String | nil : String(@kind=TYPEDEF||:CONSTANT), nil(@kind= ãã®ä»)465 # set_kind ã«ã¦è¨å®ããã439 # @global_name:: String | nil : String(@kind=TYPEDEF||:CONSTANT), nil(@kind=その他) 440 # set_kind にて設定される 466 441 # @type:: ArrayType, FuncType, PtrType, IntType, StructType 467 442 # VoidType, FloatType, DefinedType, BoolType 468 443 # @initializer:: constant_expression, mikan { initlist } 469 # @kind:: :VAR, :ATTRIBUTE, :PARAMETER, :TYPEDEF, :CONSTANT, :MEMBER, :FUNCHEAD(signature ã®é¢æ°å®ç¾©)444 # @kind:: :VAR, :ATTRIBUTE, :PARAMETER, :TYPEDEF, :CONSTANT, :MEMBER, :FUNCHEAD(signatureの関数定義) 470 445 # @b_referenced:: bool 471 446 # 472 # 以ä¸ã¯ã@kind ã :VAR, :ATTRIBUTE ã®ã¨ãã«æå¹ 473 # @rw:: bool # å¤ãææ³ã§ã¯ attr ã«æå®å¯è½ã ã£ãï¼æ¶ãã«ã¯ generate ã®ä¿®æ£ãå¿ 474 è¦ï¼ 447 # 以下は、@kind が :VAR, :ATTRIBUTE のときに有効 448 # @rw:: bool # 古い文法では attr に指定可能だった(消すには generate の修正も必要) 475 449 # @omit:: bool 476 # @choice_list:: [String] attr åæå¤ã®é¸æè¢477 # 以ä¸ã¯ã@kind ã :VAR, :ATTRIBUTE, :MEMBER ã®ã¨ãã«æå¹450 # @choice_list:: [String] attr 初期値の選択肢 451 # 以下は、@kind が :VAR, :ATTRIBUTE, :MEMBER のときに有効 478 452 # @size_is:: Expression or nil unless specified 479 # 以ä¸ã¯ã@kind ã :MEMBER ã®ã¨ãã«æå¹453 # 以下は、@kind が :MEMBER のときに有効 480 454 # @count_is:: Expression or nil unless specified 481 # attr, var ã®å ´åãcount_is ã¯æå®ã§ããªã455 # attr, var の場合、count_is は指定できない 482 456 # @string:: Expression, -1 (length not specified) or nil (not specified) 483 457 # 484 # mikan ParamDecl ã ãå¥ã«è¨ããããMemberDecl, AttrDecl ãªã©ãåããã¹ãã(ï¼)458 # mikan ParamDecl だけ別に設けたが、MemberDecl, AttrDecl なども分けるべきか(?) 485 459 486 460 def initialize( identifier ) … … 512 486 end 513 487 514 #== Decl ã®æå³ç誤ãããã§ãã¯ãã488 #== Decl の意味的誤りをチェックする 515 489 def check 516 490 # return nil if @type == nil 517 491 518 # æ§é ä½ã¿ã°ãã§ãã¯ï¼ãã¤ã³ã¿åããæ§é ä½ãåç 519 §ããã¦ããå ´åã¯ãã¿ã°ã®åå¨ããã§ãã¯ããªãï¼ 492 # 構造体タグチェック(ポインタ型から構造体が参照されている場合は、タグの存在をチェックしない) 520 493 @type.check_struct_tag @kind 521 494 522 # åã®ãã§ãã¯ãè¡ã495 # 型のチェックを行う 523 496 res = @type.check 524 497 if res then … … 526 499 end 527 500 528 # ä¸è¦ã®åæååããã§ãã¯ãã501 # 不要の初期化子をチェックする 529 502 if @initializer then 530 503 case @kind … … 532 505 cdl_error( "S2003 $1: $2 cannot have initializer" , @identifier, @kind.to_s.downcase ) 533 506 when :VAR, :ATTRIBUTE, :CONSTANT 534 # p @initializer ããã§ã¯ä»£å 535 ¥å¯è½ãã©ããããã§ãã¯ããªã 536 # :VAR, :ATTRIBUTE, :CONSTANT ã¯ããããã§ãã§ãã¯ãã 507 # p @initializer ここでは代入可能かどうか、チェックしない 508 # :VAR, :ATTRIBUTE, :CONSTANT はそれぞれでチェックする 537 509 # return @type.check_init( @identifier, @initializer, @kind ) 538 510 else … … 552 524 end 553 525 554 #== ãã¤ã³ã¿ã¬ãã«ãå¾ã555 # æ»ãå¤ï¼556 # éãã¤ã³ã¿å¤æ°= 0557 # ãã¤ã³ã¿å¤æ°= 1558 # äºéãã¤ã³ã¿å¤æ°= 2526 #== ポインタレベルを得る 527 # 戻り値: 528 # 非ポインタ変数 = 0 529 # ポインタ変数 = 1 530 # 二重ポインタ変数 = 2 559 531 def get_ptr_level 560 532 level = 0 … … 564 536 level += 1 565 537 type = type.get_referto 566 # elsif type.kind_of?( ArrayType ) then # æ·»æ°ãªãé 567 åã¯ãã¤ã³ã¿ã¨ã¿ãªã 538 # elsif type.kind_of?( ArrayType ) then # 添数なし配列はポインタとみなす 568 539 # if type.get_subscript == nil then 569 540 # level += 1 … … 572 543 # break 573 544 # end 574 # mikan ãã¤ã³ã¿ã®æ·»æ°ããé 575 åã®ãã¤ã³ã¿ã¬ãã«ã¯ï¼ã§ããï¼ 545 # mikan ポインタの添数あり配列のポインタレベルは0でよい? 576 546 elsif type.kind_of?( DefinedType ) then 577 547 type = type.get_type … … 596 566 @type = type 597 567 else 598 @type.set_type( type ) # èã«è¨å®568 @type.set_type( type ) # 葉に設定 599 569 end 600 570 end … … 731 701 end 732 702 733 # é¢æ°ãã©ã¡ã¼ã¿ã®å®£è¨703 # 関数パラメータの宣言 734 704 class ParamDecl < BDNode 735 705 736 706 # @declarator:: Decl: Token, ArrayType, FuncType, PtrType 737 707 # @direction:: :IN, :OUT, :INOUT, :SEND, :RECEIVE 738 # @size:: Expr (size_is å¼æ°)739 # @count:: Expr (count_is å¼æ°)740 # @max:: Expr (size_is ã®ç¬¬äºå¼æ°)708 # @size:: Expr (size_is 引数) 709 # @count:: Expr (count_is 引数) 710 # @max:: Expr (size_is の第二引数) 741 711 # @b_nullable:: Bool : nullable 742 # @string:: Expr or -1(if size not specified) ï¼string å¼æ°ï¼712 # @string:: Expr or -1(if size not specified) (string 引数) 743 713 # @allocator:: Signature of allocator 744 # @b_ref:: bool : size_is, count_is, string_is å¼æ°ã¨ãã¦åç 745 §ããã¦ãã 714 # @b_ref:: bool : size_is, count_is, string_is 引数として参照されている 746 715 # 747 # 1. é¢æ°åã§ãªãã㨠748 # 2. ï¼æ¬¡å 749 以ä¸ã®é 750 åã§ãã£ã¦æãå 751 å´ä»¥å¤ã®æ·»æ°ãããã㨠752 # 3. in, out, ..., size_is, count_is, ... ã®éè¤æå®ããªãã㨠753 # 4. ãã¤ã³ã¿ã¬ãã«ãé©åãªã㨠716 # 1. 関数型でないこと 717 # 2. 2次元以上の配列であって最も内側以外の添数があること 718 # 3. in, out, ..., size_is, count_is, ... の重複指定がないこと 719 # 4. ポインタレベルが適切なこと 754 720 755 721 def initialize( declarator, specifier, param_specifier ) … … 818 784 end 819 785 when :MAX_IS 820 # max_is ã¯ãå 821 é¨çãªãã® bnf.y.rb åç 822 § 823 # size_is ã§éè¤ãã§ãã¯ããã 786 # max_is は、内部的なもの bnf.y.rb 参照 787 # size_is で重複チェックされる 824 788 @max = i[1] 825 789 when :NULLABLE … … 841 805 end 842 806 843 # mikan ãã¤ã³ã¿ã®é 844 åï¼æ·»æ°æï¼ã®ã¬ãã«ãï¼ 807 # mikan ポインタの配列(添数有)のレベルが0 845 808 ptr_level = @declarator.get_ptr_level 846 809 … … 885 848 cdl_error( "S2014 $1 need pointer or more pointer" , @declarator.get_identifier ) 886 849 elsif ptr_level > max_level then 887 # note: æ§æ解æ段éã§å®è¡ã®ãã get_current å¯850 # note: 構文解析段階で実行のため get_current 可 888 851 if Signature.get_current == nil || Signature.get_current.is_deviate? == false then 889 852 cdl_warning( "W3003 $1 pointer level mismatch" , @declarator.get_identifier ) … … 897 860 898 861 if ptr_level > 0 then 899 # size_is, count_is, string ãã»ãã862 # size_is, count_is, string をセット 900 863 if @direction == :RECEIVE && ptr_level > 1 then 901 864 type.get_type.set_scs( @size, @count, @string, @max, @b_nullable ) … … 907 870 #type.show_tree 1 908 871 909 # ãã¤ã³ã¿ãæãã¦ããå 910 ã®ãã¼ã¿åãå¾ã 872 # ポインタが指している先のデータ型を得る 911 873 i = 0 912 874 t2 = type … … 923 885 # p t2.is_const? 924 886 925 # const 修飾ãé©åããã§ãã¯887 # const 修飾が適切かチェック 926 888 if @direction == :IN then 927 889 if ! t2.is_const? then … … 934 896 end 935 897 else 936 # éãã¤ã³ã¿ã¿ã¤ã898 # 非ポインタタイプ 937 899 if @size != nil || @count != nil || @string != nil || @max != nil || @b_nullable then 938 900 type.set_scs( @size, @count, @string, @max, @b_nullable ) … … 1006 968 end 1007 969 1008 #=== PPAllocator ãå¿ 1009 è¦ã 1010 # Transparent RPC ã®å ´å in 㧠size_is, count_is, string ã®ãããããæå®ããã¦ããå ´å oneway ã§ã¯ PPAllocator ãå¿ 1011 è¦ 1012 # Transparent PC 㧠oneway ãã©ããã¯ãããã§ã¯å¤æããªãã®ã§å¥éå¤æãå¿ 1013 è¦ 1014 # Opaque RPC ã®å ´å size_is, count_is, string ã®ãããããæå®ããã¦ããå ´åãPPAllocator ãå¿ 1015 è¦ 970 #=== PPAllocator が必要か 971 # Transparent RPC の場合 in で size_is, count_is, string のいずれかが指定されている場合 oneway では PPAllocator が必要 972 # Transparent PC で oneway かどうかは、ここでは判断しないので別途判断が必要 973 # Opaque RPC の場合 size_is, count_is, string のいずれかが指定されている場合、PPAllocator が必要 1016 974 def need_PPAllocator?( b_opaque = false ) 1017 975 if ! b_opaque then … … 1060 1018 end 1061 1019 1062 # é¢æ°ãã©ã¡ã¼ã¿ãªã¹ã1020 # 関数パラメータリスト 1063 1021 class ParamList < BDNode 1064 1022 # @param_list:: NamedList : item: ParamDecl … … 1073 1031 1074 1032 def add_param( paramdecl ) 1075 return if paramdecl == nil # æ¢ã«ã¨ã©ã¼1033 return if paramdecl == nil # 既にエラー 1076 1034 1077 1035 @param_list.add_item( paramdecl ) … … 1083 1041 end 1084 1042 1085 #=== size_is, count_is, string ã®å¼æ°ã®å¼ããã§ã㯠1086 # å¤æ°ã¯åæ¹åç 1087 §å¯è½ãªãããé¢æ°é é¨ã®æ§æ解éãçµãã£ãå¾ã«ãã§ãã¯ãã 1043 #=== size_is, count_is, string の引数の式をチェック 1044 # 変数は前方参照可能なため、関数頭部の構文解釈が終わった後にチェックする 1088 1045 def check_param 1089 1046 @param_list.get_items.each { |i| 1090 next if i == nil # i == nil : ã¨ã©ã¼æ1047 next if i == nil # i == nil : エラー時 1091 1048 1092 1049 if i.get_type.class == VoidType then 1093 # åä¸ã® void åã¯ããã«ã¯ããªã1050 # 単一の void 型はここにはこない 1094 1051 cdl_error( "S2027 '$1' parameter cannot be void type", i.get_name ) 1095 1052 end … … 1098 1055 if size then 1099 1056 val = size.eval_const( @param_list ) 1100 if val == nil then # å®æ°å¼ã§ãªããï¼1101 # mikan å¤æ°ãå«ãå¼ï¼åä¸ã®å¤æ°ã®ã¿OK1057 if val == nil then # 定数式でないか? 1058 # mikan 変数を含む式:単一の変数のみ OK 1102 1059 type = size.get_type( @param_list ) 1103 1060 unless type.kind_of?( IntType ) then … … 1137 1094 if count then 1138 1095 val = count.eval_const( @param_list ) 1139 if val == nil then # å®æ°å¼ã§ãªããï¼1140 # mikan å¤æ°ãå«ãå¼ï¼åä¸ã®å¤æ°ã®ã¿OK1096 if val == nil then # 定数式でないか? 1097 # mikan 変数を含む式:単一の変数のみ OK 1141 1098 type = count.get_type( @param_list ) 1142 1099 unless type.kind_of?( IntType ) then … … 1157 1114 if string != -1 && string then 1158 1115 val = string.eval_const( @param_list ) 1159 if val == nil then # å®æ°å¼ã§ãªããï¼1160 # mikan å¤æ°ãå«ãå¼ï¼åä¸ã®å¤æ°ã®ã¿OK1116 if val == nil then # 定数式でないか? 1117 # mikan 変数を含む式:単一の変数のみ OK 1161 1118 type = string.get_type( @param_list ) 1162 1119 unless type.kind_of?( IntType ) then … … 1182 1139 end 1183 1140 1184 #=== Push Pop Allocator ãå¿ 1185 è¦ãï¼ 1186 # Transparent RPC ã®å ´å (oneway ãã¤) in ã®é 1187 å(size_is, count_is, string ã®ããããã§ä¿®é£¾ï¼ããã 1141 #=== Push Pop Allocator が必要か? 1142 # Transparent RPC の場合 (oneway かつ) in の配列(size_is, count_is, string のいずれかで修飾)がある 1188 1143 def need_PPAllocator?( b_opaque = false ) 1189 1144 @param_list.get_items.each { |i| … … 1199 1154 end 1200 1155 1201 #== ParamList# æååå1202 #b_name:: Bool: ãã©ã¡ã¼ã¿åãå«ãã1156 #== ParamList# 文字列化 1157 #b_name:: Bool: パラメータ名を含める 1203 1158 def to_str( b_name ) 1204 1159 str = "(" … … 1223 1178 end 1224 1179 1225 #== CDL ã®æååãªãã©ã«ãæ±ãããã®ã¯ã©ã¹1226 # CDL ã®æååãªãã©ã«ãã®ãã®ã§ã¯ãªã1180 #== CDL の文字列リテラルを扱うためのクラス 1181 # CDL の文字列リテラルそのものではない 1227 1182 class CDLString 1228 # ã¨ã¹ã±ã¼ãæåãå¤æ1183 # エスケープ文字を変換 1229 1184 def self.escape str 1230 1185 str = str.dup … … 1238 1193 str.gsub!( /(\\[Xx][0-9A-Fa-f]{1,2})/, '{printf \"\\1\"}' ) 1239 1194 str.gsub!( /(\\[0-7]{1,3})/, '{printf \"\\1\"}' ) 1240 str.gsub!( /\\(.)/, "\\1" ) # mikan æªå®ç¾©ã®ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ãå¤æãã¦ãã¾ã (gcc V3.4.4 ã§ã¯è¦åãåºããã)1195 str.gsub!( /\\(.)/, "\\1" ) # mikan 未定義のエスケープシーケンスを変換してしまう (gcc V3.4.4 では警告が出される) 1241 1196 return str 1242 1197 end 1243 1198 1244 #=== CDLString# åå¾ã® " ãåãé¤ã1199 #=== CDLString#前後の " を取り除く 1245 1200 def self.remove_dquote str 1246 1201 s = str.sub( /\A"/, "" ) … … 1250 1205 end 1251 1206 1252 #== CDL ã®åæååãæ±ãããã®ã¯ã©ã¹1253 # CDL ã®åæååãã®ãã®ã§ã¯ãªã1207 #== CDL の初期化子を扱うためのクラス 1208 # CDL の初期化子そのものではない 1254 1209 class CDLInitializer 1255 #=== åæååã®ã¯ãã¼ã³1256 # åæåå㯠Expression, C_EXP, Array ã®ãããã1210 #=== 初期化子のクローン 1211 # 初期化子は Expression, C_EXP, Array のいずれか 1257 1212 def self.clone_for_composite( rhs, ct_name, cell_name, locale ) 1258 1213 if rhs.instance_of? C_EXP then 1259 # C_EXP ã® clone ãä½ãã¨ã¨ãã«ç½®æ1214 # C_EXP の clone を作るとともに置換 1260 1215 rhs = rhs.clone_for_composite( ct_name, cell_name, locale ) 1261 1216 elsif rhs.instance_of? Expression then … … 1269 1224 end 1270 1225 1271 #=== åæååï¼é 1272 åï¼ã®ã¯ãã¼ã³ 1273 # è¦ç´ 㯠clone_for_composite ãæã¤ãã®ã ã 1226 #=== 初期化子(配列)のクローン 1227 # 要素は clone_for_composite を持つものだけ 1274 1228 def self.clone_for_compoiste_array( array, ct_name, cell_name, locale ) 1275 # "compoiste.identifier" ã®å ´å (CDL ã¨ãã¦ã¯èª¤ã)1229 # "compoiste.identifier" の場合 (CDL としては誤り) 1276 1230 if array[0] == :COMPOSITE then 1277 1231 return array.clone -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.