- 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/syntaxobj.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 # 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, *arg ) 108 89 Generator.info2( @locale, message, *arg ) 109 90 end 110 91 111 #=== æ 112 å ±ã表示ãã 92 #=== 情報を表示する 113 93 def cdl_info2( locale, message, *arg ) 114 94 Generator.info2( locale, message, *arg ) … … 128 108 end 129 109 130 #== åæ¹åNode (Bi Direction Node)110 #== 双方向 Node (Bi Direction Node) 131 111 # 132 # Node ã®åã¯ã©ã¹ 133 # owner Node ããåç 134 §ããã¦ãããã® (owner ã¸ã®ãªã³ã¯ãåãåºãã) 112 # Node の子クラス 113 # owner Node から参照されているもの (owner へのリンクも取り出せる) 135 114 # 136 # get_owner ã§å¾ããããã®115 # get_owner で得られるもの 137 116 # FuncHead => Signature 138 117 # Decl => Namespace(const), Typedef(typedef), … … 140 119 # Struct(member), ParamDecl(parameter), FuncHead(funchead) 141 120 # Signature, Celltype, CompositeCelltype, Typedef => Namespace 142 #, Namespace => Namespace, Generator.class (root Namespace ã®å ´å)121 #, Namespace => Namespace, Generator.class (root Namespace の場合) 143 122 # Cell => Region, CompositeCelltype(in_composite) 144 123 # Port => Celltype, Composite … … 150 129 # ParamList => FuncHead 151 130 # Expression => Namespace 152 # 大åã®ãã®ã¯ new_* ã¡ã½ãã㧠owner Node ã«ä¼éããã153 # ãã®ã¡ã½ãããå¼ã³åºãããã¨ãã« owner Node ãè¨é²ããã154 # new_* ããªããã®ï¼131 # 大半のものは new_* メソッドで owner Node に伝達される 132 # そのメソッドが呼び出されたときに owner Node が記録される 133 # new_* がないもの: 155 134 # Decl(parameter), ParamDecl, ParamList, FuncHead, Expression 156 135 # 157 # Expression ã¯ãowner Node ã¨ãªããã®ãå¤ãããããæ¹é ãå°é£ã§ãããã158 # Expression ãå®ç¾©ãããã¨ãã® Namespace ã owner Node ã¨ãã159 # StructType 㯠Type ã®ä¸ç¨®ãªã®ã§ owner ãæããªã136 # Expression は、owner Node となるものが多くあるが、改造が困難であるため 137 # Expression が定義されたときの Namespace を owner Node とする 138 # StructType は Type の一種なので owner を持たない 160 139 # 161 140 class BDNode < Node … … 173 152 end 174 153 175 #=== owner ãè¨å®ãã154 #=== owner を設定する 176 155 def set_owner owner 177 156 dbgPrint "set_owner: #{owner.class.name}\n" … … 179 158 end 180 159 181 #=== owner ãå¾ã 182 # class ã®èª¬æãåç 183 § 160 #=== owner を得る 161 # class の説明を参照 184 162 def get_owner 185 163 if @owner == nil … … 190 168 end 191 169 192 #== Namespace åãæã¤BDNode170 #== Namespace 名を持つ BDNode 193 171 # Namespace(Region), Signature, Celltype, CompositeCelltype, Cell 194 172 class NSBDNode < BDNode … … 198 176 end 199 177 200 #=== å±ãã namespace ãå¾ã201 # owner ã namespace ã«ãã©ãçãã¾ã§ä¸ã«ãã©ã178 #=== 属する namespace を得る 179 # owner を namespace にたどり着くまで上にたどる 202 180 def get_namespace 203 181 if @owner.kind_of? Namespace … … 206 184 return @owner.get_namespace 207 185 else 208 # @owner == nil ãªã"::"186 # @owner == nil なら "::" 209 187 if @name != "::" then 210 188 raise "non-root namespace has no owner #{self.class.name}##{@name} #{self}" … … 223 201 end 224 202 225 #=== NamespacePath ãå¾ã203 #=== NamespacePath を得る 226 204 def get_namespace_path 227 205 return @NamespacePath … … 232 210 return @import.is_imported? 233 211 else 234 return false # mikan: ä»® @import ã nil ã«ãªãã±ã¼ã¹ã追æ±ã§ãã¦ããªã212 return false # mikan: 仮 @import が nil になるケースが追求できていない 235 213 end 236 214 end … … 239 217 class NamedList 240 218 # @names:: {} of items 241 # @items:: [] of items : item ã® CLASS 㯠get_name ã¡ã½ãããæã¤ã㨠get_name ã®æ»ãå¤ã¯ Symbol ã§ãªãã¦ã¯ãªããªã 242 # NamedList ã clone_for_composite ããå ´åã¯ãitem ã«ãã¡ã½ãããå¿ 243 è¦ 244 # @type:: string ã¨ã©ã¼ã¡ãã»ã¼ã¸ 219 # @items:: [] of items : item の CLASS は get_name メソッドを持つこと get_name の戻り値は Symbol でなくてはならない 220 # NamedList を clone_for_composite する場合は、item にもメソッドが必要 221 # @type:: string エラーメッセージ 245 222 246 223 def initialize( item, type ) … … 251 228 end 252 229 253 #=== è¦ç´ ãå ãã254 # parse ããæç¹ã§å ãããã¨(å ´æãè¨æ¶ãã)230 #=== 要素を加える 231 # parse した時点で加えること(場所を記憶する) 255 232 def add_item( item ) 256 233 … … 311 288 end 312 289 313 #=== composite cell ã clone ããæã«è¦ç´ (JOIN) ã® clone ãã290 #=== composite cell を clone した時に要素(JOIN) の clone する 314 291 # 315 # mikan ãã®ã¡ã½ãã㯠Join ã«ç¹åããã¦ããã®ã§ NamedList ããåé¢ãã¹ã292 # mikan このメソッドは Join に特化されているので NamedList から分離すべき 316 293 def clone_for_composite( ct_name, cell_name, locale ) 317 294 cl = self.clone … … 320 297 end 321 298 322 #=== clone ããã NamedList ã¤ã³ã¹ã¿ã³ã¹ã®åç 323 §ãããã®(item)ã clone 299 #=== clone された NamedList インスタンスの参照するもの(item)を clone 324 300 # 325 # mikan ãã®ã¡ã½ãã㯠Join ã«ç¹åããã¦ããã®ã§ NamedList ããåé¢ãã¹ã301 # mikan このメソッドは Join に特化されているので NamedList から分離すべき 326 302 def set_cloned( ct_name, cell_name, locale ) 327 303 items = [] … … 385 361 end 386 362 387 #== é¢æ°é é¨388 # signature ã«ç»é²ãããé¢æ°363 #== 関数頭部 364 # signature に登録される関数 389 365 class FuncHead <BDNode 390 366 # @declarator:: Decl … … 431 407 end 432 408 433 #=== FuncHead# é¢æ°ã®ååãè¿ã409 #=== FuncHead# 関数の名前を返す 434 410 def get_name 435 411 return @declarator.get_name 436 412 end 437 413 438 #=== FuncHead# é¢æ°ã®æ»ãå¤ã®åãè¿ã 439 # types.rb ã«å®ç¾©ããã¦ããå 440 # é¢æ°ãããã®å®ç¾©ã¨ãã¦ä¸å®å 441 ¨ãªå ´å nil ãè¿ã 414 #=== FuncHead# 関数の戻り値の型を返す 415 # types.rb に定義されている型 416 # 関数ヘッダの定義として不完全な場合 nil を返す 442 417 def get_return_type 443 418 if is_function? then … … 446 421 end 447 422 448 #=== FuncHead# é¢æ°ã®å¼æ°ã®ãªã¹ããè¿ã 449 # ParamList ãè¿ã 450 # é¢æ°ãããã®å®ç¾©ã¨ãã¦ä¸å®å 451 ¨ãªå ´å nil ãè¿ã 423 #=== FuncHead# 関数の引数のリストを返す 424 # ParamList を返す 425 # 関数ヘッダの定義として不完全な場合 nil を返す 452 426 def get_paramlist 453 427 if is_function? then … … 463 437 end 464 438 465 #=== 宣è¨466 # @kind ã§ç¤ºãããå種ã®å®£è¨439 #=== 宣言 440 # @kind で示される各種の宣言 467 441 class Decl < BDNode 468 442 469 443 # @identifer:: String 470 # @global_name:: String | nil : String(@kind=TYPEDEF||:CONSTANT), nil(@kind= ãã®ä»)471 # set_kind ã«ã¦è¨å®ããã444 # @global_name:: String | nil : String(@kind=TYPEDEF||:CONSTANT), nil(@kind=その他) 445 # set_kind にて設定される 472 446 # @type:: ArrayType, FuncType, PtrType, IntType, StructType 473 447 # VoidType, FloatType, DefinedType, BoolType 474 448 # @initializer:: constant_expression, mikan { initlist } 475 # @kind:: :VAR, :ATTRIBUTE, :PARAMETER, :TYPEDEF, :CONSTANT, :MEMBER, :FUNCHEAD(signature ã®é¢æ°å®ç¾©)449 # @kind:: :VAR, :ATTRIBUTE, :PARAMETER, :TYPEDEF, :CONSTANT, :MEMBER, :FUNCHEAD(signatureの関数定義) 476 450 # @b_referenced:: bool 477 451 # 478 # 以ä¸ã¯ã@kind ã :VAR, :ATTRIBUTE ã®ã¨ãã«æå¹ 479 # @rw:: bool # å¤ãææ³ã§ã¯ attr ã«æå®å¯è½ã ã£ãï¼æ¶ãã«ã¯ generate ã®ä¿®æ£ãå¿ 480 è¦ï¼ 452 # 以下は、@kind が :VAR, :ATTRIBUTE のときに有効 453 # @rw:: bool # 古い文法では attr に指定可能だった(消すには generate の修正も必要) 481 454 # @omit:: bool 482 # @choice_list:: [String] attr åæå¤ã®é¸æè¢483 # 以ä¸ã¯ã@kind ã :VAR, :ATTRIBUTE, :MEMBER ã®ã¨ãã«æå¹455 # @choice_list:: [String] attr 初期値の選択肢 456 # 以下は、@kind が :VAR, :ATTRIBUTE, :MEMBER のときに有効 484 457 # @size_is:: Expression or nil unless specified 485 # 以ä¸ã¯ã@kind ã :MEMBER ã®ã¨ãã«æå¹458 # 以下は、@kind が :MEMBER のときに有効 486 459 # @count_is:: Expression or nil unless specified 487 # attr, var ã®å ´åãcount_is ã¯æå®ã§ããªã460 # attr, var の場合、count_is は指定できない 488 461 # @string:: Expression, -1 (length not specified) or nil (not specified) 489 462 # 490 # mikan ParamDecl ã ãå¥ã«è¨ããããMemberDecl, AttrDecl ãªã©ãåããã¹ãã(ï¼)463 # mikan ParamDecl だけ別に設けたが、MemberDecl, AttrDecl なども分けるべきか(?) 491 464 492 465 def initialize( identifier ) … … 518 491 end 519 492 520 #== Decl ã®æå³ç誤ãããã§ãã¯ãã493 #== Decl の意味的誤りをチェックする 521 494 def check 522 495 # return nil if @type == nil 523 496 524 # æ§é ä½ã¿ã°ãã§ãã¯ï¼ãã¤ã³ã¿åããæ§é ä½ãåç 525 §ããã¦ããå ´åã¯ãã¿ã°ã®åå¨ããã§ãã¯ããªãï¼ 497 # 構造体タグチェック(ポインタ型から構造体が参照されている場合は、タグの存在をチェックしない) 526 498 @type.check_struct_tag @kind 527 499 528 # åã®ãã§ãã¯ãè¡ã500 # 型のチェックを行う 529 501 res = @type.check 530 502 if res then … … 532 504 end 533 505 534 # ä¸è¦ã®åæååããã§ãã¯ãã506 # 不要の初期化子をチェックする 535 507 if @initializer then 536 508 case @kind … … 538 510 cdl_error( "S2003 $1: $2 cannot have initializer" , @identifier, @kind.to_s.downcase ) 539 511 when :VAR, :ATTRIBUTE, :CONSTANT 540 # p @initializer ããã§ã¯ä»£å 541 ¥å¯è½ãã©ããããã§ãã¯ããªã 542 # :VAR, :ATTRIBUTE, :CONSTANT ã¯ããããã§ãã§ãã¯ãã 512 # p @initializer ここでは代入可能かどうか、チェックしない 513 # :VAR, :ATTRIBUTE, :CONSTANT はそれぞれでチェックする 543 514 # return @type.check_init( @identifier, @initializer, @kind ) 544 515 else … … 558 529 end 559 530 560 #== ãã¤ã³ã¿ã¬ãã«ãå¾ã561 # æ»ãå¤ï¼562 # éãã¤ã³ã¿å¤æ°= 0563 # ãã¤ã³ã¿å¤æ°= 1564 # äºéãã¤ã³ã¿å¤æ°= 2531 #== ポインタレベルを得る 532 # 戻り値: 533 # 非ポインタ変数 = 0 534 # ポインタ変数 = 1 535 # 二重ポインタ変数 = 2 565 536 def get_ptr_level 566 537 level = 0 … … 570 541 level += 1 571 542 type = type.get_referto 572 # elsif type.kind_of?( ArrayType ) then # æ·»æ°ãªãé 573 åã¯ãã¤ã³ã¿ã¨ã¿ãªã 543 # elsif type.kind_of?( ArrayType ) then # 添数なし配列はポインタとみなす 574 544 # if type.get_subscript == nil then 575 545 # level += 1 … … 578 548 # break 579 549 # end 580 # mikan ãã¤ã³ã¿ã®æ·»æ°ããé 581 åã®ãã¤ã³ã¿ã¬ãã«ã¯ï¼ã§ããï¼ 550 # mikan ポインタの添数あり配列のポインタレベルは0でよい? 582 551 elsif type.kind_of?( DefinedType ) then 583 552 type = type.get_type … … 602 571 @type = type 603 572 else 604 @type.set_type( type ) # èã«è¨å®573 @type.set_type( type ) # 葉に設定 605 574 end 606 575 end … … 744 713 end 745 714 746 # é¢æ°ãã©ã¡ã¼ã¿ã®å®£è¨715 # 関数パラメータの宣言 747 716 class ParamDecl < BDNode 748 717 749 718 # @declarator:: Decl: Token, ArrayType, FuncType, PtrType 750 719 # @direction:: :IN, :OUT, :INOUT, :SEND, :RECEIVE 751 # @size:: Expr (size_is å¼æ°)752 # @count:: Expr (count_is å¼æ°)753 # @max:: Expr (size_is ã®ç¬¬äºå¼æ°)720 # @size:: Expr (size_is 引数) 721 # @count:: Expr (count_is 引数) 722 # @max:: Expr (size_is の第二引数) 754 723 # @b_nullable:: Bool : nullable 755 # @string:: Expr or -1(if size not specified) ï¼string å¼æ°ï¼724 # @string:: Expr or -1(if size not specified) (string 引数) 756 725 # @allocator:: Signature of allocator 757 # @b_ref:: bool : size_is, count_is, string_is å¼æ°ã¨ãã¦åç 758 §ããã¦ãã 726 # @b_ref:: bool : size_is, count_is, string_is 引数として参照されている 759 727 # 760 # 1. é¢æ°åã§ãªãã㨠761 # 2. ï¼æ¬¡å 762 以ä¸ã®é 763 åã§ãã£ã¦æãå 764 å´ä»¥å¤ã®æ·»æ°ãããã㨠765 # 3. in, out, ..., size_is, count_is, ... ã®éè¤æå®ããªãã㨠766 # 4. ãã¤ã³ã¿ã¬ãã«ãé©åãªã㨠728 # 1. 関数型でないこと 729 # 2. 2次元以上の配列であって最も内側以外の添数があること 730 # 3. in, out, ..., size_is, count_is, ... の重複指定がないこと 731 # 4. ポインタレベルが適切なこと 767 732 768 733 def initialize( declarator, specifier, param_specifier ) … … 831 796 end 832 797 when :MAX_IS 833 # max_is ã¯ãå 834 é¨çãªãã® bnf.y.rb åç 835 § 836 # size_is ã§éè¤ãã§ãã¯ããã 798 # max_is は、内部的なもの bnf.y.rb 参照 799 # size_is で重複チェックされる 837 800 @max = i[1] 838 801 when :NULLABLE … … 854 817 end 855 818 856 # mikan ãã¤ã³ã¿ã®é 857 åï¼æ·»æ°æï¼ã®ã¬ãã«ãï¼ 819 # mikan ポインタの配列(添数有)のレベルが0 858 820 ptr_level = @declarator.get_ptr_level 859 821 … … 898 860 cdl_error( "S2014 $1 need pointer or more pointer" , @declarator.get_identifier ) 899 861 elsif ptr_level > max_level then 900 # note: æ§æ解æ段éã§å®è¡ã®ãã get_current å¯862 # note: 構文解析段階で実行のため get_current 可 901 863 if Signature.get_current == nil || Signature.get_current.is_deviate? == false then 902 864 cdl_warning( "W3003 $1 pointer level mismatch" , @declarator.get_identifier ) … … 910 872 911 873 if ptr_level > 0 then 912 # size_is, count_is, string ãã»ãã874 # size_is, count_is, string をセット 913 875 if @direction == :RECEIVE && ptr_level > 1 then 914 876 type.get_type.set_scs( @size, @count, @string, @max, @b_nullable ) … … 920 882 #type.show_tree 1 921 883 922 # ãã¤ã³ã¿ãæãã¦ããå 923 ã®ãã¼ã¿åãå¾ã 884 # ポインタが指している先のデータ型を得る 924 885 i = 0 925 886 t2 = type … … 936 897 # p t2.is_const? 937 898 938 # const 修飾ãé©åããã§ãã¯899 # const 修飾が適切かチェック 939 900 if @direction == :IN then 940 901 if ! t2.is_const? then … … 947 908 end 948 909 else 949 # éãã¤ã³ã¿ã¿ã¤ã910 # 非ポインタタイプ 950 911 if @size != nil || @count != nil || @string != nil || @max != nil || @b_nullable then 951 912 type.set_scs( @size, @count, @string, @max, @b_nullable ) … … 1019 980 end 1020 981 1021 #=== PPAllocator ãå¿ 1022 è¦ã 1023 # Transparent RPC ã®å ´å in 㧠size_is, count_is, string ã®ãããããæå®ããã¦ããå ´å oneway ã§ã¯ PPAllocator ãå¿ 1024 è¦ 1025 # Transparent PC 㧠oneway ãã©ããã¯ãããã§ã¯å¤æããªãã®ã§å¥éå¤æãå¿ 1026 è¦ 1027 # Opaque RPC ã®å ´å size_is, count_is, string ã®ãããããæå®ããã¦ããå ´åãPPAllocator ãå¿ 1028 è¦ 982 #=== PPAllocator が必要か 983 # Transparent RPC の場合 in で size_is, count_is, string のいずれかが指定されている場合 oneway では PPAllocator が必要 984 # Transparent PC で oneway かどうかは、ここでは判断しないので別途判断が必要 985 # Opaque RPC の場合 size_is, count_is, string のいずれかが指定されている場合、PPAllocator が必要 1029 986 def need_PPAllocator?( b_opaque = false ) 1030 987 if ! b_opaque then … … 1073 1030 end 1074 1031 1075 # é¢æ°ãã©ã¡ã¼ã¿ãªã¹ã1032 # 関数パラメータリスト 1076 1033 class ParamList < BDNode 1077 1034 # @param_list:: NamedList : item: ParamDecl … … 1086 1043 1087 1044 def add_param( paramdecl ) 1088 return if paramdecl == nil # æ¢ã«ã¨ã©ã¼1045 return if paramdecl == nil # 既にエラー 1089 1046 1090 1047 @param_list.add_item( paramdecl ) … … 1096 1053 end 1097 1054 1098 #=== size_is, count_is, string ã®å¼æ°ã®å¼ããã§ã㯠1099 # å¤æ°ã¯åæ¹åç 1100 §å¯è½ãªãããé¢æ°é é¨ã®æ§æ解éãçµãã£ãå¾ã«ãã§ãã¯ãã 1055 #=== size_is, count_is, string の引数の式をチェック 1056 # 変数は前方参照可能なため、関数頭部の構文解釈が終わった後にチェックする 1101 1057 def check_param 1102 1058 @param_list.get_items.each { |i| 1103 next if i == nil # i == nil : ã¨ã©ã¼æ1059 next if i == nil # i == nil : エラー時 1104 1060 1105 1061 if i.get_type.class == VoidType then 1106 # åä¸ã® void åã¯ããã«ã¯ããªã1062 # 単一の void 型はここにはこない 1107 1063 cdl_error( "S2027 '$1' parameter cannot be void type", i.get_name ) 1108 1064 end … … 1111 1067 if size then 1112 1068 val = size.eval_const( @param_list ) 1113 if val == nil then # å®æ°å¼ã§ãªããï¼1114 # mikan å¤æ°ãå«ãå¼ï¼åä¸ã®å¤æ°ã®ã¿OK1069 if val == nil then # 定数式でないか? 1070 # mikan 変数を含む式:単一の変数のみ OK 1115 1071 type = size.get_type( @param_list ) 1116 1072 unless type.kind_of?( IntType ) then … … 1150 1106 if count then 1151 1107 val = count.eval_const( @param_list ) 1152 if val == nil then # å®æ°å¼ã§ãªããï¼1153 # mikan å¤æ°ãå«ãå¼ï¼åä¸ã®å¤æ°ã®ã¿OK1108 if val == nil then # 定数式でないか? 1109 # mikan 変数を含む式:単一の変数のみ OK 1154 1110 type = count.get_type( @param_list ) 1155 1111 unless type.kind_of?( IntType ) then … … 1170 1126 if string != -1 && string then 1171 1127 val = string.eval_const( @param_list ) 1172 if val == nil then # å®æ°å¼ã§ãªããï¼1173 # mikan å¤æ°ãå«ãå¼ï¼åä¸ã®å¤æ°ã®ã¿OK1128 if val == nil then # 定数式でないか? 1129 # mikan 変数を含む式:単一の変数のみ OK 1174 1130 type = string.get_type( @param_list ) 1175 1131 unless type.kind_of?( IntType ) then … … 1195 1151 end 1196 1152 1197 #=== Push Pop Allocator ãå¿ 1198 è¦ãï¼ 1199 # Transparent RPC ã®å ´å (oneway ãã¤) in ã®é 1200 å(size_is, count_is, string ã®ããããã§ä¿®é£¾ï¼ããã 1153 #=== Push Pop Allocator が必要か? 1154 # Transparent RPC の場合 (oneway かつ) in の配列(size_is, count_is, string のいずれかで修飾)がある 1201 1155 def need_PPAllocator?( b_opaque = false ) 1202 1156 @param_list.get_items.each { |i| … … 1212 1166 end 1213 1167 1214 #== ParamList# æååå1215 #b_name:: Bool: ãã©ã¡ã¼ã¿åãå«ãã1168 #== ParamList# 文字列化 1169 #b_name:: Bool: パラメータ名を含める 1216 1170 def to_str( b_name ) 1217 1171 str = "(" … … 1236 1190 end 1237 1191 1238 #== CDL ã®æååãªãã©ã«ãæ±ãããã®ã¯ã©ã¹1239 # CDL ã®æååãªãã©ã«ãã®ãã®ã§ã¯ãªã1192 #== CDL の文字列リテラルを扱うためのクラス 1193 # CDL の文字列リテラルそのものではない 1240 1194 class CDLString 1241 # ã¨ã¹ã±ã¼ãæåãå¤æ1195 # エスケープ文字を変換 1242 1196 def self.escape str 1243 1197 str = str.dup … … 1251 1205 str.gsub!( /(\\[Xx][0-9A-Fa-f]{1,2})/, '{printf \"\\1\"}' ) 1252 1206 str.gsub!( /(\\[0-7]{1,3})/, '{printf \"\\1\"}' ) 1253 str.gsub!( /\\(.)/, "\\1" ) # mikan æªå®ç¾©ã®ã¨ã¹ã±ã¼ãã·ã¼ã±ã³ã¹ãå¤æãã¦ãã¾ã (gcc V3.4.4 ã§ã¯è¦åãåºããã)1207 str.gsub!( /\\(.)/, "\\1" ) # mikan 未定義のエスケープシーケンスを変換してしまう (gcc V3.4.4 では警告が出される) 1254 1208 return str 1255 1209 end 1256 1210 1257 #=== CDLString# åå¾ã® " ãåãé¤ã1211 #=== CDLString#前後の " を取り除く 1258 1212 def self.remove_dquote str 1259 1213 s = str.sub( /\A"/, "" ) … … 1263 1217 end 1264 1218 1265 #== CDL ã®åæååãæ±ãããã®ã¯ã©ã¹1266 # CDL ã®åæååãã®ãã®ã§ã¯ãªã1219 #== CDL の初期化子を扱うためのクラス 1220 # CDL の初期化子そのものではない 1267 1221 class CDLInitializer 1268 #=== åæååã®ã¯ãã¼ã³1269 # åæåå㯠Expression, C_EXP, Array ã®ãããã1222 #=== 初期化子のクローン 1223 # 初期化子は Expression, C_EXP, Array のいずれか 1270 1224 def self.clone_for_composite( rhs, ct_name, cell_name, locale ) 1271 1225 if rhs.instance_of? C_EXP then 1272 # C_EXP ã® clone ãä½ãã¨ã¨ãã«ç½®æ1226 # C_EXP の clone を作るとともに置換 1273 1227 rhs = rhs.clone_for_composite( ct_name, cell_name, locale ) 1274 1228 elsif rhs.instance_of? Expression then … … 1282 1236 end 1283 1237 1284 #=== åæååï¼é 1285 åï¼ã®ã¯ãã¼ã³ 1286 # è¦ç´ 㯠clone_for_composite ãæã¤ãã®ã ã 1238 #=== 初期化子(配列)のクローン 1239 # 要素は clone_for_composite を持つものだけ 1287 1240 def self.clone_for_compoiste_array( array, ct_name, cell_name, locale ) 1288 # "compoiste.identifier" ã®å ´å (CDL ã¨ãã¦ã¯èª¤ã)1241 # "compoiste.identifier" の場合 (CDL としては誤り) 1289 1242 if array[0] == :COMPOSITE then 1290 1243 return array.clone -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.