Ignore:
Timestamp:
Aug 23, 2017, 9:27:43 AM (7 years ago)
Author:
coas-nagasima
Message:

文字コードを設定

Location:
EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core
Files:
19 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/C_parser.tab.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    102102    comment = false
    103103
    104     # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
     104    # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
    105105    TECS_LANG::set_kcode_binary
    106106
    107     # 800U, 0xffLL など (整数リテラルにå
    108 ±é€šã®ä¿®é£¾å­)
     107    # 800U, 0xffLL など (整数リテラルに共通の修飾子)
    109108    integer_qualifier = "([Uu][Ll][Ll]|[Uu][Ll]|[Uu]|[Ll][Ll]|[Ll])?"
    110109
     
    121120          if comment
    122121            case line
    123             # コメント終了
     122            # コメント終了
    124123            when /\A\*\//
    125124              comment = false
     
    129128          else
    130129            case line
    131             # 空白、プリプロセスディレクティブ
     130            # 空白、プリプロセスディレクティブ
    132131            when /\A\s+/
    133132              ;
    134             # 識別子
     133            # 識別子
    135134            when /\A[a-zA-Z_]\w*/
    136135              word = $&
    137136              @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)]
    138             # 16 進数定数
     137            # 16 進数定数
    139138            when /\A0x[0-9A-Fa-f]+#{integer_qualifier}/
    140139              @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)]
    141             # 8 進数定数
     140            # 8 進数定数
    142141            when /\A0[0-7]+#{integer_qualifier}/
    143142              @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)]
    144             # 浮動小数定数
     143            # 浮動小数定数
    145144            when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/
    146145              @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
    147             # 整数定数
     146            # 整数定数
    148147            when /\A\d+#{integer_qualifier}/
    149148            # when /\A\d+/
    150149              @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)]
    151             # 文字
     150            # 文字
    152151            when /\A'(?:[^'\\]|\\.)'/
    153152              @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)]
    154             # 文字列
    155 #              "#include  #include #include \"../systask/logtask.cfg\"       æœ€å¾Œã® " 忘れ)で無限ループ
     153            # 文字列
     154#              "#include  #include #include \"../systask/logtask.cfg\"       最後の " 忘れ)で無限ループ
    156155#            when /\A"(?:[^"\\]+|\\.)*"/
    157             when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
     156            when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
    158157              @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)]
    159             # 行コメント
     158            # 行コメント
    160159            when /\A\/\/.*$/
    161               # 読み飛ばすだけ
    162             # コメント開始
     160              # 読み飛ばすだけ
     161            # コメント開始
    163162            when /\A\/\*/
    164163              comment = true
     
    189188    }
    190189
    191     # 終了の印
     190    # 終了の印
    192191    @q << nil
    193192
     
    216215      end
    217216
    218       # TYPE_NAME トークンへ置き換え
     217      # TYPE_NAME トークンへ置き換え
    219218      if @b_no_type_name == false
    220219        if token[0] == :IDENTIFIER && Namespace.is_typename?( token[1].val ) then
     
    223222      end
    224223
    225       if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
     224      if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
    226225        locale = @@current_locale[@@generator_nest]
    227226        if token then
     
    252251  @@n_warning = 0
    253252
    254   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
     253  # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
    255254  def self.error( msg )
    256255    @@n_error += 1
     
    264263  end
    265264
    266   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
     265  # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
    267266  def self.warning( msg )
    268267    @@n_warning += 1
     
    16761675module_eval(<<'.,.,', 'C_parser.y.rb', 237)
    16771676  def _reduce_70(val, _values, result)
    1678                         result = CIntType.new( -3 )    # storage class は無視
     1677                        result = CIntType.new( -3 )    # storage class は無視
    16791678               
    16801679    result
     
    16951694module_eval(<<'.,.,', 'C_parser.y.rb', 247)
    16961695  def _reduce_73(val, _values, result)
    1697                         result = val[1]                # storage class は無視
     1696                        result = val[1]                # storage class は無視
    16981697               
    16991698    result
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/C_parser.y.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: C_parser.y.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
    5540class C_parser
    5641rule
    57 # トップレベルの構文要素は C_parser
     42# トップレベルの構文要素は C_parser
    5843all: C_parser
    5944
    6045# Expr
    61 ##########################  式  ##########################
    62 # K&Rの文法(プログラミング言語C 第2版 付録)と一部異なる
    63 # argument_expression_list(関数引数), assignment_expression(代å
    64 ¥)がない
    65 # 式の result は、すべてé
    66 åˆ—で第一要素が識別シンボル、第二要素以下が引数
     46##########################  式  ##########################
     47# K&Rの文法(プログラミング言語C 第2版 付録)と一部異なる
     48# argument_expression_list(関数引数), assignment_expression(代入)がない
     49# 式の result は、すべて配列で第一要素が識別シンボル、第二要素以下が引数
    6750
    6851primary_expression
    6952        : namespace_identifier
    7053                { result = [ :IDENTIFIER, val[0] ] }     #1ok
    71 #        : IDENTIFIER   # mikan namespace への対応
     54#        : IDENTIFIER   # mikan namespace への対応
    7255#               { result = [ :IDENTIFIER, val[0] ] }
    7356#        | TRUE
     
    9679                { result << val[1] }
    9780
    98 # 関数呼び出しと後置インクリメント、デクリメント演算子がない
     81# 関数呼び出しと後置インクリメント、デクリメント演算子がない
    9982postfix_expression
    10083        : primary_expression
     
    10790        | postfix_expression '->' IDENTIFIER
    10891                { result = [ :OP_REF, val[0], val[2] ] }
    109         | postfix_expression '++'       { result = val[0] }   # ++, -- は無視する
     92        | postfix_expression '++'       { result = val[0] }   # ++, -- は無視する
    11093        | postfix_expression '--'       { result = val[0] }
    11194
     
    11699
    117100
    118 # 前置インクリメント、デクリメント演算子がない
     101# 前置インクリメント、デクリメント演算子がない
    119102unary_expression
    120103        : postfix_expression
     
    125108        | SIZEOF '(' type_name ')'
    126109                { result = [ :OP_SIZEOF_TYPE, val[1] ] }
    127                 | '++' unary_expression                 { result = val[1] }   # ++, -- は無視する
     110                | '++' unary_expression                 { result = val[1] }   # ++, -- は無視する
    128111                | '--' unary_expression                 { result = val[1] }
    129112
     
    213196
    214197
    215 # コンマ演算子が使えない
     198# コンマ演算子が使えない
    216199expression
    217200        : conditional_expression
     
    238221
    239222# Types
    240 ##########################  宣言  ##########################
    241 # 宣言もK&Rと一部異なる
    242 
    243 # declarationはセルの属性で使われる
    244 # K&Rとの違い: storage classが指定できない、型が省略できない
     223##########################  宣言  ##########################
     224# 宣言もK&Rと一部異なる
     225
     226# declarationはセルの属性で使われる
     227# K&Rとの違い: storage classが指定できない、型が省略できない
    245228declaration
    246229        : declaration_specifiers init_declarator_list ';'
    247230#        : type_specifier_qualifier_list init_declarator_list ';'
    248231
    249 # declaration_specifiersは関数のパラメータで使われるが、
    250 # type_specifier_qualifier_listで十分かもしれない
     232# declaration_specifiersは関数のパラメータで使われるが、
     233# type_specifier_qualifier_listで十分かもしれない
    251234
    252235declaration_specifiers
    253236        : storage_class
    254237                {
    255                         result = CIntType.new( -3 )    # storage class は無視
     238                        result = CIntType.new( -3 )    # storage class は無視
    256239                }
    257240        | type_specifier
     
    263246        | storage_class declaration_specifiers
    264247                {
    265                         result = val[1]                # storage class は無視
     248                        result = val[1]                # storage class は無視
    266249                }
    267250        | type_specifier declaration_specifiers
     
    292275        | DOUBLE        { set_no_type_name true; result = CFloatType.new(-64) }
    293276        | BOOL  { set_no_type_name true; result = CBoolType.new }
    294         | struct_specifier      { set_no_type_name true; result = val[0] } # set_no_type_name true は struct_tag でも呼ばれる
    295         | union_specifier       { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
    296         | enum_specifier        { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
     277        | struct_specifier      { set_no_type_name true; result = val[0] } # set_no_type_name true は struct_tag でも呼ばれる
     278        | union_specifier       { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
     279        | enum_specifier        { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
    297280        | TYPE_NAME     { set_no_type_name true; result = CDefinedType.new( val[0].val ) }
    298281
     
    314297                }
    315298
    316 # mikan K&Rのstruct_or_union_specifierに相当するが、unionは使えない, bit field にも対応しない
     299# mikan K&Rのstruct_or_union_specifierに相当するが、unionは使えない, bit field にも対応しない
    317300struct_specifier                # mikan
    318301        : STRUCT struct_tag '{'
     
    333316                        result = val[1]
    334317                }
    335         | STRUCT struct_tag   # mikan struct_tag は namespace 対応がå¿
    336 è¦
     318        | STRUCT struct_tag   # mikan struct_tag は namespace 対応が必要
    337319                {
    338320                        StructType.set_define( false )
     
    352334                }
    353335
    354 # ポインタ修飾子を追加
     336# ポインタ修飾子を追加
    355337struct_declaration
    356338        : declaration_specifiers struct_declarator_list ';'
     
    365347                        result = val[1]
    366348                }
    367         | union_specifier ';'                       # 無名
    368         | struct_specifier ';'                       # 無名
    369 
    370 
    371 
    372 # K&Rのspecifier_qualifier_listと同じ
    373 # 名前がまぎらわしかったのでtype_を付けた
     349        | union_specifier ';'                       # 無名
     350        | struct_specifier ';'                       # 無名
     351
     352
     353
     354# K&Rのspecifier_qualifier_listと同じ
     355# 名前がまぎらわしかったのでtype_を付けた
    374356type_specifier_qualifier_list
    375357        : type_specifier
     
    395377                { result << val[2] }
    396378
    397 # ビットフィールドは使えない
     379# ビットフィールドは使えない
    398380struct_declarator
    399381        : declarator
     
    404386        : UNION union_tag '{' union_declaration_list '}'
    405387        | UNION '{' union_declaration_list '}'
    406         | UNION union_tag   # mikan struct_tag は namespace 対応がå¿
    407 è¦
     388        | UNION union_tag   # mikan struct_tag は namespace 対応が必要
    408389
    409390union_declaration_list
     
    416397union_declaration
    417398        : declaration_specifiers union_declarator_list ';'
    418                 | union_specifier ';'                       # 無名
    419                 | struct_specifier ';'                      # 無名
     399                | union_specifier ';'                       # 無名
     400                | struct_specifier ';'                      # 無名
    420401
    421402union_declarator_list
     
    423404        | union_declarator_list ',' union_declarator
    424405
    425 # ビットフィールドは使えない
     406# ビットフィールドは使えない
    426407union_declarator
    427408        : declarator
     
    429410
    430411
    431 # enumの種類を追加
     412# enumの種類を追加
    432413enum_specifier          # mikan
    433414        : enum_type            '{' enumerator_list '}'
     
    462443                }
    463444        | direct_declarator
    464         | pointer TYPE_NAME     # 関数ポインタの typedef が二重定義の場合
     445        | pointer TYPE_NAME     # 関数ポインタの typedef が二重定義の場合
    465446                {
    466447                        result = Decl.new( val[1].val )
     
    490471                }
    491472
    492 #        | direct_declarator '(' identifier_list ')'  # これは何のためにå¿
    493 è¦ï¼Ÿ 060211
     473#        | direct_declarator '(' identifier_list ')'  # これは何のために必要? 060211
    494474        | direct_declarator '(' ')'
    495475                {
     
    524504        : parameter_list
    525505        | parameter_list ',' '.' '.' '.'
    526                 # mikan 可変長パラメータ,  ... の間のスペースが許される(手抜き)
     506                # mikan 可変長パラメータ,  ... の間のスペースが許される(手抜き)
    527507
    528508parameter_list
     
    532512#               {
    533513#                       val[0].add_param( val[2] )
    534 #                       # result = val[0] 不要
     514#                       # result = val[0] 不要
    535515#               }
    536516
    537517
    538 # パラメータ修飾子を追加
     518# パラメータ修飾子を追加
    539519parameter_declaration
    540520        : declaration_specifiers declarator
     
    545525#               }
    546526
    547         # 以下はエラーとする
    548 #        | declaration_specifiers       # 仮引数なしは、とりあえず扱わない 060210
     527        # 以下はエラーとする
     528#        | declaration_specifiers       # 仮引数なしは、とりあえず扱わない 060210
    549529#               {
    550530#                       unless val[0].kind_of?( VoidType ) then
     
    553533#                       result = nil
    554534#               }
    555         | declaration_specifiers abstract_declarator    # 仮引数なし
    556         | declaration_specifiers                                                # 仮引数なし
    557 
    558 
    559 #identifier_list       # 060211  不用になった
     535        | declaration_specifiers abstract_declarator    # 仮引数なし
     536        | declaration_specifiers                                                # 仮引数なし
     537
     538
     539#identifier_list       # 060211  不用になった
    560540#        : IDENTIFIER
    561541#        | identifier_list ',' IDENTIFIER
     
    587567        | direct_abstract_declarator '(' parameter_type_list ')'
    588568
    589 # assignment_expressionをconstant_expressionに変更
     569# assignment_expressionをconstant_expressionに変更
    590570initializer                     # mikan
    591571        : constant_expression
     
    610590
    611591
    612 ##########################  ここからはCDL独自  ##########################
    613 
    614 #トップレベルの構文規則
     592##########################  ここからはCDL独自  ##########################
     593
     594#トップレベルの構文規則
    615595C_parser
    616596        :
     
    628608        | declaration
    629609        | ';'
    630         | error   # エラー回復ポイント
     610        | error   # エラー回復ポイント
    631611
    632612typedef
     
    826806    comment = false
    827807
    828     # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
     808    # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
    829809    TECS_LANG::set_kcode_binary
    830810
    831     # 800U, 0xffLL など (整数リテラルにå
    832 ±é€šã®ä¿®é£¾å­)
     811    # 800U, 0xffLL など (整数リテラルに共通の修飾子)
    833812    integer_qualifier = "([Uu][Ll][Ll]|[Uu][Ll]|[Uu]|[Ll][Ll]|[Ll])?"
    834813
     
    845824          if comment
    846825            case line
    847             # コメント終了
     826            # コメント終了
    848827            when /\A\*\//
    849828              comment = false
     
    853832          else
    854833            case line
    855             # 空白、プリプロセスディレクティブ
     834            # 空白、プリプロセスディレクティブ
    856835            when /\A\s+/
    857836              ;
    858             # 識別子
     837            # 識別子
    859838            when /\A[a-zA-Z_]\w*/
    860839              word = $&
    861840              @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)]
    862             # 16 進数定数
     841            # 16 進数定数
    863842            when /\A0x[0-9A-Fa-f]+#{integer_qualifier}/
    864843              @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)]
    865             # 8 進数定数
     844            # 8 進数定数
    866845            when /\A0[0-7]+#{integer_qualifier}/
    867846              @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)]
    868             # 浮動小数定数
     847            # 浮動小数定数
    869848            when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/
    870849              @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
    871             # 整数定数
     850            # 整数定数
    872851            when /\A\d+#{integer_qualifier}/
    873852            # when /\A\d+/
    874853              @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)]
    875             # 文字
     854            # 文字
    876855            when /\A'(?:[^'\\]|\\.)'/
    877856              @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)]
    878             # 文字列
    879 #              "#include  #include #include \"../systask/logtask.cfg\"       æœ€å¾Œã® " 忘れ)で無限ループ
     857            # 文字列
     858#              "#include  #include #include \"../systask/logtask.cfg\"       最後の " 忘れ)で無限ループ
    880859#            when /\A"(?:[^"\\]+|\\.)*"/
    881             when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
     860            when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
    882861              @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)]
    883             # 行コメント
     862            # 行コメント
    884863            when /\A\/\/.*$/
    885               # 読み飛ばすだけ
    886             # コメント開始
     864              # 読み飛ばすだけ
     865            # コメント開始
    887866            when /\A\/\*/
    888867              comment = true
     
    913892    }
    914893
    915     # 終了の印
     894    # 終了の印
    916895    @q << nil
    917896
     
    940919      end
    941920
    942       # TYPE_NAME トークンへ置き換え
     921      # TYPE_NAME トークンへ置き換え
    943922      if @b_no_type_name == false
    944923        if token[0] == :IDENTIFIER && Namespace.is_typename?( token[1].val ) then
     
    947926      end
    948927
    949       if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
     928      if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
    950929        locale = @@current_locale[@@generator_nest]
    951930        if token then
     
    976955  @@n_warning = 0
    977956
    978   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
     957  # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
    979958  def self.error( msg )
    980959    @@n_error += 1
     
    988967  end
    989968
    990   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
     969  # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
    991970  def self.warning( msg )
    992971    @@n_warning += 1
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/bnf.tab.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    9494  }
    9595
    96   # 指定子 '[]' å†
    97 ã§ã®ã¿ä½¿ç”¨ã§ãã‚‹ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰
     96  # 指定子 '[]' 内でのみ使用できるキーワード
    9897  RESERVED2 = {
    9998    # specifier
     
    112111    # port (entry)
    113112    'inline' => :INLINE,
    114     'ref_desc' => :REF_DESC,   # call も可
     113    'ref_desc' => :REF_DESC,   # call も可
    115114
    116115    # port (call)
     
    156155  }
    157156
    158   # 再帰的なパーサのためのスタック
     157  # 再帰的なパーサのためのスタック
    159158  @@generator_nest = -1
    160159  @@generator_stack = []
    161160  @@current_locale = []
    162161
    163   # import_C 中である
     162  # import_C 中である
    164163  @@import_C = false
    165164
    166   # すべての構文解析が完了した
     165  # すべての構文解析が完了した
    167166  @@b_end_all_parse = false
    168167
    169168  def self.parse( file_name, plugin = nil, b_reuse = false )
    170     # パーサインスタンスを生成(別パーサで読み込む)
     169    # パーサインスタンスを生成(別パーサで読み込む)
    171170    parser = Generator.new
    172171
    173     # plugin から import されている場合の plugin 設定
     172    # plugin から import されている場合の plugin 設定
    174173    parser.set_plugin plugin
    175174
    176     # reuse フラグを設定
     175    # reuse フラグを設定
    177176    parser.set_reuse b_reuse
    178177
    179     # cdl をパース
     178    # cdl をパース
    180179    parser.parse( [file_name] )
    181180
    182     # 終期化 パーサスタックを戻す
     181    # 終期化 パーサスタックを戻す
    183182    parser.finalize
    184183  end
     
    200199  def self.get_plugin
    201200    if @@generator_stack[@@generator_nest] then
    202       # tecsgen 引数の cdl が import される場合は nil
     201      # tecsgen 引数の cdl が import される場合は nil
    203202      return @@generator_stack[@@generator_nest].get_plugin
    204203    else
     
    217216  def self.is_reuse?
    218217    if @@generator_stack[@@generator_nest] then
    219       # tecsgen 引数の cdl が import される場合は nil
     218      # tecsgen 引数の cdl が import される場合は nil
    220219      return @@generator_stack[@@generator_nest].is_reuse?
    221220    else
     
    247246      b_in_string = false
    248247
    249       # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
     248      # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
    250249      TECS_LANG::set_kcode_binary
    251250
     
    257256          TECSIO.foreach(file) {|line|
    258257            col = 1
    259 #            line.rstrip!         æ”¹è¡Œå«ã‚€æ–‡å­—列を扱うようになったので、ここで空白を取り除けなくなった
     258#            line.rstrip!         改行含む文字列を扱うようになったので、ここで空白を取り除けなくなった
    260259
    261260            until line.empty?
     
    263262              if b_in_comment
    264263                case line
    265                   # コメント終了
     264                  # コメント終了
    266265                when /\A\*\//
    267266                  b_in_comment = false
    268267                when /\A./
    269268                  ;
    270                 when /\s+/     # line.rstrip! を止めたため \n などの空白文字とまっちするルールがå¿
    271 è¦ã«ãªã£ãŸ
     269                when /\s+/     # line.rstrip! を止めたため \n などの空白文字とまっちするルールが必要になった
    272270                  ;
    273271                end
     
    277275                  @q <<  [:STRING_LITERAL, Token.new(string, file, lineno, col)]
    278276                  b_in_string = false
    279                 elsif line =~ /\A.*\\\n/     # 改行 \n は '.' にマッチしない
     277                elsif line =~ /\A.*\\\n/     # 改行 \n は '.' にマッチしない
    280278                  string += $&
    281                 elsif line =~ /\A.*\n/     # 改行 \n は '.' にマッチしない
     279                elsif line =~ /\A.*\n/     # 改行 \n は '.' にマッチしない
    282280                  string += line
    283                   # この位置では error メソッドは使えない (token 読出し前)
     281                  # この位置では error メソッドは使えない (token 読出し前)
    284282                  puts "error: #{file} line #{lineno}: string literal has newline without escape"
    285283                  @@n_error += 1
     
    287285              else
    288286                case line
    289                 # 空白、プリプロセスディレクティブ
     287                # 空白、プリプロセスディレクティブ
    290288                when /\A\s+/
    291289                  ;
    292                 # 識別子
     290                # 識別子
    293291                when /\A[a-zA-Z_]\w*/
    294292                  word = $&
    295293                  @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)]
    296                 # 16 進数定数
     294                # 16 進数定数
    297295                when /\A0x[0-9A-Fa-f]+/
    298296                  @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)]
    299                 # 8 進数定数
     297                # 8 進数定数
    300298                when /\A0[0-7]+/
    301299                  @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)]
    302                 # 浮動小数定数
     300                # 浮動小数定数
    303301                when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/
    304302                  @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
    305                 # 整数定数
     303                # 整数定数
    306304                when /\A\d+/
    307305                  @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)]
    308                 # 文字定数
     306                # 文字定数
    309307                when /\A'(?:[^'\\]|\\.)'/
    310308                  @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)]
    311                 # 文字列
    312 #                "#include  #include #include \"../systask/logtask.cfg\"       æœ€å¾Œã® " 忘れ)で無限ループ
     309                # 文字列
     310#                "#include  #include #include \"../systask/logtask.cfg\"       最後の " 忘れ)で無限ループ
    313311#                when /\A"(?:[^"\\]+|\\.)*"/
    314                 when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
     312                when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
    315313                  @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)]
    316                 # 文字列 (改行あり)
     314                # 文字列 (改行あり)
    317315                when /\A"(?:[^"\\]|\\.)*\\\n$/
    318316                  string = $&
    319317                  b_in_string = true
    320                 # 文字列 (改行あり, escape なし)
     318                # 文字列 (改行あり, escape なし)
    321319                when /\A("(?:[^"\\]|\e\.)*)\n$/
    322320                  string = $1 + "\\\n"
    323321                  b_in_string = true
    324                   # この位置では error メソッドは使えない (token 読出し前) # mikan cdl_error ではない
     322                  # この位置では error メソッドは使えない (token 読出し前) # mikan cdl_error ではない
    325323                  puts "error: #{file} line #{lineno}: string literal has newline without escape"
    326324                  @@n_error += 1
    327                 # 山括弧で囲まれた文字列
     325                # 山括弧で囲まれた文字列
    328326                when /\A<[0-9A-Za-z_\. \/]+>/   # AB: angle bracke
    329327                  @q << [:AB_STRING_LITERAL, Token.new($&, file, lineno, col)]
    330                 # 行コメント
     328                # 行コメント
    331329                when /\A\/\/.*$/
    332                   # 読み飛ばすだけ
    333                 # コメント開始
     330                  # 読み飛ばすだけ
     331                # コメント開始
    334332                when /\A\/\*/
    335333                  b_in_comment = true
    336                 # '>>', '<<' など
     334                # '>>', '<<' など
    337335                when /\A>>/, /\A<</, /\A==/, /\A!=/, /\A\&\&/, /\A\|\|/
    338336                  @q << [$&, Token.new($&, file, lineno, col)]
    339337                when /\A::/, /\A=>/, /\A<=/, /\A>=/
    340338                  @q << [$&, Token.new($&, file, lineno, col)]
    341                 # '(', ')' など一文字の記号、または未知の記号
     339                # '(', ')' など一文字の記号、または未知の記号
    342340                when /\A./
    343341                  @q << [$&, Token.new($&, file, lineno, col)]
     
    363361      }
    364362
    365       # 終了の印
     363      # 終了の印
    366364      @q << nil
    367365
     
    383381
    384382      if token[0] == :IDENTIFIER then
    385         # TYPE_NAME トークンへ置換え
     383        # TYPE_NAME トークンへ置換え
    386384        if Namespace.is_typename?( token[1].val ) then
    387385          token[0] = :TYPE_NAME
    388386        elsif @in_specifier && RESERVED2[ token[1].val.to_s ] then
    389           # 指定子キーワード( '[', ']' å†
    390 ã§ã®ã¿æœ‰åŠ¹)
     387          # 指定子キーワード( '[', ']' 内でのみ有効)
    391388          token[0] = RESERVED2[ token[1].val.to_s ]
    392389        end
    393390      end
    394391
    395       if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
     392      if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
    396393        locale = @@current_locale[@@generator_nest]
    397394        if token then
     
    424421  @@n_warning = 0
    425422
    426   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
     423  # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
    427424  def self.error( msg, *arg )
    428425    locale = nil
     
    434431
    435432    msg = TECSMsg.get_error_message( msg )
    436     # $1, $2, ... を arg で置換
     433    # $1, $2, ... を arg で置換
    437434    count = 1
    438435    arg.each{ |a|
     
    442439    }
    443440
    444     # import_C の中でのエラー?
     441    # import_C の中でのエラー?
    445442    if @@import_C then
    446443      C_parser.error( msg )
    447444    else
    448445
    449       # Node の記憶する 位置 (locale) を使用した場合、変更以前に比べ、
    450       # 問題発生箇所と異なる位置にエラーが出るため、構文解析中のエラー
    451       # は、解析中の位置を出力する.(new_XXX で owner が子要素のチェッ
    452       # クをすると owner の行番号が出てしまう点で、ずれが生じている)
     446      # Node の記憶する 位置 (locale) を使用した場合、変更以前に比べ、
     447      # 問題発生箇所と異なる位置にエラーが出るため、構文解析中のエラー
     448      # は、解析中の位置を出力する.(new_XXX で owner が子要素のチェッ
     449      # クをすると owner の行番号が出てしまう点で、ずれが生じている)
    453450
    454451      if @@b_end_all_parse == false || locale == nil then
     
    463460  end
    464461
    465   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
     462  # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
    466463  def self.warning( msg, *arg )
    467464    locale = nil
     
    473470
    474471    msg = TECSMsg.get_warning_message( msg )
    475     # $1, $2, ... を arg で置換
     472    # $1, $2, ... を arg で置換
    476473    count = 1
    477474    arg.each{ |a|
     
    481478    }
    482479
    483     # import_C の中でのウォーニング?
     480    # import_C の中でのウォーニング?
    484481    if @@import_C then
    485482      C_parser.warning( msg )
     
    508505  end
    509506
    510   #===  '[' specifier 始め
     507  #===  '[' specifier 始め
    511508  def set_in_specifier
    512509    # p "set_in_specifier"
     
    514511  end
    515512
    516   #=== ']' specifier 終わり
     513  #=== ']' specifier 終わり
    517514  def unset_in_specifier
    518515    # p "unset_in_specifier"
     
    520517  end
    521518
    522   # statement_specifier は構文解釈途中で参ç
    523 §ã—たいため
     519  # statement_specifier は構文解釈途中で参照したいため
    524520  @@statement_specifier_stack = []
    525521  def self.add_statement_specifier( ss )
     
    538534  end
    539535
    540   #=== すべての構文解析が完了したことを報告
     536  #=== すべての構文解析が完了したことを報告
    541537  def self.end_all_parse
    542538    @@b_end_all_parse = true
     
    22642260module_eval(<<'.,.,', 'bnf.y.rb', 76)
    22652261  def _reduce_13(val, _values, result)
    2266                         # 連接した文字列を1つの文字列にまとめる
     2262                        # 連接した文字列を1つの文字列にまとめる
    22672263                        str = "\"" + val[0].val.gsub( /\"(.*)\"/, "\\1" ) + val[1].val.gsub( /\"(.*)\"/, "\\1" ) + "\""
    22682264                        result = Token.new( str, val[0].file, val[0].lineno, val[0].col )
     
    31593155  def _reduce_153(val, _values, result)
    31603156                        val[0].add_param( val[2] )
    3161                         # result = val[0] 不要
     3157                        # result = val[0] 不要
    31623158               
    31633159    result
     
    33143310                                result = val[1]
    33153311                        else
    3316                                 # エラー:仮で val[0] を返す
     3312                                # エラー:仮で val[0] を返す
    33173313                                result = val[0]
    33183314                        end
     
    34583454                        obj = val[3]
    34593455                        if obj.kind_of?( Cell ) || obj.kind_of?( Signature ) || obj.kind_of?( Celltype ) || obj.kind_of?( CompositeCelltype )then
    3460                                 # cell, signature 以外は、指定子を置けない
     3456                                # cell, signature 以外は、指定子を置けない
    34613457                        else
    3462               Generator.get_statement_specifier   # クリア
     3458              Generator.get_statement_specifier   # クリア
    34633459              Generator.error( "G1009 unexpected specifier"  )
    34643460                        end
     
    38313827                                val[1].check
    38323828                        else
    3833                                 # mikan 関数のé
    3834 åˆ—も以下のメッセージになる
     3829                                # mikan 関数の配列も以下のメッセージになる
    38353830                                Generator.error( "G1010 Not function"  )
    38363831                                result = nil
     
    38873882  def _reduce_264(val, _values, result)
    38883883                        if val[3].kind_of? Port then
    3889                                 val[3].set_specifier val[1]  # 設定順序あり
     3884                                val[3].set_specifier val[1]  # 設定順序あり
    38903885                                Celltype.new_port( val[3] )
    38913886                        else
    3892                                 # Port 以外では指定子はエラー
     3887                                # Port 以外では指定子はエラー
    38933888                                Generator.error( "G1012 $1 : cannot put specifier here" , val[1] )
    38943889                        end
     
    40954090  def _reduce_297(val, _values, result)
    40964091                        val[3].each{ |i|       # i:Decl
    4097                                 i.set_kind( :ATTRIBUTE )   # 設定順序あり
     4092                                i.set_kind( :ATTRIBUTE )   # 設定順序あり
    40984093                                i.set_specifier_list( [val[1]] )
    40994094                                i.check
     
    41774172  def _reduce_308(val, _values, result)
    41784173                        val[3].each{ |i|       # i:Decl
    4179                                 i.set_kind( :VAR )   # 設定順序あり
     4174                                i.set_kind( :VAR )   # 設定順序あり
    41804175                                i.set_specifier_list( [val[1]] )
    41814176                                i.check
     
    44584453  def _reduce_353(val, _values, result)
    44594454                        if val[0].kind_of?( Port ) then
    4460                                 CompositeCelltype.new_port( val[0] )   # é
    4461 å»¶ã—て登録
     4455                                CompositeCelltype.new_port( val[0] )   # 遅延して登録
    44624456                        end
    44634457               
     
    44694463  def _reduce_354(val, _values, result)
    44704464                        if val[3].kind_of?( Port ) then
    4471                                 # port 以外 val[3] に有効な値がå
    4472 ¥ã£ã¦ã„ないので、以下のメソッドを適用できない
    4473                                 # 現状 port, cell 以外は指定子を受け付けない
    4474                                 # (しかし将来他の文も指定子を受け付ける可能性があるので、この位置に記述する)
     4465                                # port 以外 val[3] に有効な値が入っていないので、以下のメソッドを適用できない
     4466                                # 現状 port, cell 以外は指定子を受け付けない
     4467                                # (しかし将来他の文も指定子を受け付ける可能性があるので、この位置に記述する)
    44754468                                val[3].set_specifier( Generator.get_statement_specifier )
    4476                                 CompositeCelltype.new_port( val[3] )   # é
    4477 å»¶ã—て登録 (set_specifier 後)
     4469                                CompositeCelltype.new_port( val[3] )   # 遅延して登録 (set_specifier 後)
    44784470                        elsif val[3].kind_of?( Cell ) then
    4479                                 # Cell.end_of_parse にて設定
     4471                                # Cell.end_of_parse にて設定
    44804472                        else
    4481               Generator.get_statement_specifier   # クリア
     4473              Generator.get_statement_specifier   # クリア
    44824474              Generator.error( "G1013 unexpected specifier"  )
    44834475                        end
     
    47564748                        if obj.kind_of?( Cell ) then
    47574749                        else
    4758               Generator.get_statement_specifier   # クリア
     4750              Generator.get_statement_specifier   # クリア
    47594751              Generator.error( "G9999 unexpected specifier"  )
    47604752                        end
     
    48544846
    48554847
    4856 # ファイル => INCLUDE("header")のé
    4857 åˆ—
     4848# ファイル => INCLUDE("header")の配列
    48584849Include = Hash.new {|hash, key| hash[key] = []}
    48594850
     
    49094900
    49104901#= TECSIO
    4911 #  Ruby2.0(1.9) 対応に伴い導å
    4912 ¥ã—たクラス
    4913 #  SJIS 以外では、ASCII-8BIT としてå
    4914 ¥åŠ›ã™ã‚‹
     4902#  Ruby2.0(1.9) 対応に伴い導入したクラス
     4903#  SJIS 以外では、ASCII-8BIT として入力する
    49154904class TECSIO
    4916   def self.foreach(file) # ブロック引数 { |line| }
    4917     pr = Proc.new   # このメソッドのブロック引数を pr に代å
    4918 ¥
     4905  def self.foreach(file) # ブロック引数 { |line| }
     4906    pr = Proc.new   # このメソッドのブロック引数を pr に代入
    49194907    if $b_no_kcode then
    49204908          msg = "E".encode $Ruby19_File_Encode
    49214909      if( $Ruby19_File_Encode == "Shift_JIS" )
    49224910
    4923         # Shift JIS は、いったん Windows-31J として読み込ませ、Shift_JIS に変換させる.
    4924         # コメント等に含まれる SJIS に不適切な文字コードは '?' または REPLACEMENT CHARACTER に変換される.
    4925         # EUC や UTF-8 で記述された CDL が混在していても、Ruby 例外が発生することなく処理を進めることができる.
    4926         # 文字コード指定が SJIS であって、文字列リテラルの中に、文字コードがSJIS 以外の非 ASCII が含まれている場合、
    4927         # Ruby 1.8 の tecsgen では文字コード指定に影響なく処理されたものが、Ruby 1.9 以降では '?' に置き換わる可能性がある.
     4911        # Shift JIS は、いったん Windows-31J として読み込ませ、Shift_JIS に変換させる.
     4912        # コメント等に含まれる SJIS に不適切な文字コードは '?' または REPLACEMENT CHARACTER に変換される.
     4913        # EUC や UTF-8 で記述された CDL が混在していても、Ruby 例外が発生することなく処理を進めることができる.
     4914        # 文字コード指定が SJIS であって、文字列リテラルの中に、文字コードがSJIS 以外の非 ASCII が含まれている場合、
     4915        # Ruby 1.8 の tecsgen では文字コード指定に影響なく処理されたものが、Ruby 1.9 以降では '?' に置き換わる可能性がある.
    49284916
    49294917        mode = "r:Windows-31J"
     
    49494937  end
    49504938
    4951   #=== 文字コードが相違する場合一致させる
    4952   # msg と str の文字コードが相違する場合、str を msg の文字コードに変換する
    4953   # 変換不可の文字コードは '?' (utf-8 の場合 U+FFFD (REPLACEMENT CHARACTER )) に変換
     4939  #=== 文字コードが相違する場合一致させる
     4940  # msg と str の文字コードが相違する場合、str を msg の文字コードに変換する
     4941  # 変換不可の文字コードは '?' (utf-8 の場合 U+FFFD (REPLACEMENT CHARACTER )) に変換
    49544942  #
    4955   # このメソッドは、エラーメッセージ出力でも使用されていることに注意.
     4943  # このメソッドは、エラーメッセージ出力でも使用されていることに注意.
    49564944  #
    49574945  #msg_enc::Encode | String
    49584946  def self.str_code_convert( msg, str )
    49594947    if $b_no_kcode == false then
    4960       return str                          # Ruby V1.8 まで
     4948      return str                          # Ruby V1.8 まで
    49614949    end
    49624950    if msg.encoding != str.encoding then
    4963       option = { :invalid => :replace, :undef => :replace }   # 例外を発生させず、'?' に変換する(utf-8 は 0xfffd)
     4951      option = { :invalid => :replace, :undef => :replace }   # 例外を発生させず、'?' に変換する(utf-8 は 0xfffd)
    49644952      # return str.encode( msg.encoding, option )
    49654953      str = str.encode( "utf-8", option )
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/bnf.y.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2016 by TOPPERS Project
    77#--
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: bnf.y.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
    5540class Generator
    5641rule
    57 # トップレベルの構文要素はcomponent_description
     42# トップレベルの構文要素はcomponent_description
    5843all: component_description
    5944
    6045# Expr
    61 ##########################  式  ##########################
    62 # K&Rの文法(プログラミング言語C 第2版 付録)と一部異なる
    63 # argument_expression_list(関数引数), assignment_expression(代å
    64 ¥)がない
    65 # 式の result は、すべてé
    66 åˆ—で第一要素が識別シンボル、第二要素以下が引数
     46##########################  式  ##########################
     47# K&Rの文法(プログラミング言語C 第2版 付録)と一部異なる
     48# argument_expression_list(関数引数), assignment_expression(代入)がない
     49# 式の result は、すべて配列で第一要素が識別シンボル、第二要素以下が引数
    6750
    6851primary_expression
     
    9275        | string_literal_list STRING_LITERAL
    9376                {
    94                         # 連接した文字列を1つの文字列にまとめる
     77                        # 連接した文字列を1つの文字列にまとめる
    9578                        str = "\"" + val[0].val.gsub( /\"(.*)\"/, "\\1" ) + val[1].val.gsub( /\"(.*)\"/, "\\1" ) + "\""
    9679                        result = Token.new( str, val[0].file, val[0].lineno, val[0].col )
    9780                }
    9881
    99 # 関数呼び出しと後置インクリメント、デクリメント演算子がない
     82# 関数呼び出しと後置インクリメント、デクリメント演算子がない
    10083postfix_expression
    10184        : primary_expression
     
    10790                { result = [ :OP_REF, val[0], val[2] ] }
    10891
    109 # 前置インクリメント、デクリメント演算子がない
     92# 前置インクリメント、デクリメント演算子がない
    11093unary_expression
    11194        : postfix_expression
     
    202185
    203186
    204 # コンマ演算子が使えない
     187# コンマ演算子が使えない
    205188expression
    206189        : conditional_expression
     
    227210
    228211# Types
    229 ##########################  宣言  ##########################
    230 # 宣言もK&Rと一部異なる
    231 
    232 # declarationはセルの属性で使われる
    233 # K&Rとの違い: storage classが指定できない、型が省略できない
     212##########################  宣言  ##########################
     213# 宣言もK&Rと一部異なる
     214
     215# declarationはセルの属性で使われる
     216# K&Rとの違い: storage classが指定できない、型が省略できない
    234217declaration
    235218        : type_specifier_qualifier_list init_declarator_list ';'
     
    241224                }
    242225
    243 # declaration_specifiersは関数のパラメータで使われるが、
    244 # type_specifier_qualifier_listで十分かもしれない
     226# declaration_specifiersは関数のパラメータで使われるが、
     227# type_specifier_qualifier_listで十分かもしれない
    245228# Oyama
    246 # const, volatile は単独で型にならないので変形
    247 # const と volatile が同å±
    248 ã™ã‚‹ã“とはないので、繰返し指定できないようにした
    249 # type_specifier も繰返し指定できるå¿
    250 è¦ã¯ãªã„ (singed など単独で型にはならない)
     229# const, volatile は単独で型にならないので変形
     230# const と volatile が同居することはないので、繰返し指定できないようにした
     231# type_specifier も繰返し指定できる必要はない (singed など単独で型にはならない)
    251232declaration_specifiers
    252233        : type_specifier
     
    268249                { val[0].set_initializer( val[2] ) }
    269250
    270 # INT8から下はK&Rにない
     251# INT8から下はK&Rにない
    271252# Oyama
    272 # signed, unsigned は単独で型にならないので、構文要素として分離
     253# signed, unsigned は単独で型にならないので、構文要素として分離
    273254type_specifier
    274255        : VOID  { result = VoidType.new }
     
    278259        | enum_specifier
    279260        | TYPE_NAME     { result = DefinedType.new( val[0].val ) }
    280 #        | IDENTIFIER   { result = DefinedType.new( val[0].val ) }   # reduce/reduce conflict が起こってしまう
     261#        | IDENTIFIER   { result = DefinedType.new( val[0].val ) }   # reduce/reduce conflict が起こってしまう
    281262        | sign_int_type
    282263        | char_type
     
    373354                }
    374355
    375 sign    # TECS では signed, unsigned 単独では型にできない
     356sign    # TECS では signed, unsigned 単独では型にできない
    376357        : SIGNED        { result = :SIGNED }
    377358        | UNSIGNED      { result = :UNSIGNED }
    378359
    379 # result[0] :CHAR などのトークン、result[1] :CONST, :VOLATILE など
     360# result[0] :CHAR などのトークン、result[1] :CONST, :VOLATILE など
    380361sign_int_type
    381362        : sign int_type
     
    386367        | int_type
    387368
    388 # K&Rのstruct_or_union_specifierに相当するが、unionは使えない
     369# K&Rのstruct_or_union_specifierに相当するが、unionは使えない
    389370struct_specifier                # mikan
    390371        : STRUCT struct_tag '{'
     
    405386                        result = val[1]
    406387                }
    407         | STRUCT struct_tag   # mikan struct_tag は namespace 対応がå¿
    408 è¦
     388        | STRUCT struct_tag   # mikan struct_tag は namespace 対応が必要
    409389                {
    410390                        StructType.set_define( false )
     
    421401                { result = StructType.new( val[0].val ) }
    422402
    423 # ポインタ修飾子を追加
     403# ポインタ修飾子を追加
    424404struct_declaration
    425405        :                                type_specifier_qualifier_list struct_declarator_list ';'
     
    456436
    457437
    458 # K&Rのspecifier_qualifier_listと同じ
    459 # 名前がまぎらわしかったのでtype_を付けた
     438# K&Rのspecifier_qualifier_listと同じ
     439# 名前がまぎらわしかったのでtype_を付けた
    460440type_specifier_qualifier_list
    461 # Oyama type_specifier を繰り返して指定することはなくなった (sign_int_type としたため)
     441# Oyama type_specifier を繰り返して指定することはなくなった (sign_int_type としたため)
    462442#        : type_specifier type_specifier_qualifier_list
    463443        : type_specifier
     
    467447                        result = val[1]
    468448                }
    469 # mikan Oyama type_qualifier だけでは型指定にならない : 構文エラーとするより、意味エラーとした方が親切
     449# mikan Oyama type_qualifier だけでは型指定にならない : 構文エラーとするより、意味エラーとした方が親切
    470450#        | type_qualifier
    471451
     
    477457                { result << val[2] }
    478458
    479 # ビットフィールドは使えない
     459# ビットフィールドは使えない
    480460struct_declarator
    481461        : declarator
    482462
    483 # enumの種類を追加
     463# enumの種類を追加
    484464enum_specifier          # mikan
    485465        : enum_type            '{' enumerator_list '}'
     
    535515                        result = val[0]
    536516                }
    537 #        | direct_declarator '(' identifier_list ')'  # これは何のためにå¿
    538 è¦ï¼Ÿ 060211
     517#        | direct_declarator '(' identifier_list ')'  # これは何のために必要? 060211
    539518        | direct_declarator '(' ')'
    540519                {
     
    569548        : parameter_list
    570549        | parameter_list ',' '...'
    571                 # mikan 可変長パラメータ
     550                # mikan 可変長パラメータ
    572551
    573552parameter_list
     
    577556                {
    578557                        val[0].add_param( val[2] )
    579                         # result = val[0] 不要
    580                 }
    581 
    582 
    583 # パラメータ修飾子を追加
     558                        # result = val[0] 不要
     559                }
     560
     561
     562# パラメータ修飾子を追加
    584563parameter_declaration
    585564#        : spec_L parameter_specifier_list spec_R declaration_specifiers declarator
     
    592571                }
    593572
    594         # 以下はエラーとする
    595         | declaration_specifiers declarator # parameter_specifier なしは扱わない
     573        # 以下はエラーとする
     574        | declaration_specifiers declarator # parameter_specifier なしは扱わない
    596575                {
    597576                        Generator.error( "G1001 need specifier for \'$1\'" , val[1].get_name )
    598577                        result = nil
    599578                }
    600         | declaration_specifiers        # 仮引数なしは、とりあえず扱わない 060210
     579        | declaration_specifiers        # 仮引数なしは、とりあえず扱わない 060210
    601580                {
    602581                        unless val[0].instance_of?( VoidType ) then
     
    605584                        result = nil
    606585                }
    607 #        | '[' parameter_specifier_list ']' declaration_specifiers # 同 060210
    608         | parameter_specifier_list_bracket declaration_specifiers # 同 060210
     586#        | '[' parameter_specifier_list ']' declaration_specifiers # 060210
     587        | parameter_specifier_list_bracket declaration_specifiers # 060210
    609588                {
    610589                        unless val[1].instance_of?( VoidType ) then
     
    647626                                result = val[1]
    648627                        else
    649                                 # エラー:仮で val[0] を返す
     628                                # エラー:仮で val[0] を返す
    650629                                result = val[0]
    651630                        end
    652631                }
    653                 # mikan abstract_declarator が pointer 以外ではうまく動かない、とりあえず '*' CAST のみ救った
     632                # mikan abstract_declarator が pointer 以外ではうまく動かない、とりあえず '*' CAST のみ救った
    654633
    655634abstract_declarator             # mikan
     
    660639direct_abstract_declarator
    661640        : '(' abstract_declarator ')'
    662                 { result = val[1] }  # 関数ポインタ型を救う
     641                { result = val[1] }  # 関数ポインタ型を救う
    663642        | '[' ']'
    664643                {
     
    699678                }
    700679
    701 # assignment_expressionをconstant_expressionに変更
     680# assignment_expressionをconstant_expressionに変更
    702681initializer                     # mikan
    703682        : constant_expression
     
    723702
    724703
    725 ##########################  ここからはCDL独自  ##########################
    726 
    727 #トップレベルの構文規則
    728 #コンポーネント記述
     704##########################  ここからはCDL独自  ##########################
     705
     706#トップレベルの構文規則
     707#コンポーネント記述
    729708component_description
    730709        : component_description specified_statement
     
    738717                        obj = val[3]
    739718                        if obj.kind_of?( Cell ) || obj.kind_of?( Signature ) || obj.kind_of?( Celltype ) || obj.kind_of?( CompositeCelltype )then
    740                                 # cell, signature 以外は、指定子を置けない
     719                                # cell, signature 以外は、指定子を置けない
    741720                        else
    742               Generator.get_statement_specifier   # クリア
     721              Generator.get_statement_specifier   # クリア
    743722              Generator.error( "G1009 unexpected specifier"  )
    744723                        end
    745724                }
    746                 # これと同じ記述が composite_celltype にもある
     725                # これと同じ記述が composite_celltype にもある
    747726
    748727statement
     
    760739        | import_C
    761740        | signature_plugin
    762         | error   # エラー回復ポイント
     741        | error   # エラー回復ポイント
    763742
    764743       
     
    799778        | IDENTIFIER '[' constant_expression ']' '.' IDENTIFIER '.' IDENTIFIER '=' initializer
    800779                {  result = [ :NORMAL_ALLOC, val[0], val[2], val[5], val[7], val[9] ] }
    801 # mikan 将来的な拡張 ('*' でまとめて指定可能とする)
     780# mikan 将来的な拡張 ('*' でまとめて指定可能とする)
    802781#        | IDENTIFIER '.' IDENTIFIER '.' '*'        '=' initializer
    803782#               {  result = [ val[0], val[ ], val[ ], val[ ] ] }
     
    824803
    825804const_statement
    826         : declaration   # 定数定義
     805        : declaration   # 定数定義
    827806                {
    828807                        val[0].each { |decl|
     
    879858                        }
    880859                }
    881                 # mikan   typedef_specifier 未処置
     860                # mikan   typedef_specifier 未処置
    882861
    883862
     
    899878        : IDENTIFIER
    900879                {result = Namespace.new(val[0].val)}
    901                 # namespace インスタンスに statement を記憶させるためここで生成
     880                # namespace インスタンスに statement を記憶させるためここで生成
    902881
    903882statement_list
     
    911890                { result = val[0].append!( val[2].val ) }
    912891
    913 #シグニチャ
     892#シグニチャ
    914893signature
    915894        : SIGNATURE signature_name '{' function_head_list '}' ';'
     
    920899                {result = Signature.new( val[0].val ) }
    921900
    922 function_head_list     # result:  function_head のé
    923 åˆ—
     901function_head_list     # result:  function_head の配列
    924902#        : function_head
    925903#               { result = NamedList.new( val[0], "function" ) }
     
    938916                                val[1].check
    939917                        else
    940                                 # mikan 関数のé
    941 åˆ—も以下のメッセージになる
     918                                # mikan 関数の配列も以下のメッセージになる
    942919                                Generator.error( "G1010 Not function"  )
    943920                                result = nil
     
    955932
    956933
    957 #セルタイプ
     934#セルタイプ
    958935celltype
    959936        : CELLTYPE celltype_name '{' celltype_statement_list '}' ';'
     
    981958                {
    982959                        if val[3].kind_of? Port then
    983                                 val[3].set_specifier val[1]  # 設定順序あり
     960                                val[3].set_specifier val[1]  # 設定順序あり
    984961                                Celltype.new_port( val[3] )
    985962                        else
    986                                 # Port 以外では指定子はエラー
     963                                # Port 以外では指定子はエラー
    987964                                Generator.error( "G1012 $1 : cannot put specifier here" , val[1] )
    988965                        end
     
    995972        | require
    996973        | factory
    997 #        | error       # エラー回復ポイント  (#513 無限ループに陥るケースがあるので、ここでのエラー回復は取りやめ)
     974#        | error       # エラー回復ポイント  (#513 無限ループに陥るケースがあるので、ここでのエラー回復は取りやめ)
    998975
    999976celltype_statement_specifier_list
     
    1012989
    1013990alloc_list2
    1014         : alloc2                        { result = [ val[0] ] }    # 受け口のアロケータ指定
    1015         | alloc                         { result = [ val[0] ] }    # å†
    1016 éƒ¨ã‚»ãƒ«ã®ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿æŒ‡å®š
     991        : alloc2                        { result = [ val[0] ] }    # 受け口のアロケータ指定
     992        | alloc                         { result = [ val[0] ] }    # 内部セルのアロケータ指定
    1017993        | alloc_list2 ',' alloc2        { result << val[2] }
    1018994        | alloc_list2 ',' alloc         { result << val[2] }
    1019995
    1020996alloc2
    1021         : IDENTIFIER '.' IDENTIFIER '=' initializer    # å†
    1022 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ (デバドラ向きアロケータ)指定
     997        : IDENTIFIER '.' IDENTIFIER '=' initializer    # 内部アロケータ (デバドラ向きアロケータ)指定
    1023998                {  result = [ :INTERNAL_ALLOC, val[0].val, val[2].val, val[4] ] }
    1024         | IDENTIFIER '.' IDENTIFIER '<=' initializer   # 多段リレーモデル向きアロケータ指定
     999        | IDENTIFIER '.' IDENTIFIER '<=' initializer   # 多段リレーモデル向きアロケータ指定
    10251000                {  result = [ :RELAY_ALLOC, val[0].val, val[2].val, val[4] ] }
    10261001
    10271002
    1028 #呼び口、受け口
     1003#呼び口、受け口
    10291004port
    10301005        : port_type namespace_signature_name port_name ';'
     
    10521027
    10531028
    1054 #属性
     1029#属性
    10551030attribute
    10561031        : ATTRIBUTE '{' attribute_declaration_list '}' ';'
     
    10761051                {
    10771052                        val[3].each{ |i|       # i:Decl
    1078                                 i.set_kind( :ATTRIBUTE )   # 設定順序あり
     1053                                i.set_kind( :ATTRIBUTE )   # 設定順序あり
    10791054                                i.set_specifier_list( [val[1]] )
    10801055                                i.check
     
    10951070        : STRING_LITERAL
    10961071
    1097 #å†
    1098 éƒ¨å¤‰æ•°
     1072#内部変数
    10991073var
    11001074        : VAR '{' var_declaration_list '}' ';'
     
    11181092                {
    11191093                        val[3].each{ |i|       # i:Decl
    1120                                 i.set_kind( :VAR )   # 設定順序あり
     1094                                i.set_kind( :VAR )   # 設定順序あり
    11211095                                i.set_specifier_list( [val[1]] )
    11221096                                i.check
     
    11281102        : SIZE_IS  '(' expression ')'   { result = [:SIZE_IS,val[2]] }
    11291103
    1130 # リクワイア
     1104# リクワイア
    11311105require
    11321106        : REQUIRE namespace_identifier '.' IDENTIFIER';'                            # mikan namespace #1
     
    11391113                }
    11401114
    1141 #ファクトリ
     1115#ファクトリ
    11421116factory
    11431117        : factory_head '{' factory_function_list '}' ';'
     
    11481122
    11491123factory_function_list
    1150         :                                         # 空
     1124        :                                         #
    11511125        | factory_function_list factory_function
    11521126
     
    11601134        : IDENTIFIER
    11611135
    1162 arg_list     # factory の write 関数の第三引数以降
     1136arg_list     # factory の write 関数の第三引数以降
    11631137        : IDENTIFIER
    11641138                { result = [ [ :IDENTIFIER, val[0].val ] ] }
     
    11701144                { result << [ :STRING_LITERAL, val[2].val ] }
    11711145
    1172 #セル生成
     1146#セル生成
    11731147cell
    11741148        : CELL namespace_celltype_name cell_name '{'
     
    11761150          join_list '}' ';'
    11771151                { result = Cell.end_of_parse true }
    1178         | CELL namespace_celltype_name cell_name ';'   # oyama プロトタイプ宣言
     1152        | CELL namespace_celltype_name cell_name ';'   # oyama プロトタイプ宣言
    11791153                        { result = Cell.end_of_parse false }
    11801154
     
    11881162
    11891163join_list
    1190         :   # 空行  061007
     1164        :   # 空行  061007
    11911165        | join_list specified_join
    11921166        | join_list reverse_join
     
    12311205                        Cell.new_join( result, true )
    12321206                }
    1233         | cae_name '=' initializer ';'     # 初期化子: '{', '}' も可
     1207        | cae_name '=' initializer ';'     # 初期化子: '{', '}' も可
    12341208                {
    12351209                        result = Join.new( val[0].val, nil, val[2] )
     
    12751249        : constant_expression
    12761250
    1277 #複合種
     1251#複合種
    12781252composite_celltype
    12791253        : COMPOSITE composite_celltype_name '{' composite_celltype_statement_list '}' ';'
     
    12951269                {
    12961270                        if val[0].kind_of?( Port ) then
    1297                                 CompositeCelltype.new_port( val[0] )   # é
    1298 å»¶ã—て登録
     1271                                CompositeCelltype.new_port( val[0] )   # 遅延して登録
    12991272                        end
    13001273                }
     
    13021275                {
    13031276                        if val[3].kind_of?( Port ) then
    1304                                 # port 以外 val[3] に有効な値がå
    1305 ¥ã£ã¦ã„ないので、以下のメソッドを適用できない
    1306                                 # 現状 port, cell 以外は指定子を受け付けない
    1307                                 # (しかし将来他の文も指定子を受け付ける可能性があるので、この位置に記述する)
     1277                                # port 以外 val[3] に有効な値が入っていないので、以下のメソッドを適用できない
     1278                                # 現状 port, cell 以外は指定子を受け付けない
     1279                                # (しかし将来他の文も指定子を受け付ける可能性があるので、この位置に記述する)
    13081280                                val[3].set_specifier( Generator.get_statement_specifier )
    1309                                 CompositeCelltype.new_port( val[3] )   # é
    1310 å»¶ã—て登録 (set_specifier 後)
     1281                                CompositeCelltype.new_port( val[3] )   # 遅延して登録 (set_specifier 後)
    13111282                        elsif val[3].kind_of?( Cell ) then
    1312                                 # Cell.end_of_parse にて設定
     1283                                # Cell.end_of_parse にて設定
    13131284                        else
    1314               Generator.get_statement_specifier   # クリア
     1285              Generator.get_statement_specifier   # クリア
    13151286              Generator.error( "G1013 unexpected specifier"  )
    13161287                        end
     
    13221293        | internal_cell
    13231294        | export_join
    1324 #        | error       # エラー回復ポイント  (#513 無限ループに陥るケースがあるので、ここでのエラー回復は取りやめ)
     1295#        | error       # エラー回復ポイント  (#513 無限ループに陥るケースがあるので、ここでのエラー回復は取りやめ)
    13251296
    13261297composite_celltype_statement_specifier_list
     
    13451316                }
    13461317
    1347 #属性
     1318#属性
    13481319composite_attribute
    13491320        : ATTRIBUTE '{' composite_attribute_declaration_list '}' ';'
     
    13761347
    13771348internal_join_list
    1378         :   # 空行  061007
     1349        :   # 空行  061007
    13791350        | internal_join_list specified_join
    13801351        | internal_join_list external_join
    13811352
    1382 external_join  # cell å†
    1383 ã«è¨˜è¿°ã™ã‚‹å‘¼ã³å£ã®å¤–部結合
     1353external_join  # cell 内に記述する呼び口の外部結合
    13841354        : internal_cell_elem_name '=>' COMPOSITE '.' export_name ';'
    13851355                {       Cell.external_join( val[0].val, val[4].val, true )      }
    13861356        | internal_cell_elem_name '=>' export_name ';'
    13871357                {       Cell.external_join( val[0].val, val[2].val, false )     }
    1388         # 以前の文法では、呼び口側も cell の外に記述していた
    1389         # その時の実è£
    1390 ã‚’
    1391 
    1392 export_join    # cell 外に記述する受け口の外部結合
     1358        # 以前の文法では、呼び口側も cell の外に記述していた
     1359        # その時の実装を
     1360
     1361export_join    # cell 外に記述する受け口の外部結合
    13931362        : export_name '=>' internal_ref_cell_name '.' internal_cell_elem_name ';'
    13941363                {
     
    14111380        : IDENTIFIER
    14121381
    1413 # リージョン
     1382# リージョン
    14141383region
    14151384        : spec_L region_specifier_list spec_R REGION region_name '{'  region_statement '}' ';'
     
    14261395        : IN_THROUGH '(' plugin_name ',' plugin_arg ')'
    14271396                { Region.new_in_through( val[2].val, val[4].val ) }
    1428         | IN_THROUGH '(' ')'   # in 許可
     1397        | IN_THROUGH '(' ')'   # in 許可
    14291398                { Region.new_in_through }
    14301399        | OUT_THROUGH '(' plugin_name ',' plugin_arg ')'
    14311400                { Region.new_out_through( val[2].val, val[4].val ) }
    1432         | OUT_THROUGH '(' ')'  # out 許可
     1401        | OUT_THROUGH '(' ')'  # out 許可
    14331402                { Region.new_out_through() }
    14341403        | TO_THROUGH '(' namespace_region_name ',' plugin_name ',' plugin_arg ')'
    14351404                { Region.new_to_through( val[2], val[4].val, val[6].val ) }
    1436         | TO_THROUGH '('namespace_region_name ')'  # to 許可
     1405        | TO_THROUGH '('namespace_region_name ')'  # to 許可
    14371406                { Region.new_to_through( val[2], nil, nil ) }
    14381407        | NODE
     
    14611430                        if obj.kind_of?( Cell ) then
    14621431                        else
    1463               Generator.get_statement_specifier   # クリア
     1432              Generator.get_statement_specifier   # クリア
    14641433              Generator.error( "G9999 unexpected specifier"  )
    14651434                        end
     
    14801449namespace_region_name
    14811450         : :IDENTIFIER
    1482                 { result = [ val[0].val ] }  # mikan é
    1483 åˆ—であるå¿
    1484 è¦ã¯ãªã„
     1451                { result = [ val[0].val ] }  # mikan 配列である必要はない
    14851452#        : namespace_identifier
    14861453
    1487 # 指定子の括弧 (in, out などのキーワード切り替えのため分離)
     1454# 指定子の括弧 (in, out などのキーワード切り替えのため分離)
    14881455spec_L
    14891456        : '['  { set_in_specifier }
     
    16201587  }
    16211588
    1622   # 指定子 '[]' å†
    1623 ã§ã®ã¿ä½¿ç”¨ã§ãã‚‹ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰
     1589  # 指定子 '[]' 内でのみ使用できるキーワード
    16241590  RESERVED2 = {
    16251591    # specifier
     
    16381604    # port (entry)
    16391605    'inline' => :INLINE,
    1640     'ref_desc' => :REF_DESC,   # call も可
     1606    'ref_desc' => :REF_DESC,   # call も可
    16411607
    16421608    # port (call)
     
    16821648  }
    16831649
    1684   # 再帰的なパーサのためのスタック
     1650  # 再帰的なパーサのためのスタック
    16851651  @@generator_nest = -1
    16861652  @@generator_stack = []
    16871653  @@current_locale = []
    16881654
    1689   # import_C 中である
     1655  # import_C 中である
    16901656  @@import_C = false
    16911657
    1692   # すべての構文解析が完了した
     1658  # すべての構文解析が完了した
    16931659  @@b_end_all_parse = false
    16941660
    16951661  def self.parse( file_name, plugin = nil, b_reuse = false )
    1696     # パーサインスタンスを生成(別パーサで読み込む)
     1662    # パーサインスタンスを生成(別パーサで読み込む)
    16971663    parser = Generator.new
    16981664
    1699     # plugin から import されている場合の plugin 設定
     1665    # plugin から import されている場合の plugin 設定
    17001666    parser.set_plugin plugin
    17011667
    1702     # reuse フラグを設定
     1668    # reuse フラグを設定
    17031669    parser.set_reuse b_reuse
    17041670
    1705     # cdl をパース
     1671    # cdl をパース
    17061672    parser.parse( [file_name] )
    17071673
    1708     # 終期化 パーサスタックを戻す
     1674    # 終期化 パーサスタックを戻す
    17091675    parser.finalize
    17101676  end
     
    17261692  def self.get_plugin
    17271693    if @@generator_stack[@@generator_nest] then
    1728       # tecsgen 引数の cdl が import される場合は nil
     1694      # tecsgen 引数の cdl が import される場合は nil
    17291695      return @@generator_stack[@@generator_nest].get_plugin
    17301696    else
     
    17431709  def self.is_reuse?
    17441710    if @@generator_stack[@@generator_nest] then
    1745       # tecsgen 引数の cdl が import される場合は nil
     1711      # tecsgen 引数の cdl が import される場合は nil
    17461712      return @@generator_stack[@@generator_nest].is_reuse?
    17471713    else
     
    17731739      b_in_string = false
    17741740
    1775       # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
     1741      # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
    17761742      TECS_LANG::set_kcode_binary
    17771743
     
    17831749          TECSIO.foreach(file) {|line|
    17841750            col = 1
    1785 #            line.rstrip!         æ”¹è¡Œå«ã‚€æ–‡å­—列を扱うようになったので、ここで空白を取り除けなくなった
     1751#            line.rstrip!         改行含む文字列を扱うようになったので、ここで空白を取り除けなくなった
    17861752
    17871753            until line.empty?
     
    17891755              if b_in_comment
    17901756                case line
    1791                   # コメント終了
     1757                  # コメント終了
    17921758                when /\A\*\//
    17931759                  b_in_comment = false
    17941760                when /\A./
    17951761                  ;
    1796                 when /\s+/     # line.rstrip! を止めたため \n などの空白文字とまっちするルールがå¿
    1797 è¦ã«ãªã£ãŸ
     1762                when /\s+/     # line.rstrip! を止めたため \n などの空白文字とまっちするルールが必要になった
    17981763                  ;
    17991764                end
     
    18031768                  @q <<  [:STRING_LITERAL, Token.new(string, file, lineno, col)]
    18041769                  b_in_string = false
    1805                 elsif line =~ /\A.*\\\n/     # 改行 \n は '.' にマッチしない
     1770                elsif line =~ /\A.*\\\n/     # 改行 \n は '.' にマッチしない
    18061771                  string += $&
    1807                 elsif line =~ /\A.*\n/     # 改行 \n は '.' にマッチしない
     1772                elsif line =~ /\A.*\n/     # 改行 \n は '.' にマッチしない
    18081773                  string += line
    1809                   # この位置では error メソッドは使えない (token 読出し前)
     1774                  # この位置では error メソッドは使えない (token 読出し前)
    18101775                  puts "error: #{file} line #{lineno}: string literal has newline without escape"
    18111776                  @@n_error += 1
     
    18131778              else
    18141779                case line
    1815                 # 空白、プリプロセスディレクティブ
     1780                # 空白、プリプロセスディレクティブ
    18161781                when /\A\s+/
    18171782                  ;
    1818                 # 識別子
     1783                # 識別子
    18191784                when /\A[a-zA-Z_]\w*/
    18201785                  word = $&
    18211786                  @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)]
    1822                 # 16 進数定数
     1787                # 16 進数定数
    18231788                when /\A0x[0-9A-Fa-f]+/
    18241789                  @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)]
    1825                 # 8 進数定数
     1790                # 8 進数定数
    18261791                when /\A0[0-7]+/
    18271792                  @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)]
    1828                 # 浮動小数定数
     1793                # 浮動小数定数
    18291794                when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/
    18301795                  @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
    1831                 # 整数定数
     1796                # 整数定数
    18321797                when /\A\d+/
    18331798                  @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)]
    1834                 # 文字定数
     1799                # 文字定数
    18351800                when /\A'(?:[^'\\]|\\.)'/
    18361801                  @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)]
    1837                 # 文字列
    1838 #                "#include  #include #include \"../systask/logtask.cfg\"       æœ€å¾Œã® " 忘れ)で無限ループ
     1802                # 文字列
     1803#                "#include  #include #include \"../systask/logtask.cfg\"       最後の " 忘れ)で無限ループ
    18391804#                when /\A"(?:[^"\\]+|\\.)*"/
    1840                 when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
     1805                when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
    18411806                  @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)]
    1842                 # 文字列 (改行あり)
     1807                # 文字列 (改行あり)
    18431808                when /\A"(?:[^"\\]|\\.)*\\\n$/
    18441809                  string = $&
    18451810                  b_in_string = true
    1846                 # 文字列 (改行あり, escape なし)
     1811                # 文字列 (改行あり, escape なし)
    18471812                when /\A("(?:[^"\\]|\e\.)*)\n$/
    18481813                  string = $1 + "\\\n"
    18491814                  b_in_string = true
    1850                   # この位置では error メソッドは使えない (token 読出し前) # mikan cdl_error ではない
     1815                  # この位置では error メソッドは使えない (token 読出し前) # mikan cdl_error ではない
    18511816                  puts "error: #{file} line #{lineno}: string literal has newline without escape"
    18521817                  @@n_error += 1
    1853                 # 山括弧で囲まれた文字列
     1818                # 山括弧で囲まれた文字列
    18541819                when /\A<[0-9A-Za-z_\. \/]+>/   # AB: angle bracke
    18551820                  @q << [:AB_STRING_LITERAL, Token.new($&, file, lineno, col)]
    1856                 # 行コメント
     1821                # 行コメント
    18571822                when /\A\/\/.*$/
    1858                   # 読み飛ばすだけ
    1859                 # コメント開始
     1823                  # 読み飛ばすだけ
     1824                # コメント開始
    18601825                when /\A\/\*/
    18611826                  b_in_comment = true
    1862                 # '>>', '<<' など
     1827                # '>>', '<<' など
    18631828                when /\A>>/, /\A<</, /\A==/, /\A!=/, /\A\&\&/, /\A\|\|/
    18641829                  @q << [$&, Token.new($&, file, lineno, col)]
    18651830                when /\A::/, /\A=>/, /\A<=/, /\A>=/
    18661831                  @q << [$&, Token.new($&, file, lineno, col)]
    1867                 # '(', ')' など一文字の記号、または未知の記号
     1832                # '(', ')' など一文字の記号、または未知の記号
    18681833                when /\A./
    18691834                  @q << [$&, Token.new($&, file, lineno, col)]
     
    18891854      }
    18901855
    1891       # 終了の印
     1856      # 終了の印
    18921857      @q << nil
    18931858
     
    19091874
    19101875      if token[0] == :IDENTIFIER then
    1911         # TYPE_NAME トークンへ置換え
     1876        # TYPE_NAME トークンへ置換え
    19121877        if Namespace.is_typename?( token[1].val ) then
    19131878          token[0] = :TYPE_NAME
    19141879        elsif @in_specifier && RESERVED2[ token[1].val.to_s ] then
    1915           # 指定子キーワード( '[', ']' å†
    1916 ã§ã®ã¿æœ‰åŠ¹)
     1880          # 指定子キーワード( '[', ']' 内でのみ有効)
    19171881          token[0] = RESERVED2[ token[1].val.to_s ]
    19181882        end
    19191883      end
    19201884
    1921       if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
     1885      if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
    19221886        locale = @@current_locale[@@generator_nest]
    19231887        if token then
     
    19501914  @@n_warning = 0
    19511915
    1952   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
     1916  # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
    19531917  def self.error( msg, *arg )
    19541918    locale = nil
     
    19601924
    19611925    msg = TECSMsg.get_error_message( msg )
    1962     # $1, $2, ... を arg で置換
     1926    # $1, $2, ... を arg で置換
    19631927    count = 1
    19641928    arg.each{ |a|
     
    19681932    }
    19691933
    1970     # import_C の中でのエラー?
     1934    # import_C の中でのエラー?
    19711935    if @@import_C then
    19721936      C_parser.error( msg )
    19731937    else
    19741938
    1975       # Node の記憶する 位置 (locale) を使用した場合、変更以前に比べ、
    1976       # 問題発生箇所と異なる位置にエラーが出るため、構文解析中のエラー
    1977       # は、解析中の位置を出力する.(new_XXX で owner が子要素のチェッ
    1978       # クをすると owner の行番号が出てしまう点で、ずれが生じている)
     1939      # Node の記憶する 位置 (locale) を使用した場合、変更以前に比べ、
     1940      # 問題発生箇所と異なる位置にエラーが出るため、構文解析中のエラー
     1941      # は、解析中の位置を出力する.(new_XXX で owner が子要素のチェッ
     1942      # クをすると owner の行番号が出てしまう点で、ずれが生じている)
    19791943
    19801944      if @@b_end_all_parse == false || locale == nil then
     
    19891953  end
    19901954
    1991   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
     1955  # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
    19921956  def self.warning( msg, *arg )
    19931957    locale = nil
     
    19991963
    20001964    msg = TECSMsg.get_warning_message( msg )
    2001     # $1, $2, ... を arg で置換
     1965    # $1, $2, ... を arg で置換
    20021966    count = 1
    20031967    arg.each{ |a|
     
    20071971    }
    20081972
    2009     # import_C の中でのウォーニング?
     1973    # import_C の中でのウォーニング?
    20101974    if @@import_C then
    20111975      C_parser.warning( msg )
     
    20341998  end
    20351999
    2036   #===  '[' specifier 始め
     2000  #===  '[' specifier 始め
    20372001  def set_in_specifier
    20382002    # p "set_in_specifier"
     
    20402004  end
    20412005
    2042   #=== ']' specifier 終わり
     2006  #=== ']' specifier 終わり
    20432007  def unset_in_specifier
    20442008    # p "unset_in_specifier"
     
    20462010  end
    20472011
    2048   # statement_specifier は構文解釈途中で参ç
    2049 §ã—たいため
     2012  # statement_specifier は構文解釈途中で参照したいため
    20502013  @@statement_specifier_stack = []
    20512014  def self.add_statement_specifier( ss )
     
    20642027  end
    20652028
    2066   #=== すべての構文解析が完了したことを報告
     2029  #=== すべての構文解析が完了したことを報告
    20672030  def self.end_all_parse
    20682031    @@b_end_all_parse = true
     
    20722035
    20732036
    2074 # ファイル => INCLUDE("header")のé
    2075 åˆ—
     2037# ファイル => INCLUDE("header")の配列
    20762038Include = Hash.new {|hash, key| hash[key] = []}
    20772039
     
    21272089
    21282090#= TECSIO
    2129 #  Ruby2.0(1.9) 対応に伴い導å
    2130 ¥ã—たクラス
    2131 #  SJIS 以外では、ASCII-8BIT としてå
    2132 ¥åŠ›ã™ã‚‹
     2091#  Ruby2.0(1.9) 対応に伴い導入したクラス
     2092#  SJIS 以外では、ASCII-8BIT として入力する
    21332093class TECSIO
    2134   def self.foreach(file) # ブロック引数 { |line| }
    2135     pr = Proc.new   # このメソッドのブロック引数を pr に代å
    2136 ¥
     2094  def self.foreach(file) # ブロック引数 { |line| }
     2095    pr = Proc.new   # このメソッドのブロック引数を pr に代入
    21372096    if $b_no_kcode then
    21382097          msg = "E".encode $Ruby19_File_Encode
    21392098      if( $Ruby19_File_Encode == "Shift_JIS" )
    21402099
    2141         # Shift JIS は、いったん Windows-31J として読み込ませ、Shift_JIS に変換させる.
    2142         # コメント等に含まれる SJIS に不適切な文字コードは '?' または REPLACEMENT CHARACTER に変換される.
    2143         # EUC や UTF-8 で記述された CDL が混在していても、Ruby 例外が発生することなく処理を進めることができる.
    2144         # 文字コード指定が SJIS であって、文字列リテラルの中に、文字コードがSJIS 以外の非 ASCII が含まれている場合、
    2145         # Ruby 1.8 の tecsgen では文字コード指定に影響なく処理されたものが、Ruby 1.9 以降では '?' に置き換わる可能性がある.
     2100        # Shift JIS は、いったん Windows-31J として読み込ませ、Shift_JIS に変換させる.
     2101        # コメント等に含まれる SJIS に不適切な文字コードは '?' または REPLACEMENT CHARACTER に変換される.
     2102        # EUC や UTF-8 で記述された CDL が混在していても、Ruby 例外が発生することなく処理を進めることができる.
     2103        # 文字コード指定が SJIS であって、文字列リテラルの中に、文字コードがSJIS 以外の非 ASCII が含まれている場合、
     2104        # Ruby 1.8 の tecsgen では文字コード指定に影響なく処理されたものが、Ruby 1.9 以降では '?' に置き換わる可能性がある.
    21462105
    21472106        mode = "r:Windows-31J"
     
    21672126  end
    21682127
    2169   #=== 文字コードが相違する場合一致させる
    2170   # msg と str の文字コードが相違する場合、str を msg の文字コードに変換する
    2171   # 変換不可の文字コードは '?' (utf-8 の場合 U+FFFD (REPLACEMENT CHARACTER )) に変換
     2128  #=== 文字コードが相違する場合一致させる
     2129  # msg と str の文字コードが相違する場合、str を msg の文字コードに変換する
     2130  # 変換不可の文字コードは '?' (utf-8 の場合 U+FFFD (REPLACEMENT CHARACTER )) に変換
    21722131  #
    2173   # このメソッドは、エラーメッセージ出力でも使用されていることに注意.
     2132  # このメソッドは、エラーメッセージ出力でも使用されていることに注意.
    21742133  #
    21752134  #msg_enc::Encode | String
    21762135  def self.str_code_convert( msg, str )
    21772136    if $b_no_kcode == false then
    2178       return str                          # Ruby V1.8 まで
     2137      return str                          # Ruby V1.8 まで
    21792138    end
    21802139    if msg.encoding != str.encoding then
    2181       option = { :invalid => :replace, :undef => :replace }   # 例外を発生させず、'?' に変換する(utf-8 は 0xfffd)
     2140      option = { :invalid => :replace, :undef => :replace }   # 例外を発生させず、'?' に変換する(utf-8 は 0xfffd)
    21822141      # return str.encode( msg.encoding, option )
    21832142      str = str.encode( "utf-8", option )
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/componentobj.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2016 by TOPPERS Project
    77#--
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: componentobj.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
    5540# STAGE:
    56 # このメンテナンス状況はよろしくない
    57 #  B    bnf.y.rb から呼出される
    58 #  P    parse 段階で呼出される(bnf.y.rb から直接呼出されるわけではないが、構文木生成を行う)
    59 #  S    P の中から呼出されるが、構文木生成するわけではなく意味チェックする
    60 #  G    コード生成(この段階で、構文木は完å
    61 ¨ã§ã‚る.不完å
    62 ¨ãªã‚‰ã‚¨ãƒ©ãƒ¼ã§æ‰“ちきられている)
    63 #                                                   factory の第一引数 "format" の後ろの引数
    64 
    65 # mikan 以下は ruby の mix in で実現できるかもしれない
    66 # Nestable を継承した場合、クラス変数は Nestable のものがå
    67 ±æœ‰ã•ã‚Œã‚‹ï¼ˆåˆ¥ã«ã—たかった)
     41# このメンテナンス状況はよろしくない
     42#  B    bnf.y.rb から呼出される
     43#  P    parse 段階で呼出される(bnf.y.rb から直接呼出されるわけではないが、構文木生成を行う)
     44#  S    P の中から呼出されるが、構文木生成するわけではなく意味チェックする
     45#  G    コード生成(この段階で、構文木は完全である.不完全ならエラーで打ちきられている)
     46#                                                   factory の第一引数 "format" の後ろの引数
     47
     48# mikan 以下は ruby の mix in で実現できるかもしれない
     49# Nestable を継承した場合、クラス変数は Nestable のものが共有される(別にしたかった)
    6850# class Nestable
    6951#   @@nest_stack_index = -1
     
    9072#  @name:: Symbol
    9173#  @global_name:: Symbol
    92 #  @function_head_list:: NamedList : FuncHead のインスタンスが要素
    93 #  @func_name_to_id::  {String}  :  関数名を添字とするé
    94 åˆ—で id を記憶する.id は signature の出現順番 (1から始まる)
    95 #  @context:: string : コンテキスト名
    96 #  @b_callback:: bool: callback : コールバック用のシグニチャ
    97 #  @b_deviate:: bool: deviate : 逸脱(pointer level mismatch を出さない)
    98 #  @b_checked_as_allocator_signature:: bool:  アロケータシグニチャとしてチェック済み
    99 #  @b_empty:: Bool: 空(関数が一つもない状æ
    100 ‹)
     74#  @function_head_list:: NamedList : FuncHead のインスタンスが要素
     75#  @func_name_to_id::  {String}  :  関数名を添字とする配列で id を記憶する.id は signature の出現順番 (1から始まる)
     76#  @context:: string : コンテキスト名
     77#  @b_callback:: bool: callback : コールバック用のシグニチャ
     78#  @b_deviate:: bool: deviate : 逸脱(pointer level mismatch を出さない)
     79#  @b_checked_as_allocator_signature:: bool:  アロケータシグニチャとしてチェック済み
     80#  @b_empty:: Bool: 空(関数が一つもない状態)
    10181
    10282  @@nest_stack_index = -1
     
    11999
    120100  # STAGE: P
    121   # このメソッドは parse 中のみ呼び出される
     101  # このメソッドは parse 中のみ呼び出される
    122102  def self.get_current
    123103    @@current_object
     
    130110    @name = name
    131111    Namespace.new_signature( self )
    132     set_namespace_path # @NamespacePath の設定
     112    set_namespace_path # @NamespacePath の設定
    133113    if "#{Namespace.get_global_name}" == "" then
    134114      @global_name = @name
     
    152132    @function_head_list = function_head_list
    153133
    154     # id を割付ける
     134    # id を割付ける
    155135    id = 1
    156136    function_head_list.get_items.each{ |f|
     
    166146  end
    167147
    168   #=== Signature# signature の指定子を設定
     148  #=== Signature# signature の指定子を設定
    169149  # STAGE: B
    170150  #spec_list::      [ [ :CONTEXT,  String ], ... ]
    171151  #                     s[0]        s[1]
    172152  def set_specifier_list( spec_list )
    173     return if spec_list == nil  # 空ならば何もしない
     153    return if spec_list == nil  # 空ならば何もしない
    174154
    175155    spec_list.each { |s|
     
    216196  end
    217197
    218   #=== Signature# 関数名から signature å†
    219 ã® id を得る
     198  #=== Signature# 関数名から signature 内の id を得る
    220199  def get_id_from_func_name func_name
    221200    @func_name_to_id[ func_name ]
    222201  end
    223202
    224   #=== Signature# context を得る
    225   # context 文字列を返す "task", "non-task", "any"
    226   # 未指定時のデフォルトとして task を返す
     203  #=== Signature# context を得る
     204  # context 文字列を返す "task", "non-task", "any"
     205  # 未指定時のデフォルトとして task を返す
    227206  def get_context
    228207    if @context then
     
    233212  end
    234213
    235   #=== Signature# signaure のすべての関数のすべてのパラメータをたどる
    236   #block:: ブロックを引数に取る
    237   # ブロックは2つの引数を受け取る  Decl, ParamDecl     ( Decl: 関数ヘッダ )
    238   # Port クラスにも each_param がある(同じ働き)
    239   def each_param # ブロック引数 { |func_decl, param_decl| }
    240     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    241 åˆ—
    242     return if fha == nil                                # nil なら文法エラーで有効値が設定されなかった
    243 
    244     pr = Proc.new   # このメソッドのブロック引数を pr に代å
    245 ¥
    246     fha.each{ |fh|  # fh: FuncHead                      # 関数é
    247 åˆ—中の各関数頭部
    248       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    249       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    250         fd.get_type.get_paramlist.get_items.each{ |par| # すべてのパラメータについて
     214  #=== Signature# signaure のすべての関数のすべてのパラメータをたどる
     215  #block:: ブロックを引数に取る
     216  # ブロックは2つの引数を受け取る  Decl, ParamDecl     ( Decl: 関数ヘッダ )
     217  # Port クラスにも each_param がある(同じ働き)
     218  def each_param # ブロック引数 { |func_decl, param_decl| }
     219    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
     220    return if fha == nil                                # nil なら文法エラーで有効値が設定されなかった
     221
     222    pr = Proc.new   # このメソッドのブロック引数を pr に代入
     223    fha.each{ |fh|  # fh: FuncHead                      # 関数配列中の各関数頭部
     224      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     225      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     226        fd.get_type.get_paramlist.get_items.each{ |par| # すべてのパラメータについて
    251227          pr.call( fd, par )
    252228        }
     
    255231  end
    256232
    257   #=== Signature# 正当なアロケータ シグニチャかテストする
    258   # alloc, dealloc 関数を持つかどうか、第一引き数がそれぞれ、整数、ポインタ、第二引き数が、ポインタへのポインタ、なし
     233  #=== Signature# 正当なアロケータ シグニチャかテストする
     234  # alloc, dealloc 関数を持つかどうか、第一引き数がそれぞれ、整数、ポインタ、第二引き数が、ポインタへのポインタ、なし
    259235  def is_allocator?
    260236
    261     # 一回だけチェックする
     237    # 一回だけチェックする
    262238    if @b_checked_as_allocator_signature == true then
    263239      return true
     
    265241    @b_checked_as_allocator_signature = true
    266242
    267     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    268 åˆ—
    269     if fha == nil then                                  # nil なら文法エラーで有効値が設定されなかった
     243    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
     244    if fha == nil then                                  # nil なら文法エラーで有効値が設定されなかった
    270245      return false
    271246    end
    272247
    273248    found_alloc = false; found_dealloc = false
    274     fha.each{ |fh|  # fh: FuncHead                      # 関数é
    275 åˆ—中の各関数頭部
    276       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    277       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     249    fha.each{ |fh|  # fh: FuncHead                      # 関数配列中の各関数頭部
     250      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     251      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    278252        func_name = fd.get_name.to_sym
    279253        if func_name == :alloc then
     
    284258                ! params[0].get_type.get_original_type.kind_of?( IntType ) ||
    285259                params[0].get_direction != :IN then
    286               # 第一引数が int 型でない
     260              # 第一引数が int 型でない
    287261              if ! params[0].instance_of?( ParamDecl ) ||
    288262                  ! params[0].get_type.kind_of?( PtrType ) ||
     
    290264                  params[0].get_type.get_type.get_type.kind_of?( PtrType ) ||
    291265                  params[0].get_direction != :OUT then
    292                 # 第一引数がポインタ型でもない
     266                # 第一引数がポインタ型でもない
    293267                cdl_error3( @locale, "S1003 $1: \'alloc\' 1st parameter neither [in] integer type nor [out] double pointer type", @name )
    294268              end
     
    298272                params[1].get_type.get_type.get_type.kind_of?( PtrType ) ||
    299273                params[0].get_direction != :IN then
    300               # (第一引数が整数で) 第二引数がポインタでない
     274              # (第一引数が整数で) 第二引数がポインタでない
    301275              cdl_error3( @locale, "S1004 $1: \'alloc\' 2nd parameter not [in] double pointer" , @name )
    302276            end
     
    313287                params[0].get_direction != :IN then
    314288              cdl_error3( @locale, "S1006 $1: \'dealloc\' 1st parameter not [in] pointer type" , @name )
    315 #            elsif params[1] != nil then    # 第二引き数はチェックしない
     289#            elsif params[1] != nil then    # 第二引き数はチェックしない
    316290#              cdl_error3( @locale, "S1007 Error message is changed to empty" )
    317291#                 cdl_error3( @locale, "S1007 $1: \'dealloc\' cannot has 2nd parameter" , @name )
     
    335309  end
    336310
    337   #== Signature# 引数で参ç
    338 §ã•ã‚Œã¦ã„ã‚‹ Descriptor 型のリストを作成する
    339   #RETURN:: Hash { Signature => ParamDecl }:  複数の ParamDecl から参ç
    340 §ã•ã‚Œã¦ã„る場合、最後のものしか返さない
     311  #== Signature# 引数で参照されている Descriptor 型のリストを作成する
     312  #RETURN:: Hash { Signature => ParamDecl }:  複数の ParamDecl から参照されている場合、最後のものしか返さない
    341313  def get_descriptor_list
    342314    desc_list = { }
    343315    # p "has_desc #{@name}"
    344     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    345 åˆ—
    346     if fha == nil then                                  # nil の場合、自己参ç
    347 §ã«ã‚ˆã‚‹ã‚±ãƒ¼ã‚¹ã¨ä»®å®š
     316    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
     317    if fha == nil then                                  # nil の場合、自己参照によるケースと仮定
    348318      return desc_list
    349319    end
    350320    fha.each{ |fh|
    351       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    352       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     321      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     322      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    353323        params = fd.get_type.get_paramlist.get_items
    354324        if params then
     
    369339  end
    370340
    371   #=== Signature# 引数に Descriptor があるか?
     341  #=== Signature# 引数に Descriptor があるか?
    372342  def has_descriptor?
    373343    # p "has_desc #{@name}"
    374     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    375 åˆ—
    376     if fha == nil then                                  # nil の場合、自己参ç
    377 §ã«ã‚ˆã‚‹ã‚±ãƒ¼ã‚¹ã¨ä»®å®š
     344    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
     345    if fha == nil then                                  # nil の場合、自己参照によるケースと仮定
    378346      return true
    379347    end
    380348    fha.each{ |fh|
    381       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    382       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     349      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     350      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    383351        params = fd.get_type.get_paramlist.get_items
    384352        if params then
     
    399367  end
    400368
    401   #=== Signature# コールバックか?
    402   # 指定子 callback が指定されていれば true
     369  #=== Signature# コールバックか?
     370  # 指定子 callback が指定されていれば true
    403371  def is_callback?
    404372    @b_callback
    405373  end
    406374
    407   #=== Signature# 逸脱か?
    408   # 指定子 deviate が指定されていれば true
     375  #=== Signature# 逸脱か?
     376  # 指定子 deviate が指定されていれば true
    409377  def is_deviate?
    410378    @b_deviate
    411379  end
    412380
    413   #=== Signature# 空か?
     381  #=== Signature# 空か?
    414382  def is_empty?
    415383    @b_empty
    416384  end
    417385
    418   #=== Signature# Push Pop Allocator がå¿
    419 è¦ã‹ï¼Ÿ
    420   # Transparent RPC の場合 oneway かつ in のé
    421 åˆ—(size_is, count_is, string のいずれかで修飾)がある
     386  #=== Signature# Push Pop Allocator が必要か?
     387  # Transparent RPC の場合 oneway かつ in の配列(size_is, count_is, string のいずれかで修飾)がある
    422388  def need_PPAllocator?( b_opaque = false )
    423     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    424 åˆ—
     389    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
    425390    fha.each{ |fh|
    426391      fd = fh.get_declarator
     
    457422# @factory_list::   Factory[]
    458423# @ct_factory_list::    Factory[] :    celltype factory
    459 # @cell_list:: Cell[] : 定義のみ (V1.0.0.2 以降)
     424# @cell_list:: Cell[] : 定義のみ (V1.0.0.2 以降)
    460425# @singleton:: bool
    461426# @idx_is_id:: bool
    462427# @idx_is_id_act:: bool: actual value
    463428# @active:: bool
    464 # @b_reuse:: bool :  reuse 指定されて import された(template 不要)
    465 # @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
     429# @b_reuse:: bool :  reuse 指定されて import された(template 不要)
     430# @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
    466431#
    467432# @n_attribute_ro:: int >= 0    none specified
     
    470435# @n_var:: int >= 0
    471436# @n_var_size_is:: int >= 0     # of [size_is] specified vars # mikan count_is
    472 # @n_var_omit:: int >= 0        # of [omit] specified vars # mikan var の omit は有?
     437# @n_var_omit:: int >= 0        # of [omit] specified vars # mikan var の omit は有?
    473438# @n_var_init:: int >= 0        # of vars with initializer
    474439# @n_call_port:: int >= 0
    475440# @n_call_port_array:: int >= 0
    476 # @n_call_port_omitted_in_CB:: int >= 0   æœ€é©åŒ–で省略される呼び口
     441# @n_call_port_omitted_in_CB:: int >= 0   最適化で省略される呼び口
    477442# @n_entry_port:: int >= 0
    478443# @n_entry_port_array:: int >= 0
    479444# @n_entry_port_inline:: int >= 0
    480 # @n_cell_gen:: int >= 0  生成するセルの数.コード生成の頭で算出する.意味解析段階では参ç
    481 §ä¸å¯
    482 # @id_base:: Integer : cell の ID の最小値(最大値は @id_base + @n_cell)
     445# @n_cell_gen:: int >= 0  生成するセルの数.コード生成の頭で算出する.意味解析段階では参照不可
     446# @id_base:: Integer : cell の ID の最小値(最大値は @id_base + @n_cell)
    483447#
    484 # @b_cp_optimized:: bool : 呼び口最適化実施
    485 # @plugin:: PluginObject      このセルタイプがプラグインにより生成された CDL から生成された場合に有効。
    486 #                              generate の指定は @generate にプラグインが保持される
     448# @b_cp_optimized:: bool : 呼び口最適化実施
     449# @plugin:: PluginObject      このセルタイプがプラグインにより生成された CDL から生成された場合に有効。
     450#                              generate の指定は @generate にプラグインが保持される
    487451#
    488 # @included_header:: Hash :  include されたヘッダファイル
    489 # @domain_roots::Hash { DomainTypeName(Symbol) => [ Region ] }  ドメインタイプ名と Region のé
    490 åˆ— (optimize.rb で設定)
    491 #                                               ãƒ«ãƒ¼ãƒˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¯ãƒ‰ãƒ¡ã‚¤ãƒ³åãŒã€€nil
     452# @included_header:: Hash :  include されたヘッダファイル
     453# @domain_roots::Hash { DomainTypeName(Symbol) => [ Region ] }  ドメインタイプ名と Region の配列 (optimize.rb で設定)
     454#                                               ルートリージョンはドメイン名が nil
    492455
    493456  include PluginModule
     
    553516
    554517    @plugin = Generator.get_plugin
    555       # plugin の場合 PluginObject が返される
    556     # å
    557 ƒã® Generator から呼出された Generator の中でパースおよび意味チェックされている
     518      # plugin の場合 PluginObject が返される
     519    # 元の Generator から呼出された Generator の中でパースおよび意味チェックされている
    558520
    559521    # if @plugin then
    560     #  # plugin 生成されるセルタイプは再利用ではない   #833 不å
    561 ·åˆä¿®æ­£
     522    #  # plugin 生成されるセルタイプは再利用ではない   #833 不具合修正
    562523    #  @b_reuse = false
    563524    # else
     
    573534
    574535    Namespace.new_celltype( self )
    575     set_namespace_path # @NamespacePath の設定
     536    set_namespace_path # @NamespacePath の設定
    576537    set_specifier_list( Generator.get_statement_specifier )
    577538
     
    589550  end
    590551
    591   #== Celltype#ドメインルートを返す
    592   # @domain_roots の説明を参ç
    593 §
     552  #== Celltype#ドメインルートを返す
     553  # @domain_roots の説明を参照
    594554  def get_domain_roots
    595555    @domain_roots
     
    598558  # Celltype# end_of_parse
    599559  def end_of_parse
    600     # 属性・変数のチェック
     560    # 属性・変数のチェック
    601561    check_attribute
    602562
    603     # アロケータ呼び口をå†
    604 éƒ¨ç”Ÿæˆ
     563    # アロケータ呼び口を内部生成
    605564    generate_allocator_port
    606565
    607     # リレーアロケータ、å†
    608 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã®è¨­å®š
     566    # リレーアロケータ、内部アロケータの設定
    609567    @port.each { |p|
    610568      p.set_allocator_instance
     
    666624      end
    667625      if a.get_initializer then
    668         # 登録後にチェックしても問題ない(attr を参ç
    669 §ã§ããªã„ので、自己参ç
    670 §ã—ない)
     626        # 登録後にチェックしても問題ない(attr を参照できないので、自己参照しない)
    671627        a.get_type.check_init( @locale, a.get_identifier, a.get_initializer, :ATTRIBUTE )
    672628      end
     
    674630  end
    675631
    676   #=== Celltype# celltype の attribute/var のチェック
     632  #=== Celltype# celltype の attribute/var のチェック
    677633  # STAGE:  S
    678634  #
    679   # このメソッドは celltype のパースが完了した時点で呼出される.
     635  # このメソッドは celltype のパースが完了した時点で呼出される.
    680636  def check_attribute
    681     # attribute の size_is 指定が妥当かチェック
     637    # attribute の size_is 指定が妥当かチェック
    682638    (@attribute+@var).each{ |a|
    683639      if a.get_size_is then
    684640        if ! a.get_type.kind_of?( PtrType ) then
    685           # size_is がポインタ型以外に指定された
     641          # size_is がポインタ型以外に指定された
    686642          cdl_error( "S1011 $1: size_is specified for non-pointer type" , a.get_identifier )
    687643        else
    688644
    689           # 参ç
    690 §ã™ã‚‹å¤‰æ•°ãŒå­˜åœ¨ã—、計算可能な型かチェックする
    691           size = a.get_size_is.eval_const( @name_list )  # C_EXP の可能性あり
     645          # 参照する変数が存在し、計算可能な型かチェックする
     646          size = a.get_size_is.eval_const( @name_list )  # C_EXP の可能性あり
    692647          init = a.get_initializer
    693648          if init then
    694649            if ! init.instance_of?( Array ) then
    695               # 初期化子がé
    696 åˆ—ではない
     650              # 初期化子が配列ではない
    697651              cdl_error( "S1012 $1: unsuitable initializer, need array initializer" , a.get_identifier )
    698652            elsif size.kind_of?( Integer ) && size < init.length then
    699               # size_is 指定された個数よりも初期化子のé
    700 åˆ—要素が多い
     653              # size_is 指定された個数よりも初期化子の配列要素が多い
    701654              cdl_error( "S1013 $1: too many initializer, $2 for $3" , a.get_identifier, init.length, size )
    702             # elsif a.get_size_is.eval_const( nil ) == nil  # C_EXP の可能性あり
     655            # elsif a.get_size_is.eval_const( nil ) == nil  # C_EXP の可能性あり
    703656            end
    704657
     
    710663              ( a.get_initializer.instance_of?( Expression ) &&
    711664                a.get_initializer.eval_const2(@name_list).instance_of?( Array ) ) then
    712             # size_is 指定されていないポインタが Array で初期化されていたら、エラー
     665            # size_is 指定されていないポインタが Array で初期化されていたら、エラー
    713666            cdl_error( "S1159 $1: non-size_is pointer cannot be initialized with array initializer" , a.get_identifier )
    714667          end
     
    722675  end
    723676
    724   #=== Celltype# アロケータ呼び口を生成
    725   #    send, receive 引数のアロケータを呼出すための呼び口を生成
     677  #=== Celltype# アロケータ呼び口を生成
     678  #    send, receive 引数のアロケータを呼出すための呼び口を生成
    726679  def generate_allocator_port
    727680    @port.each { |port|
    728       # ポートのすべてのパラメータを辿る
     681      # ポートのすべてのパラメータを辿る
    729682      port.each_param { |port, fd, par|
    730         case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
     683        case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
    731684        when :SEND, :RECEIVE
    732685          if par.get_allocator then
    733             cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
    734             #           ãƒãƒ¼ãƒˆå          関数名         ãƒ‘ラメータ名
    735             # alloc_sig_path = [ par.get_allocator.get_name ]  # mikan Namespace アロケータ呼び口のシグニチャ #1
     686            cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
     687            #           ポート名          関数名         パラメータ名
     688            # alloc_sig_path = [ par.get_allocator.get_name ]  # mikan Namespace アロケータ呼び口のシグニチャ #1
    736689            alloc_sig_path = par.get_allocator.get_namespace_path
    737             array_size = port.get_array_size            # 呼び口または受け口é
    738 åˆ—のサイズ
    739             created_port = Port.new( cp_name, alloc_sig_path, :CALL, array_size ) # 呼び口を生成
     690            array_size = port.get_array_size            # 呼び口または受け口配列のサイズ
     691            created_port = Port.new( cp_name, alloc_sig_path, :CALL, array_size ) # 呼び口を生成
    740692            created_port.set_allocator_port( port, fd, par )
    741693            if port.is_optional? then
     
    745697              created_port.set_omit
    746698            end
    747             new_port( created_port )                    # セルタイプに新しい呼び口を追加
     699            new_port( created_port )                    # セルタイプに新しい呼び口を追加
    748700          # else
    749701          #  already error "not found or not signature" in class ParamDecl
     
    762714  end
    763715
    764   #=== Celltype# 新しいå†
    765 éƒ¨å¤‰æ•°
     716  #=== Celltype# 新しい内部変数
    766717  #var:: [Decl]
    767718  def new_var( var )
     
    776727      @name_list.add_item( i )
    777728
    778       # size_is 指定されたé
    779 åˆ—? mikan  count_is
     729      # size_is 指定された配列? mikan  count_is
    780730      if i.get_size_is then
    781731        @n_var_size_is += 1
     
    793743  end
    794744
    795   #=== Celltype# celltype の指定子を設定
     745  #=== Celltype# celltype の指定子を設定
    796746  def set_specifier_list( spec_list )
    797747    return if spec_list == nil
     
    822772
    823773  def new_require( ct_or_cell_nsp, ep_name, cp_name )
    824     # Require: set_owner するものがない
     774    # Require: set_owner するものがない
    825775    obj = Namespace.find( ct_or_cell_nsp )    #1
    826776    if obj.instance_of? Celltype then
    827       # Celltype 名で指定
     777      # Celltype 名で指定
    828778      ct = obj
    829779    elsif obj.instance_of? Cell then
    830       # Cell 名で指定
     780      # Cell 名で指定
    831781      ct = obj.get_celltype
    832782    elsif obj == nil then
     
    839789
    840790    if( ! ct.is_singleton? ) then
    841       # シングルトンではない
     791      # シングルトンではない
    842792      cdl_error( "S1018 $1 : not singleton cell" , obj.get_name )
    843793    end
    844794
    845     # 受け口を探す
     795    # 受け口を探す
    846796    obj2 = ct.find( ep_name )
    847797    if( ( ! obj2.instance_of? Port ) || obj2.get_port_type != :ENTRY ) then
     
    854804
    855805    if obj2.get_signature == nil then
    856       # signature が未定義:既にエラー
     806      # signature が未定義:既にエラー
    857807      return
    858808    end
     
    860810    require_call_port_prefix = :_require_call_port
    861811    if cp_name == nil then
    862       # 関数名重複チェック
     812      # 関数名重複チェック
    863813      @require.each{ |req|
    864814        unless req[0].to_s =~ /^#{require_call_port_prefix}/ then
    865           next     # 名前ありの require は関数名重複チェックしない
     815          next     # 名前ありの require は関数名重複チェックしない
    866816        end
    867817        port = req[2]
    868818        if port.get_signature == obj2.get_signature then
    869           # 同じ signature (すべて同じ関数名を持つ)個別に出すのではなく、まとめてエラーとする
     819          # 同じ signature (すべて同じ関数名を持つ)個別に出すのではなく、まとめてエラーとする
    870820          cdl_error( "S1021 $1 : require cannot have same signature with \'$2\'" , obj2.get_name, port.get_name )
    871821          next
    872822        end
    873823        port.get_signature.get_function_head_array.each{ |f|
    874           # mikan ここは、namedList からの検索にならないの?(効率が悪い)
     824          # mikan ここは、namedList からの検索にならないの?(効率が悪い)
    875825          obj2.get_signature.get_function_head_array.each{ |f2|
    876826            if( f.get_name == f2.get_name ) then
     
    888838      b_has_name = true
    889839    end
    890     # require を追加
     840    # require を追加
    891841    @require << [ cp_name, obj, obj2 ]  # [ lhs:cp_name, rhs:Celltype, rhs:Port ]
    892842
    893     # require port を追加 (呼び口として追加する。ただし require をセットしておく)
     843    # require port を追加 (呼び口として追加する。ただし require をセットしておく)
    894844    port = Port.new( cp_name, obj2.get_signature.get_namespace_path, :CALL )
    895845    port.set_require( b_has_name )
     
    913863  end
    914864
    915   #=== Celltype# セルタイププラグイン (generate 指定子)
     865  #=== Celltype# セルタイププラグイン (generate 指定子)
    916866  def celltype_plugin
    917867
     
    927877
    928878    begin
    929       eval( eval_str )     # plugin を生成
     879      eval( eval_str )     # plugin を生成
    930880      plugin_object.set_locale @locale
    931881      @generate[ 2 ] = plugin_object
     
    939889  end
    940890
    941   #=== Celltype# celltype に新しい cell を追加
     891  #=== Celltype# celltype に新しい cell を追加
    942892  #cell:: Cell
    943   # 新しいセルをセルタイプに追加.
    944   # セルの構文解釈の最後でこのメソドを呼出される.
    945   # シングルトンセルが同じ linkunit に複数ないかチェック
     893  # 新しいセルをセルタイプに追加.
     894  # セルの構文解釈の最後でこのメソドを呼出される.
     895  # シングルトンセルが同じ linkunit に複数ないかチェック
    946896  def new_cell( cell )
    947     # Celltype では Cell の set_owner しない
    948     # シングルトンで、プロトタイプ宣言でない場合、コード生成対象リージョンの場合
     897    # Celltype では Cell の set_owner しない
     898    # シングルトンで、プロトタイプ宣言でない場合、コード生成対象リージョンの場合
    949899    if @singleton  then
    950900      @cell_list.each{ |c|
     
    960910  end
    961911
    962   #=== Celltype# セルタイプは INIB を持つか?
    963   # セルタイプが INIB を持つかどうかを判定する
    964   # $rom == false のとき:  INIB を持たない. (すべては CB に置かれる)
    965   # $rom == true のとき、INIB に置かれるものが一つでも存在すれば INIB を持つ
    966   #   INIB に置かれるものは
    967   #     attribute (omit のものは除く.現仕様では rw のものはない)
    968   #     size_is を伴う var
    969   #     å‘¼ã³å£ï¼ˆãŸã ã—、最適化で不要となるものは除く)
     912  #=== Celltype# セルタイプは INIB を持つか?
     913  # セルタイプが INIB を持つかどうかを判定する
     914  # $rom == false のとき:  INIB を持たない. (すべては CB に置かれる)
     915  # $rom == true のとき、INIB に置かれるものが一つでも存在すれば INIB を持つ
     916  #   INIB に置かれるものは
     917  #     attribute (omit のものは除く.現仕様では rw のものはない)
     918  #     size_is を伴う var
     919  #     呼び口(ただし、最適化で不要となるものは除く)
    970920  def has_INIB?
    971921#    print "name=#{@name} @n_attribute_ro=#{@n_attribute_ro}  @n_var_size_is=#{@n_var_size_is} @n_call_port=#{@n_call_port} @n_call_port_omitted_in_CB=#{@n_call_port_omitted_in_CB} @n_entry_port_array_ns=#{@n_entry_port_array_ns}\n"
     
    974924  end
    975925
    976   #=== Celltype# セルタイプは CB を持つか?
    977   # $rom == true のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ
    978   #   size_is が指定されていない var
    979   #   rw 指定された attribute (現仕様では存在しない)
    980   # $rom == false のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ
     926  #=== Celltype# セルタイプは CB を持つか?
     927  # $rom == true のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ
     928  #   size_is が指定されていない var
     929  #   rw 指定された attribute (現仕様では存在しない)
     930  # $rom == false のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ
    981931  #   attribute
    982932  #   var
    983   #   å‘¼ã³å£ï¼ˆãŸã ã—、最適化で不要となるものは除く)
     933  #   呼び口(ただし、最適化で不要となるものは除く)
    984934  def has_CB?
    985935    if $rom then
     
    991941  end
    992942
    993   #=== Celltype# SET_CB_INIB_POINTER, INITIALIZE_CB がå¿
    994 è¦ã‹
     943  #=== Celltype# SET_CB_INIB_POINTER, INITIALIZE_CB が必要か
    995944  def need_CB_initializer?
    996945    @n_var_init > 0 || has_CB?
    997946  end
    998947
    999   #=== Celltype# 逆require の結合を生成する
     948  #=== Celltype# 逆require の結合を生成する
    1000949  def create_reverse_require_join cell
    1001950    @port.each{ |p|
     
    1004953  end
    1005954
    1006   #=== Celltype# singleton セルを得る
    1007   #region:: Region   : singleton を探す Region
    1008   # 距離が最も近いものを返す
    1009   # mikan 本当は region の範囲の singleton を探すå¿
    1010 è¦ãŒã‚ã‚‹
     955  #=== Celltype# singleton セルを得る
     956  #region:: Region   : singleton を探す Region
     957  # 距離が最も近いものを返す
     958  # mikan 本当は region の範囲の singleton を探す必要がある
    1011959  def get_singleton_cell region
    1012960    cell = nil
    1013     dist = 999999999 # mikan 制限値(これは十分すぎるほどデカイが)
    1014     # require: celltype で指定
     961    dist = 999999999 # mikan 制限値(これは十分すぎるほどデカイが)
     962    # require: celltype で指定
    1015963    @cell_list.each{ |c|
    1016       # 到達可能で最も近いセルを探す(複数の singleton があるかもしれない)
     964      # 到達可能で最も近いセルを探す(複数の singleton があるかもしれない)
    1017965      d = region.distance( c.get_region )
    1018966      #debug
     
    1033981  end
    1034982
    1035   #=== Celltype# セルタイププラグインを得る
     983  #=== Celltype# セルタイププラグインを得る
    1036984  def get_celltype_plugin
    1037985    if @generate then
     
    10521000  end
    10531001
    1054   #=== Celltype# アクティブではないか
    1055   # このメソッドでは active の他に factory (singleton においては FACTORYを含む)がなければ inactive とする
     1002  #=== Celltype# アクティブではないか
     1003  # このメソッドでは active の他に factory (singleton においては FACTORYを含む)がなければ inactive とする
    10561004  def is_inactive?
    10571005    if @active == false && @factory_list.length == 0 &&
     
    10741022  end
    10751023
    1076   #=== Celltype# コード生成するå¿
    1077 è¦ãŒã‚るか判定
    1078   # セルの個数が 0 ならセルタイプコードは生成不要
     1024  #=== Celltype# コード生成する必要があるか判定
     1025  # セルの個数が 0 ならセルタイプコードは生成不要
    10791026  def need_generate?
    10801027    @n_cell_gen > 0
    10811028  end
    10821029
    1083   #=== Celltype# require 呼び口の結合を行う
     1030  #=== Celltype# require 呼び口の結合を行う
    10841031  # STAGE: S
    1085   # セルタイプの require 呼び口について、結合を行う
    1086   # セルが生成されないかチェックを行う
     1032  # セルタイプの require 呼び口について、結合を行う
     1033  # セルが生成されないかチェックを行う
    10871034  def set_require_join
    10881035    @require.each{ |req|
     
    11001047  end
    11011048
    1102   #=== Celltype# inline 受け口しかないか?
    1103   # 受け口が無い場合、すべての受け口が inline とはしない
     1049  #=== Celltype# inline 受け口しかないか?
     1050  # 受け口が無い場合、すべての受け口が inline とはしない
    11041051  def is_all_entry_inline?
    11051052    @n_entry_port == @n_entry_port_inline && @n_entry_port > 0
     
    11401087# @n_var:: int >= 0
    11411088# @n_var_size_is:: int >= 0     # of [size_is] specified cells # mikan count_is
    1142 # @n_var_omit:: int >= 0        # of [omit] specified  cells # mikan var の omit は有?
     1089# @n_var_omit:: int >= 0        # of [omit] specified  cells # mikan var の omit は有?
    11431090# @n_call_port:: int >= 0
    11441091# @n_call_port_array:: int >= 0
    1145 # @n_call_port_omitted_in_CB:: int >= 0   æœ€é©åŒ–で省略される呼び口
     1092# @n_call_port_omitted_in_CB:: int >= 0   最適化で省略される呼び口
    11461093# @n_entry_port:: int >= 0
    11471094# @n_entry_port_array:: int >= 0
    11481095    (indent+1).times { print "  " }
    11491096    puts "@n_entry_port_inline #{@n_entry_port_inline}"
    1150 # @n_cell:: int >= 0  コード生成の頭で算出する.意味解析段階では参ç
    1151 §ä¸å¯
    1152 # @id_base:: Integer : cell の ID の最小値(最大値は @id_base + @n_cell)
     1097# @n_cell:: int >= 0  コード生成の頭で算出する.意味解析段階では参照不可
     1098# @id_base:: Integer : cell の ID の最小値(最大値は @id_base + @n_cell)
    11531099
    11541100  end
     
    11561102
    11571103class Cell < NSBDNode # < Nestable
    1158 # @name:: Symbol : composite celltype のå†
    1159 å´ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã§ã¯å¤–のセル
    1160 # @global_name:: Symbol : C で使える名前(namespace を含む)
    1161 # @local_name:: str : cell celltype name { ... } の name
     1104# @name:: Symbol : composite celltype の内側のインスタンスでは外のセル
     1105# @global_name:: Symbol : C で使える名前(namespace を含む)
     1106# @local_name:: str : cell celltype name { ... } の name
    11621107# @celltype:: Celltype | CompositeCelltype
    11631108# @join_list:: NamedList
     
    11661111# @b_prototype:: bool:  prototype specified in current parsing cell. (@b_defined is used to determine whether definition done)
    11671112# @b_duplicate:: bool:  definition duplicate
    1168 # @b_checked::   bool:  set_definition_join が済んでいる場合 true
    1169 # @require_joined_list:: {cp_name=>true}:  set_require_join が済んでいる呼び口は true
     1113# @b_checked::   bool:  set_definition_join が済んでいる場合 true
     1114# @require_joined_list:: {cp_name=>true}:  set_require_join が済んでいる呼び口は true
    11701115# @f_ref:: refercenced from others
    1171 # @entry_array_max_subscript:: { @port=>Integer } : 受け口é
    1172 åˆ—のé
    1173 åˆ—添数の最大値(添数無し受け口é
    1174 åˆ—対応)
     1116# @entry_array_max_subscript:: { @port=>Integer } : 受け口配列の配列添数の最大値(添数無し受け口配列対応)
    11751117# @plugin::     Plugin: avialble if cell is generated by plugin generated cdl code.
    1176 # @referenced_port_list:: { Port => Integer } : 受け口の参ç
    1177 §æ•°
    1178 #                                               ã™ã¹ã¦ã®æ„å‘³è§£æž(through, composite展開)が終わった後に設定する
    1179 #                                               é€†require ポートに対して複数の結合がないかチェックする
    1180 # @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
     1118# @referenced_port_list:: { Port => Integer } : 受け口の参照数
     1119#                                               すべての意味解析(through, composite展開)が終わった後に設定する
     1120#                                               逆require ポートに対して複数の結合がないかチェックする
     1121# @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
    11811122#
    1182 # composite のためインスタンス変数
     1123# composite のためインスタンス変数
    11831124# @in_composite:: bool : true if in composite celltype
    11841125# @compositecelltypejoin_list:: NamedList : item= CompositeCelltypeJoin ( if @in_composite )
    11851126# @f_cloned:: bool : true if cloned (instantiate of composite consist cell)
    1186 # @my_clone:: Cell : Composite cell で in_composite = true の場合のみ有効(直前の clone を一時記憶)
    1187 # @cell_list:: Cell[local_name] : Composite cell で clone した後のリスト cell_list
    1188 # @cell_list2:: [ Cell ] : Composite cell で clone した後のリスト cell_list
    1189 #                          @cell_list2 は composite å†
    1190 ã§ã®å‡ºç¾é † 
     1127# @my_clone:: Cell : Composite cell で in_composite = true の場合のみ有効(直前の clone を一時記憶)
     1128# @cell_list:: Cell[local_name] : Composite cell で clone した後のリスト cell_list
     1129# @cell_list2:: [ Cell ] : Composite cell で clone した後のリスト cell_list
     1130#                          @cell_list2 は composite 内での出現順 
    11911131#
    1192 # region のためのインスタンス変数
    1193 # @region:: Region (属するregion)
     1132# region のためのインスタンス変数
     1133# @region:: Region (属するregion)
    11941134#
    1195 # allocator のためのインスタンス変数
     1135# allocator のためのインスタンス変数
    11961136# @alloc_list::  [ [ NORMAL_ALLOC, ep_name, func_name, param_name, expr ], ... ]
    1197 #   å—け口側のアロケータへの結合を記憶。以下のメソッドで追加される
    1198 #      set_specifier … cell 定義時にアロケータ指定されている場合
    1199 #      create_relay_allocator_join … リレーアロケータの場合
     1137#   受け口側のアロケータへの結合を記憶。以下のメソッドで追加される
     1138#      set_specifier … cell 定義時にアロケータ指定されている場合
     1139#      create_relay_allocator_join … リレーアロケータの場合
    12001140#
    1201 # ID のためのインスタンス変数(optimize.rb にて設定)
    1202 # @id:: Integer : コード生成直前に設定  (プロトタイプ宣言の場合は -1 のまま放置)
    1203 # @id_specified::Integer : 指定された id
     1141# ID のためのインスタンス変数(optimize.rb にて設定)
     1142# @id:: Integer : コード生成直前に設定  (プロトタイプ宣言の場合は -1 のまま放置)
     1143# @id_specified::Integer : 指定された id
    12041144# @restrict_list::{ entry_name => { func_name, [ region_name, ... ] } }
    12051145
    12061146=begin
    1207 # Cell クラスは、以下のものを扱う
    1208 # 1)普通のセル
    1209 # 2)composite セルタイプのセル
    1210 # 3)composite セルタイプのå†
    1211 å´ã®ã‚»ãƒ« (@in_composite)   # composite のå†
    1212 å´ã® composite セルタイプのセルもある
     1147# Cell クラスは、以下のものを扱う
     1148# 1)普通のセル
     1149# 2)composite セルタイプのセル
     1150# 3)composite セルタイプの内側のセル (@in_composite)   # composite の内側の composite セルタイプのセルもある
    12131151#
    1214 # 2) は CellOfComposite クラスとして分けたほうがよいかもしれない
    1215 #    expand (composite セルの展開) は CellOfComposite にのみå¿
    1216 è¦ãªãƒ¡ã‚½ãƒƒãƒ‰ã§ã‚ã‚‹
    1217 #    get_real_cell, get_real_port など @celltype.instance_of?( CompositeCelltype ) の判定がなくすっきりする
    1218 #    ただ、分離しても、メンテナンスすべき範囲が切り離されてしまい、忘れやすくなる問題とのトレードオフかも
     1152# 2) は CellOfComposite クラスとして分けたほうがよいかもしれない
     1153#    expand (composite セルの展開) は CellOfComposite にのみ必要なメソッドである
     1154#    get_real_cell, get_real_port など @celltype.instance_of?( CompositeCelltype ) の判定がなくすっきりする
     1155#    ただ、分離しても、メンテナンスすべき範囲が切り離されてしまい、忘れやすくなる問題とのトレードオフかも
    12191156#
    1220 # 3) は CellInCompoiste クラスとして分けたほうがよいかもしれない
    1221 #    @in_composite で判定している処理を切り離せる (上記 2) よりも分離は容易ではない)
    1222 #    clone_for_composite は CellInCompoiste にのみå¿
    1223 è¦ãªãƒ¡ã‚½ãƒƒãƒ‰ã§ã‚ã‚‹
    1224 #    ただし、clone 後に Cell, CellOfComposite に変化するå¿
    1225 è¦ãŒã‚るので、clone ではなく new する実è£
    1226 ã«å¤‰æ›´ã™ã‚‹å¿
    1227 è¦ãŒã‚ã‚‹
     1157# 3) は CellInCompoiste クラスとして分けたほうがよいかもしれない
     1158#    @in_composite で判定している処理を切り離せる (上記 2) よりも分離は容易ではない)
     1159#    clone_for_composite は CellInCompoiste にのみ必要なメソッドである
     1160#    ただし、clone 後に Cell, CellOfComposite に変化する必要があるので、clone ではなく new する実装に変更する必要がある
    12281161#
    12291162=end
     
    12351168  @@current_object = nil
    12361169
    1237   # 定義されたすべてのセル(出現順. namespace に影響されない)
    1238   @@cell_list = []     # composite のå†
    1239 éƒ¨ã®ã‚»ãƒ«ã‚’含まない
    1240   @@cell_list2 = []    # composite のå†
    1241 éƒ¨ã®ã‚»ãƒ«ã‚’含む (å
    1242 ƒã®ã‚»ãƒ«ã‚’含む)
    1243                        # 意味解析後 make_cell_list2 にて設定される
     1170  # 定義されたすべてのセル(出現順. namespace に影響されない)
     1171  @@cell_list = []     # composite の内部のセルを含まない
     1172  @@cell_list2 = []    # composite の内部のセルを含む (元のセルを含む)
     1173                       # 意味解析後 make_cell_list2 にて設定される
    12441174
    12451175  def self.push
     
    12581188
    12591189
    1260   # composite で clone されたもの(子孫まで含む)
    1261   # Join.change_rhs_port にて CompoisteCelltype å†
    1262 ã® Join の結合å
    1263 ˆã‚’変更する際に使用
     1190  # composite で clone されたもの(子孫まで含む)
     1191  # Join.change_rhs_port にて CompoisteCelltype 内の Join の結合先を変更する際に使用
    12641192  @@cloned_cell_list = {}
    1265   ### mikan BUG @@cloned_cell_list は composite の階層ごとに記憶していないため、同じ名前がå†
    1266 éƒ¨ã«ç¾ã‚Œã‚‹ã¨ã€ã†ã¾ãå‹•ä½œã—ない
    1267   # change_rhs_port の実è£
    1268 ã¯ã€ã“んな回りくどいことをするå¿
    1269 è¦ã¯ãªã‹ã£ãŸã€‚右辺に現れるセル名には、composite のセル名を前につなげるだけでよかった
     1193  ### mikan BUG @@cloned_cell_list は composite の階層ごとに記憶していないため、同じ名前が内部に現れると、うまく動作しない
     1194  # change_rhs_port の実装は、こんな回りくどいことをする必要はなかった。右辺に現れるセル名には、composite のセル名を前につなげるだけでよかった
    12701195
    12711196  def initialize( ct_path, in_composite = false )
     
    12731198    @region = Region.get_current
    12741199
    1275     # celltype のplugin/存在をチェック
     1200    # celltype のplugin/存在をチェック
    12761201    object = Namespace.find( ct_path )    #1
    12771202    if object == nil then
    1278       # mikan celltype の名前が不完å
    1279 ¨ "::ct1ct2" になる
     1203      # mikan celltype の名前が不完全 "::ct1ct2" になる
    12801204      cdl_error( "S1027 \'$1\' celltype not found" , ct_path.get_path_str )
    12811205    elsif ! object.instance_of?( Celltype ) && ! object.instance_of?( CompositeCelltype ) then
    1282       # mikan celltype の名前が不完å
    1283 ¨
     1206      # mikan celltype の名前が不完全
    12841207      cdl_error( "S1028 \'$1\' not celltype" , ct_path.get_path_str )
    12851208    else
     
    13291252    end
    13301253
    1331     # この時点ではプロトタイプか、定義か分らないが、自己参ç
    1332 §ã®ãŸã‚ã«ç™»éŒ²
    1333     # set_f_def で再度登録しなおす
    1334     # Celltype への登録は、end_of_parse で行う
     1254    # この時点ではプロトタイプか、定義か分らないが、自己参照のために登録
     1255    # set_f_def で再度登録しなおす
     1256    # Celltype への登録は、end_of_parse で行う
    13351257    if @in_composite then
    13361258      cell_prev = CompositeCelltype.find( name )
     
    13391261      end
    13401262    else
    1341       # cell_prev = Namespace.find( [ name ] )   # 親まで捜しにいく
     1263      # cell_prev = Namespace.find( [ name ] )   # 親まで捜しにいく
    13421264      cell_prev = Namespace.get_current.find( name )
    13431265      if cell_prev == nil then
    13441266        Namespace.new_cell( self )
    1345         set_namespace_path # @NamespacePath の設定
     1267        set_namespace_path # @NamespacePath の設定
    13461268      end
    13471269    end
     
    13501272      if ! cell_prev.instance_of?( Cell ) then
    13511273        cdl_error( "S1029 $1 mismatch with previous one" , name )
    1352         # celltype が一致しているか ?
     1274        # celltype が一致しているか ?
    13531275      elsif get_celltype != cell_prev.get_celltype then
    13541276        cdl_error( "S1030 $1: celltype mismatch with previous one" , name )
    13551277      else
    1356         # region が一致しているか?
     1278        # region が一致しているか?
    13571279        if ! cell_prev.get_region.equal? get_region then
    13581280          cdl_error( "S1031 $1 region \'$2\' mismatch  with previous one \'$3\'" , name, @region.get_name, cell_prev.get_region.get_name )
     
    13601282
    13611283        @@current_object = cell_prev
    1362         # この時点では、まだプロトタイプ宣言か定義か分らない
    1363         # 以前が定義であって、今回も定義の場合、重複エラーである
     1284        # この時点では、まだプロトタイプ宣言か定義か分らない
     1285        # 以前が定義であって、今回も定義の場合、重複エラーである
    13641286      end
    13651287    end
     
    13711293    dbgPrint "Cell new_cell: #{@global_name} #{@in_composite} #{self}\n"
    13721294
    1373     # å†
    1374 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã‚’ @alloc_list に追加
     1295    # 内部アロケータを @alloc_list に追加
    13751296    if @celltype.instance_of? CompositeCelltype then
    13761297      @celltype.get_internal_allocator_list.each{ |cell, cp_internal_name, port_name, fd_name, par_name, ext_alloc_ent|
    13771298        nsp = NamespacePath.new( @name, false )
    1378         rhs = Expression.new( [:OP_DOT, [:IDENTIFIER, nsp], Token.new( ext_alloc_ent.to_s.to_sym, nil, nil, nil ) ] )  #1 構文解析段階なので locale 不要
     1299        rhs = Expression.new( [:OP_DOT, [:IDENTIFIER, nsp], Token.new( ext_alloc_ent.to_s.to_sym, nil, nil, nil ) ] )  #1 構文解析段階なので locale 不要
    13791300
    13801301        @alloc_list << [:NORMAL_ALLOC,port_name,nil,fd_name,par_name,rhs]
     
    13841305  end
    13851306
    1386   #=== Cell# cell の定義
    1387   # 本体(join)の定義の直前に呼び出される
     1307  #=== Cell# cell の定義
     1308  # 本体(join)の定義の直前に呼び出される
    13881309  def self.new_def
    13891310    @@current_object.new_def
    13901311  end
    13911312
    1392   #=== Cell# cell の定義
    1393   # 本体(join)の定義の直前に呼び出される
    1394   # このメソッドは cell tCelltype Cell { };  '{', '}' の部分がある場合に呼出される
     1313  #=== Cell# cell の定義
     1314  # 本体(join)の定義の直前に呼び出される
     1315  # このメソッドは cell tCelltype Cell { };  '{', '}' の部分がある場合に呼出される
    13951316  def new_def
    13961317    set_specifier_list( Generator.get_statement_specifier )
    13971318
    1398     # prototype 指定子ないか
     1319    # prototype 指定子ないか
    13991320    if ! @b_prototype then
    1400       # 二重定義のチェック
     1321      # 二重定義のチェック
    14011322      if @b_defined == true then
    14021323        cdl_error( "S1032 $1: duplicate cell" , @name )
    14031324        dbgPrint "previous: #{@prev_locale[0]}: line #{@prev_locale[1]} '#{@name}' defined here\n"
    14041325
    1405         # セルの重複定義エラーの処置
    1406         # 前の定義は捨てる
     1326        # セルの重複定義エラーの処置
     1327        # 前の定義は捨てる
    14071328        @join_list = NamedList.new( nil, "in cell '#{@name}'" )
    14081329      end
     
    14171338  end
    14181339
    1419   #===  Cell# 新しい結合をチェック
     1340  #===  Cell# 新しい結合をチェック
    14201341  # STAGE:   P
    14211342  #
    1422   #join::  Join : 新しい結合
    1423   #b_regular:: bool : 通常の場所 (bnf.y.rb)からならば true, それ以外(allocator, require) では false
     1343  #join::  Join : 新しい結合
     1344  #b_regular:: bool : 通常の場所 (bnf.y.rb)からならば true, それ以外(allocator, require) では false
    14241345  def new_join( join, b_regular = false )
    14251346    join.set_owner self
    14261347
    1427     # composite の新文法対応.
    1428     # composite の中のセルで、attribute の定義である場合
    1429     # cell å†
    1430 ã® attr_ext = composite.attr; 構文を処理
     1348    # composite の新文法対応.
     1349    # composite の中のセルで、attribute の定義である場合
     1350    # cell 内の attr_ext = composite.attr; 構文を処理
    14311351    if @in_composite then
    14321352      if @celltype then
    1433         if @celltype.find(join.get_name).instance_of?( Decl ) then # mikan a::b で指定されていたものがエラーにならないかも
     1353        if @celltype.find(join.get_name).instance_of?( Decl ) then # mikan a::b で指定されていたものがエラーにならないかも
    14341354          rhs = join.get_rhs
    14351355          if rhs.instance_of? Expression then
    14361356            ele = rhs.get_elements
    1437             if( ele[0]==:IDENTIFIER )then    #  attr = attr_ext (右辺単é 
    1438 ï¼‰ã‹ï¼Ÿ #1
    1439               if( CompositeCelltype.has_attribute?(ele[1].get_name ) )then    # mikan a::b.ePort がエラーにならないかも
    1440                 ident = ele[1].get_name   # 右辺は attribute.
     1357            if( ele[0]==:IDENTIFIER )then    #  attr = attr_ext (右辺単項)か? #1
     1358              if( CompositeCelltype.has_attribute?(ele[1].get_name ) )then    # mikan a::b.ePort がエラーにならないかも
     1359                ident = ele[1].get_name   # 右辺は attribute.
    14411360              else
    1442                 # 右辺は attribute にないのであれば、定数のはず
    1443                 # 定数は下へ渡す (cell の join にする)
     1361                # 右辺は attribute にないのであれば、定数のはず
     1362                # 定数は下へ渡す (cell の join にする)
    14441363                ident = nil
    14451364              end
    14461365            else
    1447               if join.get_rhs.eval_const2(nil) == nil then   # 定数式ではないか?
    1448                 # 右辺が、単一のシンボルでない場合、現状は扱えない
     1366              if join.get_rhs.eval_const2(nil) == nil then   # 定数式ではないか?
     1367                # 右辺が、単一のシンボルでない場合、現状は扱えない
    14491368                cdl_error( "S1033 rhs expression is not supported. Only attribute is permitted on current version."  )
    14501369                return
    14511370              else
    1452                 # 定数は下へ渡す (cell の join にする)
     1371                # 定数は下へ渡す (cell の join にする)
    14531372                ident = nil
    14541373              end
     
    14561375
    14571376            if ident then
    1458               # attr = attr; のような参ç
    1459 §ã¯ã‚¨ãƒ©ãƒ¼ (a = composite.a とするå¿
    1460 è¦ãŒã‚ã‚‹)
     1377              # attr = attr; のような参照はエラー (a = composite.a とする必要がある)
    14611378              if @celltype.find( ident ) then
    14621379                cdl_error( "S1034 $1 : cannot refer to $2\'s attribute here. Use \'composite.$3\' to refer to composite celltype\'s" , ident, @celltype.get_name, ident )
     
    14641381            end
    14651382          elsif rhs.instance_of? Array then
    1466             if rhs[0] == :COMPOSITE then   # 右辺は composite.attr の形式
     1383            if rhs[0] == :COMPOSITE then   # 右辺は composite.attr の形式
    14671384              ident = rhs[1].to_sym
    14681385            else
    1469               ident = nil    # 右辺は { 10, -10 } の形式
     1386              ident = nil    # 右辺は { 10, -10 } の形式
    14701387            end
    14711388          else
    1472             ident = nil      # 右辺は C_EXP の形式
     1389            ident = nil      # 右辺は C_EXP の形式
    14731390          end
    14741391
    1475           # ident が見つかった(右辺は単一の ident)
     1392          # ident が見つかった(右辺は単一の ident)
    14761393          if ident then
    1477             # composite の旧文法の構文処理へ渡す.セル外の attr_ext = Cell.attr; 構文の処理に渡す
     1394            # composite の旧文法の構文処理へ渡す.セル外の attr_ext = Cell.attr; 構文の処理に渡す
    14781395            #                        export_name, internal_cell_name, internal_cell_elem_name
    1479             decl = CompositeCelltype.new_join( ident, @name, join.get_name, :ATTRIBUTE )  # mikan a::b.ePort がエラーにならないかも
     1396            decl = CompositeCelltype.new_join( ident, @name, join.get_name, :ATTRIBUTE )  # mikan a::b.ePort がエラーにならないかも
    14801397            if ! decl.instance_of? Decl then
    14811398              return
     
    14851402              return
    14861403            end
    1487             # 以下の旧文法実è£
    1488 ã«æ¸¡ã™ï¼Ž
    1489             # 旧文法では cell に初期値を与えることで、composite で属性の初期値を指定することができた
    1490             # attribute で指定された初期値を cell の属性として処理させる
     1404            # 以下の旧文法実装に渡す.
     1405            # 旧文法では cell に初期値を与えることで、composite で属性の初期値を指定することができた
     1406            # attribute で指定された初期値を cell の属性として処理させる
    14911407            join.change_rhs( ini )
    14921408          else
    1493             # ident がない.定数式
     1409            # ident がない.定数式
    14941410          end
    14951411        else
    1496           # celltype の属性として、この join の名前がない
    1497           # 以下の join.set_definition の中でエラーとなる
     1412          # celltype の属性として、この join の名前がない
     1413          # 以下の join.set_definition の中でエラーとなる
    14981414        end
    14991415      else
    1500         return    # celltype がない.すでにエラー
     1416        return    # celltype がない.すでにエラー
    15011417      end
    15021418    elsif join.get_rhs.instance_of? Array then
    15031419      rhs = join.get_rhs
    15041420      if rhs[0] == :COMPOSITE then
    1505         # composite の中でないのに attr = composite.attr が使われた
     1421        # composite の中でないのに attr = composite.attr が使われた
    15061422        cdl_error( "S1035 composite : cannot specify out of composite celltype definition"  )
    15071423        return
     
    15091425    end
    15101426
    1511     # 以下 composite 文法変更前からある処理
    1512 
    1513     # 既に左辺が同じ名前の初期化が存在するか?
    1514     j = @join_list.get_item( join.get_name )   # mikan NamespacePath がパスを持っている
    1515     if j.instance_of? Join then    # mikan ここでは j が Join or Nil 以外は、ないはず
     1427    # 以下 composite 文法変更前からある処理
     1428
     1429    # 既に左辺が同じ名前の初期化が存在するか?
     1430    j = @join_list.get_item( join.get_name )   # mikan NamespacePath がパスを持っている
     1431    if j.instance_of? Join then    # mikan ここでは j が Join or Nil 以外は、ないはず
    15161432
    15171433      # debug
    15181434      dbgPrint "add_array_member: #{@name} port: #{j.get_port_name} rhs: #{j.get_rhs}, #{join.get_port_name} #{join.get_rhs}\n"
    1519       # 呼び口é
    1520 åˆ—(であると仮定して)要素を追加
     1435      # 呼び口配列(であると仮定して)要素を追加
    15211436      j.add_array_member join
    15221437
     
    15261441    end
    15271442
    1528     # if get_owner then   # error S1030 発生時 get_owner が見つからなくて例外になる
     1443    # if get_owner then   # error S1030 発生時 get_owner が見つからなくて例外になる
    15291444    #   dbgPrint "Cell#new_join: #{get_owner.get_name}.#{@name}\n"
    15301445    # else
     
    15401455  end
    15411456
    1542   #=== Cell.新しい逆結合
     1457  #=== Cell.新しい逆結合
    15431458  def self.new_reverse_join( reverse_join )
    15441459    @@current_object.new_reverse_join( reverse_join )
    15451460  end
    15461461
    1547   #=== Cell#新しい逆結合
     1462  #=== Cell#新しい逆結合
    15481463  def new_reverse_join( reverse_join )
    15491464    dbgPrint( "new_reverse_join name=#{reverse_join.get_name}\n")
     
    15701485  end
    15711486
    1572   #=== Cell#逆結合から結合を生成
     1487  #=== Cell#逆結合から結合を生成
    15731488  # STAGE: S
    15741489  def create_reverse_join
     
    15801495#      @reverse_join_list.get_items.each{ |rj|
    15811496      @reverse_join_list.each{ |rj|
    1582         # 逆結合のæƒ
    1583 å ±ã‚’å¾—ã‚‹
     1497        # 逆結合の情報を得る
    15841498        ep_name = rj.get_name
    15851499        ep_subscript, cp_cell_nsp, cp_name, cp_subscript = rj.get_rhs_cell_and_port
    15861500
    1587         # 呼び口側のセルと、そのセルタイプ
     1501        # 呼び口側のセルと、そのセルタイプ
    15881502        cell = Namespace.find cp_cell_nsp
    15891503        if ! cell.instance_of? Cell then
     
    16161530  end
    16171531
    1618   #=== Cell# cell å†
    1619 ã«è¨˜è¿°ã™ã‚‹å‘¼ã³å£ã®å¤–部結合
    1620   # internal_cell_elem_name:: string : 呼び口名
    1621   # export_name:: string: composite の外部にå
    1622 ¬é–‹ã™ã‚‹å‘¼ã³å£å
    1623   #  呼び口を外部結合する.
    1624   #  このメソッドは、composite の中の cell でしか呼ばれない.
     1532  #=== Cell# cell 内に記述する呼び口の外部結合
     1533  # internal_cell_elem_name:: string : 呼び口名
     1534  # export_name:: string: composite の外部に公開する呼び口名
     1535  #  呼び口を外部結合する.
     1536  #  このメソッドは、composite の中の cell でしか呼ばれない.
    16251537  def external_join( internal_cell_elem_name, export_name, b_composite )
    16261538
    1627     # cCall => composite.cCall; ではないか?
     1539    # cCall => composite.cCall; ではないか?
    16281540    if( b_composite == false )then
    1629       # cCall => cCall; のような場合
     1541      # cCall => cCall; のような場合
    16301542      if @celltype.find( export_name ) then
    16311543        cdl_error( "S1036 $1 : cannot refer to $2\'s here. Use \'composite.$3\' to refer to composite celltype\'s" , export_name, @celltype.get_name, export_name )
    16321544      end
    16331545    end
    1634     # composite の旧文法における、cell 外の cCall = Cell.cCall; の構文処理に渡す
     1546    # composite の旧文法における、cell 外の cCall = Cell.cCall; の構文処理に渡す
    16351547    CompositeCelltype.new_join( export_name, @name,  internal_cell_elem_name, :CALL )
    16361548  end
     
    16441556
    16451557  def end_of_parse f_def
    1646     if @b_prototype then  # prototype 指定子あったか?
    1647       f_def = false       # プロトタイプ宣言とする
     1558    if @b_prototype then  # prototype 指定子あったか?
     1559      f_def = false       # プロトタイプ宣言とする
    16481560      @b_prototype = false
    16491561    end
    16501562    if f_def == false then
    1651       # cell tCelltype Cell; の形式の場合
    1652       # f_def == true の場合 new_def で、呼出される
     1563      # cell tCelltype Cell; の形式の場合
     1564      # f_def == true の場合 new_def で、呼出される
    16531565      set_specifier_list( Generator.get_statement_specifier )
    16541566    end
     
    16601572  end
    16611573
    1662   #=== Cell# プロトタイプ宣言(false)か定義(true)かを設定
    1663   #    このメソッドは構文解釈の最後に呼出される
     1574  #=== Cell# プロトタイプ宣言(false)か定義(true)かを設定
     1575  #    このメソッドは構文解釈の最後に呼出される
    16641576  #f_def::     bool     false if prototype, true if definition
    16651577  def set_f_def f_def
     
    16801592    @f_ref = true
    16811593
    1682     # composite のå†
    1683 éƒ¨ã‚»ãƒ«ã‚’参ç
    1684 §ã•ã‚ŒãŸã“とにする
    1685     # 今のところ問題ないが、未参ç
    1686 §ã§ã‚るべきものまで参ç
    1687 §ã•ã‚ŒãŸã“とになる
     1594    # composite の内部セルを参照されたことにする
     1595    # 今のところ問題ないが、未参照であるべきものまで参照されたことになる
    16881596    if @cell_list then
    16891597      @cell_list.each{ |cn,cell|
     
    16931601  end
    16941602
    1695   #=== Cell# cell の指定子を設定
     1603  #=== Cell# cell の指定子を設定
    16961604  # STAGE:  B
    16971605  #
    1698   #    bnf.y.rb の statement_specifiler_list
     1606  #    bnf.y.rb statement_specifiler_list
    16991607  #spec_list::      [ :ALLOCATOR, [ [ :NORMAL_ALLOC, ep_name, subscript, func_name, param_name, expr ], ... ] ]
    17001608  #                     s[0]      s[1]   a[0]        a[1]       a[2]        a[3]     a[4]       a[5]
    1701   #    セルに指定されたアロケータ指定子
    1702   #    a[1] の subscript はこのメソッドの中で Expression から Integer に評価される
    1703   #    受け口側に生成されるアロケータ呼び口の結合をå†
    1704 éƒ¨ç”Ÿæˆã™ã‚‹
    1705   #    呼び口側は Port の create_allocator_join にて生成
    1706   #    リレーアロケータの場合 create_relay_allocator_join にて生成す
     1609  #    セルに指定されたアロケータ指定子
     1610  #    a[1] の subscript はこのメソッドの中で Expression から Integer に評価される
     1611  #    受け口側に生成されるアロケータ呼び口の結合を内部生成する
     1612  #    呼び口側は Port の create_allocator_join にて生成
     1613  #    リレーアロケータの場合 create_relay_allocator_join にて生成す
    17071614  def set_specifier_list( spec_list )
    1708     return if spec_list == nil  # 空ならば何もしない
     1615    return if spec_list == nil  # 空ならば何もしない
    17091616
    17101617    dbgPrint( "set_spec_list: #{@name}\n" )
    1711     b_generate = false   # generate が指定された
     1618    b_generate = false   # generate が指定された
    17121619
    17131620    spec_list.each{ |s|
    17141621      case s[0]             # statement_specifier
    17151622      when :ALLOCATOR       # [allocator(ePort.func.param=allocCell.eA,ePort.func2.param=allocCell.eA)]
    1716         s[1].each { |a|     # alloc_list : allocator のå†
    1717 éƒ¨ã® ',' で区切られた部分のé
    1718 åˆ—
    1719           cp_name = :"#{a[0+1]}_#{a[2+1]}_#{a[3+1]}"    # アロケータ呼び口の名前:'=' の左辺を '.' に変えて '_' で連結
     1623        s[1].each { |a|     # alloc_list : allocator の内部の ',' で区切られた部分の配列
     1624          cp_name = :"#{a[0+1]}_#{a[2+1]}_#{a[3+1]}"    # アロケータ呼び口の名前:'=' の左辺を '.' に変えて '_' で連結
    17201625          # p "#{a[0]} #{a[0+1]} #{a[2+1]} #{a[3+1]} #{cp_name}"
    17211626          if a[1+1] then
     
    17251630            subscript = nil
    17261631          end
    1727           # アロケータ呼び口の結合を生成
    1728           join = Join.new( cp_name, subscript, a[4+1] )   # 構文解析段階なので locale 不要
     1632          # アロケータ呼び口の結合を生成
     1633          join = Join.new( cp_name, subscript, a[4+1] )   # 構文解析段階なので locale 不要
    17291634          dbgPrint( "new allocator join #{cp_name} #{subscript} #{a[4+1]}\n" )
    17301635          Cell.new_join( join )
     
    17721677  def get_allocator_list
    17731678
    1774     # 意味チェック(set_definition)されていない?
    1775     # relay アロケータの場合、セルの意味チェックが行われていないと、@alloc_list が完成しない
     1679    # 意味チェック(set_definition)されていない?
     1680    # relay アロケータの場合、セルの意味チェックが行われていないと、@alloc_list が完成しない
    17761681    if @b_checked == false then
    17771682      set_definition_join
     
    17841689  end
    17851690
    1786   #=== id 指定子の値を設定
    1787   # このメソッドは、プラグインで cell の生成順序を制御したい場合のために設けた
    1788   # 通常の id 指定子では使っていない
     1691  #=== id 指定子の値を設定
     1692  # このメソッドは、プラグインで cell の生成順序を制御したい場合のために設けた
     1693  # 通常の id 指定子では使っていない
    17891694  def set_specified_id id
    17901695    if Integer( id ) != id || id <= 0 then
     
    17971702  end
    17981703
    1799   #=== Cell# セルタイププラグイン (generate 指定子)
     1704  #=== Cell# セルタイププラグイン (generate 指定子)
    18001705  def cell_plugin
    18011706
     
    18111716
    18121717    begin
    1813       eval( eval_str )     # plugin を生成
     1718      eval( eval_str )     # plugin を生成
    18141719      plugin_object.set_locale @locale
    18151720      @generate[ 2 ] = plugin_object
     
    18271732  end
    18281733
    1829   #=== Cell# cell を composite セルタイプのセル用に clone する
    1830   #name::        string : 親 cell の名前  (cell tComposite cell1 での cell1)
    1831   #global_name:: string : 親 cell の global_name
    1832   #join_array::  Join[] : composite の cell の join で、この cell に対応するもの
    1833   #ct_name::     string : 親セルのセルタイプ名
    1834   #region::      Region : å
    1835 ƒã®ã‚»ãƒ«ãŒå±žã™ã‚‹ region
    1836   #このメソッドは CompositeCelltype の expand から呼出される
     1734  #=== Cell# cell を composite セルタイプのセル用に clone する
     1735  #name::        string : 親 cell の名前  (cell tComposite cell1 での cell1)
     1736  #global_name:: string : 親 cell の global_name
     1737  #join_array::  Join[] : composite の cell の join で、この cell に対応するもの
     1738  #ct_name::     string : 親セルのセルタイプ名
     1739  #region::      Region : 元のセルが属する region
     1740  #このメソッドは CompositeCelltype の expand から呼出される
    18371741  def clone_for_composite( name, global_name, namespacePath, join_array, ct_name, region, plugin, locale )
    18381742
     
    18431747    @@cloned_cell_list[ self ] = @my_clone
    18441748
    1845     # clone したセルのå†
    1846 éƒ¨ã«æŒã¤åå‰æƒ
    1847 å ±ã‚’調整する
     1749    # clone したセルの内部に持つ名前情報を調整する
    18481750
    18491751    @my_clone.set_cloned( name, global_name, namespacePath, join_array, ct_name, region, plugin, locale )
    18501752
    1851     # @celltype == nil は以前にセルタイプ未定義エラー
     1753    # @celltype == nil は以前にセルタイプ未定義エラー
    18521754    if @b_defined == true && @celltype != nil then
    18531755      if @celltype.instance_of?( Celltype ) then
    1854         # celltype に登録(コード生成の対象となる)
     1756        # celltype に登録(コード生成の対象となる)
    18551757        @celltype.new_cell( @my_clone )
    18561758      end
     
    18601762  end
    18611763
    1862   #=== Cell# clone されたセルのå†
    1863 éƒ¨ã«æŒã¤åå‰æƒ
    1864 å ±ã‚’調整する
    1865   #name::        string : 親 cell の名前  (cell tComposite cell1 での cell1)
    1866   #global_name:: string : 親 cell の global_name
    1867   #join_array::  Join[] : composite の cell の join で、この cell に対応するもの
    1868   #parent_ct_name:: string : 親セルのセルタイプ名(composite セルタイプ)
    1869   #  このメソッドはすぐ上の clone_for_composite から呼出され、clone されたセルを整える
     1764  #=== Cell# clone されたセルの内部に持つ名前情報を調整する
     1765  #name::        string : 親 cell の名前  (cell tComposite cell1 での cell1)
     1766  #global_name:: string : 親 cell の global_name
     1767  #join_array::  Join[] : composite の cell の join で、この cell に対応するもの
     1768  #parent_ct_name:: string : 親セルのセルタイプ名(composite セルタイプ)
     1769  #  このメソッドはすぐ上の clone_for_composite から呼出され、clone されたセルを整える
    18701770  def set_cloned( name, global_name, namespacePath, join_array, parent_ct_name, region, plugin, locale )
    18711771
     
    18841784    @f_cloned = true
    18851785
    1886     # Namespace.new_cell( self )  # mikan namespace 対応
    1887     region.new_cell( self )  # mikan  namespace に cell を置けないことを仮定
    1888 
    1889     # join_list : NamedList の clone を作る
     1786    # Namespace.new_cell( self )  # mikan namespace 対応
     1787    region.new_cell( self )  # mikan  namespace に cell を置けないことを仮定
     1788
     1789    # join_list : NamedList の clone を作る
    18901790    if @celltype then
    18911791      dbgPrint "set_cloned: #{@celltype.get_name} #{@name} #{region.get_name}\n"
     
    19001800    @cell_list2 = []
    19011801
    1902     # このセルのグローバル名を与える
    1903     # C_EXP の$id$ 置換はこのセルの名前になる
     1802    # このセルのグローバル名を与える
     1803    # C_EXP の$id$ 置換はこのセルの名前になる
    19041804    join_array.each { |j|
    19051805      @join_list.change_item j
    19061806    }
    19071807
    1908     # clone しようとするセルが composit セルタイプ?
     1808    # clone しようとするセルが composit セルタイプ?
    19091809    if @celltype.instance_of?( CompositeCelltype ) then
    1910       # composite cell を再帰的に展開
     1810      # composite cell を再帰的に展開
    19111811      @cell_list, @cell_list2 = @celltype.expand( @name, @global_name, @NamespacePath, @join_list, @region, @plugin, @locale )
    19121812    end
     
    19141814  end
    19151815
    1916   #=== Cell# clone された cell の join_list の右辺の変更
    1917   #  呼び口の右辺の cell を他の clone された cell に置換え
     1816  #=== Cell# clone された cell の join_list の右辺の変更
     1817  #  呼び口の右辺の cell を他の clone された cell に置換え
    19181818  def change_rhs_port
    19191819
     
    19271827    if @celltype.instance_of?( CompositeCelltype ) then
    19281828
    1929       # å
    1930 ¥ã‚Œå­ã®ã‚»ãƒ«ã«ã¤ã„ても変更
     1829      # 入れ子のセルについても変更
    19311830      @cell_list.each{ |name,c|
    19321831        c.change_rhs_port
     
    19671866  end
    19681867
    1969   #=== Cell# 生成されるセルか?
    1970   # 最適化、コード生成中に、対象となる region に属する場合 true を返す
     1868  #=== Cell# 生成されるセルか?
     1869  # 最適化、コード生成中に、対象となる region に属する場合 true を返す
    19711870  def is_generate?
    19721871    if $generating_region == nil then
    1973       # 構文解釈、意味解析段階で呼ばれると例外発生
     1872      # 構文解釈、意味解析段階で呼ばれると例外発生
    19741873      raise "is_generate? called before optimizing"
    19751874    end
     
    19831882  end
    19841883
    1985   #=== Cell# composite å†
    1986 éƒ¨ã®è¤‡è£½ã•ã‚ŒãŸã‚»ãƒ«ã‹ï¼Ÿ
    1987   # composite 定義のå†
    1988 éƒ¨ã®ã‚»ãƒ« (@in_composite = true) ではない
     1884  #=== Cell# composite 内部の複製されたセルか?
     1885  # composite 定義の内部のセル (@in_composite = true) ではない
    19891886  def is_cloned?
    19901887    @f_cloned
    19911888  end
    19921889
    1993   #=== Cell# composite å†
    1994 éƒ¨ã®ã‚»ãƒ«ã‹ï¼Ÿ
     1890  #=== Cell# composite 内部のセルか?
    19951891  def is_in_composite?
    19961892    @in_composite
    19971893  end
    19981894
    1999   # composite cell の port に対応するå†
    2000 éƒ¨ã® cell の port の名前(リンク時にå¿
    2001 è¦ãªåå‰ï¼‰
     1895  # composite cell の port に対応する内部の cell の port の名前(リンク時に必要な名前)
    20021896  def get_real_global_name port_name
    20031897    if @celltype.instance_of?( CompositeCelltype ) then
     
    20271921  end
    20281922
    2029   #=== Cell# セルの受け口 port_name に対する実際のセル名、受け口名を '_' で連結
    2030   #    namespace 名 + '_' + セル名 + '_' + 受け口名   ï¼ˆã“のセルが composite ならば展開後のセル名、受け口名)
     1923  #=== Cell# セルの受け口 port_name に対する実際のセル名、受け口名を '_' で連結
     1924  #    namespace 名 + '_' + セル名 + '_' + 受け口名   (このセルが composite ならば展開後のセル名、受け口名)
    20311925  def get_real_global_port_name port_name
    20321926
    2033     # composite か?
     1927    # composite か?
    20341928    if @celltype.instance_of?( CompositeCelltype ) then
    20351929
     
    20421936      }
    20431937
    2044       # セルタイプå†
    2045 ã§ port_name の CompositeCelltypeJoin を探す(コード生成段階ではå¿
    2046 ãšè¦‹ã¤ã‹ã‚‹ï¼‰
     1938      # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる)
    20471939      cj = @celltype.find_export( port_name )
    20481940
     
    20501942      dbgPrint "   composite join name: #{cj.get_name}  cell: #{cj.get_cell_name}  cell elem: #{cj.get_cell_elem_name}\n"
    20511943
    2052       # composite のå†
    2053 éƒ¨ã®ã‚»ãƒ«ã«å¯¾ã—再帰的に get_real_global_port_name を適用
     1944      # composite の内部のセルに対し再帰的に get_real_global_port_name を適用
    20541945      name = @cell_list[ "#{cj.get_cell_name}" ].get_real_global_port_name( cj.get_cell_elem_name )
    20551946      return name
     
    20631954  end
    20641955
    2065   #=== Cell# PORT (celltype の定義) を得る
     1956  #=== Cell# PORT (celltype の定義) を得る
    20661957  def get_real_port( port_name )
    20671958
    2068     # composite か?
     1959    # composite か?
    20691960    if @celltype.instance_of?( CompositeCelltype ) then
    20701961
    2071       # セルタイプå†
    2072 ã§ port_name の CompositeCelltypeJoin を探す(コード生成段階ではå¿
    2073 ãšè¦‹ã¤ã‹ã‚‹ï¼‰
     1962      # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる)
    20741963      cj = @celltype.find_export( port_name )
    20751964
    2076       # composite のå†
    2077 éƒ¨ã®ã‚»ãƒ«ã«å¯¾ã—再帰的に get_real_port を適用
     1965      # composite の内部のセルに対し再帰的に get_real_port を適用
    20781966      port = @cell_list[ "#{cj.get_cell_name}" ].get_real_port( cj.get_cell_elem_name )
    20791967      return port
     
    20841972  end
    20851973
    2086   #=== Cell# cell を得る
    2087   #    composite でなければ自分自身を返す
     1974  #=== Cell# cell を得る
     1975  #    composite でなければ自分自身を返す
    20881976  def get_real_cell( port_name )
    20891977
    2090     # composite か?
     1978    # composite か?
    20911979    if @celltype.instance_of?( CompositeCelltype ) then
    20921980
    2093       # セルタイプå†
    2094 ã§ port_name の CompositeCelltypeJoin を探す(コード生成段階ではå¿
    2095 ãšè¦‹ã¤ã‹ã‚‹ï¼‰
     1981      # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる)
    20961982      cj = @celltype.find_export( port_name )
    20971983
    2098       # composite のå†
    2099 éƒ¨ã®ã‚»ãƒ«ã«å¯¾ã—再帰的に get_real_port を適用
     1984      # composite の内部のセルに対し再帰的に get_real_port を適用
    21001985      cell = @cell_list[ "#{cj.get_cell_name}" ].get_real_cell( cj.get_cell_elem_name )
    21011986      return cell
     
    21071992
    21081993
    2109   #=== Cell# 受け口のport の参ç
    2110 §ã‚«ã‚¦ãƒ³ãƒˆã‚’アップする
    2111   #port_name:: Symbol  : ポート名
     1994  #=== Cell# 受け口のport の参照カウントをアップする
     1995  #port_name:: Symbol  : ポート名
    21121996  def port_referenced port
    21131997    if @referenced_port_list[ port ] then
     
    21172001    end
    21182002
    2119     # composite か?
     2003    # composite か?
    21202004    if @celltype.instance_of?( CompositeCelltype ) then
    21212005
    2122       # セルタイプå†
    2123 ã§ port_name の CompositeCelltypeJoin を探す(コード生成段階ではå¿
    2124 ãšè¦‹ã¤ã‹ã‚‹ï¼‰
     2006      # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる)
    21252007      cj = @celltype.find_export( port.get_name )
    21262008
    21272009      dbgPrint " port_referenced: #{@celltype.get_name} #{@name} cj=#{cj&&(cj.get_name)||"nil"}\n"
    21282010
    2129       if cj then  # 既にエラー
    2130         # composite のå†
    2131 éƒ¨ã®ã‚»ãƒ«ã«å¯¾ã—再帰的に get_real_port を適用
     2011      if cj then  # 既にエラー
     2012        # composite の内部のセルに対し再帰的に get_real_port を適用
    21322013        cell = @cell_list[ "#{cj.get_cell_name}" ]
    21332014        if cell && cell.get_celltype then
     
    21812062  end
    21822063
    2183   #=== Cell# 受け口é
    2184 åˆ—の添数の最大値を設定
     2064  #=== Cell# 受け口配列の添数の最大値を設定
    21852065  def set_entry_port_max_subscript( port, num )
    21862066    dbgPrint( "set_entry_port_max_subscript: #{@name}.#{port.get_name}: #{num}\n" )
     
    21932073  end
    21942074
    2195   #=== Cell# composite のå†
    2196 å´ã‚»ãƒ«ã®å—け口é
    2197 åˆ—の添数の最大値を設定
     2075  #=== Cell# composite の内側セルの受け口配列の添数の最大値を設定
    21982076  def set_entry_inner_port_max_subscript( port, num )
    2199     if @cell_list == nil then   # mikan これって問題ない?
    2200       return    # プロトタイプ宣言しかされていなくて、å†
    2201 å´ã‚»ãƒ«ãŒå±•é–‹ã•ã‚Œã¦ã„ない
    2202     end
    2203 
    2204     # composite のå†
    2205 å´ã®ã‚»ãƒ«ã«ä¼æ’­
     2077    if @cell_list == nil then   # mikan これって問題ない?
     2078      return    # プロトタイプ宣言しかされていなくて、内側セルが展開されていない
     2079    end
     2080
     2081    # composite の内側のセルに伝播
    22062082    if @celltype.instance_of? CompositeCelltype then
    22072083      cj = @celltype.find_export port.get_name
     
    22172093  end
    22182094
    2219   #=== Cell# 受け口é
    2220 åˆ—の添数の最大値を返す
    2221   # 長さは +1 する
    2222   # 1つもない場合は -1 を返す
     2095  #=== Cell# 受け口配列の添数の最大値を返す
     2096  # 長さは +1 する
     2097  # 1つもない場合は -1 を返す
    22232098  def get_entry_port_max_subscript( port )
    22242099    subscript = @entry_array_max_subscript[port]
     
    22292104  end
    22302105
    2231   #=== Cell# リレーアロケータの結合を生成
     2106  #=== Cell# リレーアロケータの結合を生成
    22322107  # STAGE: S
    2233   # 呼び口側の結合をå
    2234 ƒã«å—け口側の結合を生成
     2108  # 呼び口側の結合を元に受け口側の結合を生成
    22352109  def create_relay_allocator_join
    22362110
    2237     # celltype がなければチェックしない(既にエラー)
     2111    # celltype がなければチェックしない(既にエラー)
    22382112    return if @celltype == nil
    22392113
    2240     # relay allocator を生成
     2114    # relay allocator を生成
    22412115    @celltype.get_port_list.each { |p|
    22422116      ail = p.get_allocator_instance
     
    22442118        dbgPrint "create_relay_allocator_join: #{@name}, #{p.get_name}\n"
    22452119        if p.get_array_size then
    2246           # mikan relay allocator が array に対応できてもよいのでは?
     2120          # mikan relay allocator が array に対応できてもよいのでは?
    22472121          cdl_error( "S1040 array not supported for relay allocator"  )
    22482122          next
     
    22522126          if ai2[0] == :RELAY_ALLOC then
    22532127            dbgPrint "create_relay_allocator_join: #{@name}, #{name}\n"
    2254             # 呼び口側の結合を取り出す
     2128            # 呼び口側の結合を取り出す
    22552129            ja = @join_list.get_item( :"#{ai2[3]}_#{ai2[4]}_#{ai2[5]}" )
    22562130            if ja == nil then
    2257               # 見つからない場合
     2131              # 見つからない場合
    22582132              found = false
    22592133             
    2260               # composite å†
    2261 ã§å¤–部に結合されているか
     2134              # composite 内で外部に結合されているか
    22622135              if @in_composite then
    22632136                @compositecelltypejoin_list.get_items.each { |cj|
     
    22762149                cdl_error( "S1041 \'$1_$2_$3\': not joined. cannot create internal join for relay allocator" , ai2[3], ai2[4], ai2[5] )
    22772150                print( "      In cell #{get_name}\n" )
    2278                 # join が未結合であることのエラーは二度でる (S1043)
     2151                # join が未結合であることのエラーは二度でる (S1043)
    22792152              end
    2280               next    # 打ち切る
     2153              next    # 打ち切る
    22812154            end
    22822155
    22832156            b_export = false
    2284             # composite å†
    2285 ã®ã‚»ãƒ«ã§ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„るかチェック
    2286             #  mikan エクスポート側と、こちら側で、リレーå
    2287 ˆãŒä¸€è‡´ã™ã‚‹ã‹ãƒã‚§ãƒƒã‚¯ãŒå¿
    2288 è¦
     2157            # composite 内のセルでエクスポートされているかチェック
     2158            #  mikan エクスポート側と、こちら側で、リレー先が一致するかチェックが必要
    22892159            if @compositecelltypejoin_list then
    2290               # export されているか調べる
     2160              # export されているか調べる
    22912161              @compositecelltypejoin_list.get_items.each{ |cj|
    2292                 # 属性名と composite の export する名前は一致するか
     2162                # 属性名と composite の export する名前は一致するか
    22932163                if p.get_name == cj.get_cell_elem_name then
    22942164                  print "export : #{p.get_name}\n"
    2295                   b_export = true    # 属性は export されているので、とりあえず未初期化とはしない
     2165                  b_export = true    # 属性は export されているので、とりあえず未初期化とはしない
    22962166                  break
    22972167                end
     
    23002170            end
    23012171
    2302             # mikan é
    2303 åˆ—
     2172            # mikan 配列
    23042173            am = nil
    23052174            if am then
     
    23082177                subscript = ja2.get_subscript
    23092178                if b_export == false then
    2310                   # CompositeCelltype の場合、å†
    2311 å´ã®ã‚»ãƒ«ã§ç”Ÿæˆã•ã›ã‚‹
     2179                  # CompositeCelltype の場合、内側のセルで生成させる
    23122180                  join = Join.new( :"#{p.get_name}_#{ai2[1]}_#{ai2[2]}", subscript, rhs, @loacle )
    23132181                  # p ( "#{p.get_name}_#{ai2[1]}_#{ai2[2]}", subscript, rhs )
    23142182                  new_join( join )
    23152183                  join.set_definition( @celltype.find(join.get_name) )
    2316                   # mikan relay mismatch チェックができていない(下方を参ç
    2317 §ï¼‰
     2184                  # mikan relay mismatch チェックができていない(下方を参照)
    23182185                end
    23192186                @alloc_list << [ :NORMAL_ALLOC, p.get_name, subscript, ai2[1], ai2[2], rhs ]
     
    23212188            else
    23222189              if b_export == false then
    2323                 # CompositeCelltype の場合、å†
    2324 å´ã®ã‚»ãƒ«ã§ç”Ÿæˆã•ã›ã‚‹
     2190                # CompositeCelltype の場合、内側のセルで生成させる
    23252191                join = Join.new( :"#{p.get_name}_#{ai2[1]}_#{ai2[2]}", nil, ja.get_rhs, @locale )
    23262192                new_join( join )
     
    23322198                                      "#{p.get_name}_#{ai2[1]}_#{ai2[2]}",
    23332199                                      "#{ai2[3]}_#{ai2[4]}_#{ai2[5]}" )
    2334                     # 本当は composite の呼び口と受け口の間で行うべきだが、å†
    2335 éƒ¨ã§å¤šæ®µæŽ¥ç¶šã•ã‚Œã¦ã„る場合
     2200                    # 本当は composite の呼び口と受け口の間で行うべきだが、内部で多段接続されている場合
    23362201                  else
    23372202                    dbgPrint "relay success:  #{p.get_name}_#{ai2[1]}_#{ai2[2]}=>#{ai2[3]}_#{ai2[4]}_#{ai2[5]} #{jr.get_rhs_cell2.get_name}.#{jr.get_rhs_port2} \n"
     
    23482213  end
    23492214
    2350   #=== Cell# @@cell_list2 を作る
    2351   # @@cell_list2 は、出現順に composite å†
    2352 ã‚’含むセルのリスト
     2215  #=== Cell# @@cell_list2 を作る
     2216  # @@cell_list2 は、出現順に composite 内を含むセルのリスト
    23532217  def self.make_cell_list2
    23542218    @@cell_list.each{ |c|
     
    23582222  end
    23592223
    2360   #=== Cell# @@cell_list2 を得る
    2361   # composite å†
    2362 ã‚’含む (compositeも含む)
    2363   # 意味解析後に作成される
     2224  #=== Cell# @@cell_list2 を得る
     2225  # composite 内を含む (compositeも含む)
     2226  # 意味解析後に作成される
    23642227  def self.get_cell_list2
    23652228    @@cell_list2
    23662229  end
    23672230
    2368   #=== Cell# @@cell_list を得る
    2369   #composite の中を含まない
     2231  #=== Cell# @@cell_list を得る
     2232  #composite の中を含まない
    23702233  def self.get_cell_list
    23712234    @@cell_list
    23722235  end
    23732236
    2374   #=== Cell# reverse_join を生成する
     2237  #=== Cell# reverse_join を生成する
    23752238  def self.create_reverse_join
    23762239    @@cell_list.each{ |c|
     
    23842247  end
    23852248
    2386   #=== Cell# reverse_require_join を生成する
     2249  #=== Cell# reverse_require_join を生成する
    23872250  def self.create_reverse_require_join
    23882251    @@cell_list2.each{ |c|
     
    23902253      # if c.is_generate? then
    23912254        if ct then
    2392           # self への呼び口側の結合を生成
     2255          # self への呼び口側の結合を生成
    23932256          ct.create_reverse_require_join c
    23942257        end
     
    23972260  end
    23982261
    2399   #=== Cell# 受け口のport の参ç
    2400 §ã‚«ã‚¦ãƒ³ãƒˆã‚’設定する
    2401   # self は呼びå
    2402 ƒã®ã‚»ãƒ«
    2403   # 呼びå
    2404 ˆã‚»ãƒ«ã®å—け口の参ç
    2405 §ã‚«ã‚¦ãƒ³ãƒˆã‚’アップする
     2262  #=== Cell# 受け口のport の参照カウントを設定する
     2263  # self は呼び元のセル
     2264  # 呼び先セルの受け口の参照カウントをアップする
    24062265  def set_port_reference_count
    24072266    @join_list.get_items.each { |j|
    24082267      if j.get_definition.instance_of? Port then
    24092268        am = j.get_array_member2
    2410         if am then             # 呼び口é
    2411 åˆ—
     2269        if am then             # 呼び口配列
    24122270          am.each { |j2|
    2413             next if j2 == nil    # optional で一部が欠落しているケース
     2271            next if j2 == nil    # optional で一部が欠落しているケース
    24142272            cell = j2.get_rhs_cell2
    2415             next if cell == nil     # 右辺が見つからなかった.既にエラー
     2273            next if cell == nil     # 右辺が見つからなかった.既にエラー
    24162274            port = cell.get_celltype.find( j2.get_rhs_port2 )
    24172275            dbgPrint( "set_port_reference_count: #{@name}.#{j2.get_name} => #{cell.get_name}.#{port.get_name}\n")
     
    24202278        else
    24212279          cell = j.get_rhs_cell2
    2422           next if cell == nil     # 右辺が見つからなかった.既にエラー
     2280          next if cell == nil     # 右辺が見つからなかった.既にエラー
    24232281          port = cell.get_celltype.find( j.get_rhs_port2 )
    24242282          dbgPrint( "set_port_reference_count: #{@name}.#{j.get_name} => #{cell.get_name}.#{port.get_name}\n")
     
    24292287  end
    24302288
    2431   #=== Cell# 結合(Join)のチェック
    2432   #     Join は呼び口の結合または attribute の初期化
     2289  #=== Cell# 結合(Join)のチェック
     2290  #     Join は呼び口の結合または attribute の初期化
    24332291  #
    2434   #  mikan このメソッドは、以下の4つのチェックからなるが、分割したほうがより適切な長さのメソッドになる
    2435   #  ・リレーアロケータの生成 => create_relay_allocator_join
    2436   #  ・未結合の呼び口のチェック
    2437   #  ・ポインタ型がé
    2438 åˆ—で初期化される場合のチェック
    2439   #  ・未初期化の属性のチェック
     2292  #  mikan このメソッドは、以下の4つのチェックからなるが、分割したほうがより適切な長さのメソッドになる
     2293  #  ・リレーアロケータの生成 => create_relay_allocator_join
     2294  #  ・未結合の呼び口のチェック
     2295  #  ・ポインタ型が配列で初期化される場合のチェック
     2296  #  ・未初期化の属性のチェック
    24402297  def check_join
    24412298
    2442     # celltype がなければチェックしない(既にエラー)
     2299    # celltype がなければチェックしない(既にエラー)
    24432300    return if @celltype == nil
    24442301    return if @b_defined == false
    2445     return if @f_cloned == true    # å†
    2446 éƒ¨ã‚»ãƒ«ã«ã¤ã„ては、composite の定義時にチェックされている
     2302    return if @f_cloned == true    # 内部セルについては、composite の定義時にチェックされている
    24472303
    24482304    # debug
     
    24522308    # end
    24532309
    2454     # 未結合の呼び口のチェック
     2310    # 未結合の呼び口のチェック
    24552311    @celltype.get_port_list.each { |p|
    24562312
    2457       # 呼び口でなければ、チェックしない
     2313      # 呼び口でなければ、チェックしない
    24582314      next if p.get_port_type != :CALL
    24592315
     
    24612317      dbgPrint "check_join: #{@name} #{get_celltype.get_name} #{p.get_name}\n"
    24622318
    2463       # 結合リストの中から呼び口名に一致するものを取りだす
     2319      # 結合リストの中から呼び口名に一致するものを取りだす
    24642320      j = @join_list.get_item( p.get_name )
    24652321
    24662322      if j == nil then
    2467         # 未結合の呼び口
    2468 
    2469         # composite celltype のå†
    2470 éƒ¨ã®å ´åˆã€composite celltype が export する呼び口に結合されているか探す
     2323        # 未結合の呼び口
     2324
     2325        # composite celltype の内部の場合、composite celltype が export する呼び口に結合されているか探す
    24712326        found = false
    24722327        if @in_composite then
    2473           # composite celltype の export するものすべてから探す
    2474           # (export するものの右辺値から探すために get_item ではダメ)
     2328          # composite celltype の export するものすべてから探す
     2329          # (export するものの右辺値から探すために get_item ではダメ)
    24752330          @compositecelltypejoin_list.get_items.each{ |cj|
    2476             # 呼び口名と composite の export する名前は一致するか
     2331            # 呼び口名と composite の export する名前は一致するか
    24772332            if p.get_name == cj.get_cell_elem_name then
    24782333              found = true
     
    24812336        end
    24822337
    2483         # 呼び口é
    2484 åˆ—の場合 optional でå
    2485 ¨ã¦ã®è¦ç´ ãŒåˆæœŸåŒ–されない場合に、ここへ来る
     2338        # 呼び口配列の場合 optional で全ての要素が初期化されない場合に、ここへ来る
    24862339        if ! found && ! p.is_require? && ! p.is_optional? then
    24872340          if ! p.is_allocator_port? then
     
    24922345        end
    24932346      elsif p.get_array_size.kind_of? Integer then
    2494         # 添数あり呼び口é
    2495 åˆ—の場合、すべての添数要素が初期化されているかチェックする
     2347        # 添数あり呼び口配列の場合、すべての添数要素が初期化されているかチェックする
    24962348
    24972349        am = j.get_array_member2
    24982350        if( am )then
    2499           # join はé
    2500 åˆ—
    2501 
    2502           # 呼び口é
    2503 åˆ—定義でのé
    2504 åˆ—の大きさ
     2351          # join は配列
     2352
     2353          # 呼び口配列定義での配列の大きさ
    25052354          length = p.get_array_size
    25062355
    2507           # é
    2508 åˆ—の大きさが呼び口é
    2509 åˆ—定義と結合定義で一致するか?
     2356          # 配列の大きさが呼び口配列定義と結合定義で一致するか?
    25102357          if am.length != length then
    25112358            if ! p.is_optional? || am.length >= length then
    2512               # optional の場合、要素数が少なすぎるのは OK
     2359              # optional の場合、要素数が少なすぎるのは OK
    25132360              cdl_error( "S1044 $1: array initializer too many or few, $2 for $3" , p.get_name, am.length, length )
    25142361            end
    25152362
    2516             # am の要素に nil を追加しておく (#_CPA_# のコード生成時、このé
    2517 åˆ—要素数分生成)
     2363            # am の要素に nil を追加しておく (#_CPA_# のコード生成時、この配列要素数分生成)
    25182364            i = am.length
    25192365            while i < length
     
    25232369          end
    25242370
    2525 #          # é
    2526 åˆ—要素の抜けがないかチェック
    2527 #          if am.length < length then  # 満たない場合既にエラーだが要素のある範囲でチェック
     2371#          # 配列要素の抜けがないかチェック
     2372#          if am.length < length then  # 満たない場合既にエラーだが要素のある範囲でチェック
    25282373#            length = am.length
    25292374#          end
     
    25352380              end
    25362381            else
    2537               # 生成されないリージョンへの結合かチェック
     2382              # 生成されないリージョンへの結合かチェック
    25382383              if ! @in_composite then
    25392384                am[i].check_region2
     
    25442389
    25452390        # else
    2546         # join が非é
    2547 åˆ—であれば、既にエラー
     2391        # join が非配列であれば、既にエラー
    25482392        end
    25492393      elsif j.get_array_member then
    2550         # 添数なし呼び口é
    2551 åˆ—の場合
     2394        # 添数なし呼び口配列の場合
    25522395        am = j.get_array_member2
    25532396        length = am.length
     
    25622405        end
    25632406
    2564         # 生成されないリージョンへの結合かチェック
     2407        # 生成されないリージョンへの結合かチェック
    25652408        if ! @in_composite then
    25662409          am.each { |join|
     
    25712414        end
    25722415      else
    2573         # 呼び口[é
    2574 åˆ—」でない場合
    2575 
    2576         # 生成されないリージョンへの結合かチェック
     2416        # 呼び口[配列」でない場合
     2417
     2418        # 生成されないリージョンへの結合かチェック
    25772419        if ! @in_composite then
    25782420          j.check_region2
     
    25822424    }
    25832425
    2584     # ポインタ型がé
    2585 åˆ—で初期化される場合のチェック
     2426    # ポインタ型が配列で初期化される場合のチェック
    25862427    (@celltype.get_attribute_list+@celltype.get_var_list).each { |a|
    25872428      if a.get_size_is then
    25882429
    25892430        if a.instance_of? CompositeCelltypeJoin then
    2590           # 既にエラーになっている
     2431          # 既にエラーになっている
    25912432          # cdl_error( "S1047 size_is pointer cannot be exposed for composite attribute"  )
    25922433          next
     
    25982439          size = a.get_size_is.eval_const( @join_list, @celltype.get_name_list )
    25992440          a.get_type.set_scs( a.get_size_is, nil, nil, nil, false )
    2600           if( ! size.kind_of? Integer )then               # C_EXP の可能性あり
    2601             # mikan 多分ここでのエラー発生は不要、eval_const の中で変数が存在しない、型が不適切などのエラーになるはず
     2441          if( ! size.kind_of? Integer )then               # C_EXP の可能性あり
     2442            # mikan 多分ここでのエラー発生は不要、eval_const の中で変数が存在しない、型が不適切などのエラーになるはず
    26022443            cdl_error( "S1049 $1: size_is arg not constant" , a.get_name )
    26032444          else
     
    26152456              end
    26162457            else
    2617               # size_is 引数がセルで指定されていて、初期化子がセルタイプで指定されているケースのチェック
     2458              # size_is 引数がセルで指定されていて、初期化子がセルタイプで指定されているケースのチェック
    26182459              ini = a.get_initializer
    26192460              if ini.instance_of? Expression
     
    26302471      else
    26312472        if ! a.instance_of? CompositeCelltypeJoin then
    2632           # composite は size_is 指定できない
     2473          # composite は size_is 指定できない
    26332474          if a.get_type.kind_of?( PtrType ) then
    26342475            j = @join_list.get_item( a.get_identifier )
    26352476            if j && j.get_rhs.instance_of?( Array ) then
    2636               ## size_is 指定されていないポインタが Array で初期化されていたら、エラーとする
     2477              ## size_is 指定されていないポインタが Array で初期化されていたら、エラーとする
    26372478              cdl_error( "S1169 $1: non-size_is pointer cannot be initialized with array initializer" , a.get_identifier )
    26382479            end
     
    26422483    }
    26432484
    2644     # 未初期化の属性をチェック
     2485    # 未初期化の属性をチェック
    26452486    @celltype.get_attribute_list.each { |a|
    26462487      b_init = false
    26472488      # self.show_tree 1
    2648       if a.get_initializer then                               # セルタイプで初期化されている
     2489      if a.get_initializer then                               # セルタイプで初期化されている
    26492490        b_init = true
    2650         # @in_composite で export されている場合には、この初期値は使われない
    2651         # export されている、いないに関わらず、初期化されていることが保証される
    2652       elsif @join_list.get_item( a.get_name ) then            # セルで初期化されている
     2491        # @in_composite で export されている場合には、この初期値は使われない
     2492        # export されている、いないに関わらず、初期化されていることが保証される
     2493      elsif @join_list.get_item( a.get_name ) then            # セルで初期化されている
    26532494        b_init = true
    26542495      elsif @in_composite && @compositecelltypejoin_list then
    2655         # 属性が export されているか調べる。export されていれば未初期化とはしない
    2656         # mikan リニアサーチ
     2496        # 属性が export されているか調べる。export されていれば未初期化とはしない
     2497        # mikan リニアサーチ
    26572498        @compositecelltypejoin_list.get_items.each{ |cj|
    2658           # 属性名と composite の export する名前は一致するか
     2499          # 属性名と composite の export する名前は一致するか
    26592500          if a.get_name.to_sym == cj.get_cell_elem_name.to_sym then
    2660             b_init = true    # 属性は export されているので、とりあえず未初期化とはしない
     2501            b_init = true    # 属性は export されているので、とりあえず未初期化とはしない
    26612502          end
    26622503        }
    26632504        if b_init then
    2664           # size_is の引数がマッチするかチェックする
    2665           # å†
    2666 éƒ¨ã‚»ãƒ«ã® size_is をエクスポートする size_is とマッチするかチェックする
    2667           # å†
    2668 éƒ¨ã‚»ãƒ«ã¨ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã§åå‰ã‚’変えている可能性があるので、å†
    2669 éƒ¨ã‚»ãƒ«ã® size_is の名前を変換した上でチェックする
     2505          # size_is の引数がマッチするかチェックする
     2506          # 内部セルの size_is をエクスポートする size_is とマッチするかチェックする
     2507          # 内部セルとエクスポートで名前を変えている可能性があるので、内部セルの size_is の名前を変換した上でチェックする
    26702508          if a.get_size_is then
    26712509            ### p "attr: get_size_is"
     
    26732511            if cj.get_port_decl.instance_of? Decl then
    26742512              ### p "attr: get_size_is 2"
    2675               # cj_size_is は、外部å
    2676 ¬é–‹ã•ã‚Œã‚‹ attr の size_is
     2513              # cj_size_is は、外部公開される attr の size_is
    26772514              cj_size_is = cj.get_port_decl.get_size_is
    26782515              if cj_size_is == nil then
     
    26832520              remain = exprs
    26842521              inner_to_export = {}
    2685                           ### exprs に含まれる識別子を抜き出し、対応する export される名前を探す
     2522                          ### exprs に含まれる識別子を抜き出し、対応する export される名前を探す
    26862523              while remain != "" && remain != nil
    26872524                ### p "remain ", remain
    2688                 remain =~ /([^\w]*)([_A-Za-z][\w\d]*)/   # 変数名文字列を取り出す
     2525                remain =~ /([^\w]*)([_A-Za-z][\w\d]*)/   # 変数名文字列を取り出す
    26892526                                if $2 == nil then
    26902527                                                break
     
    26932530                remain = $'
    26942531                ### p exprs, $1, $2, $'
    2695                 # size_is に含まれる変数は、composite で export されているか
     2532                # size_is に含まれる変数は、composite で export されているか
    26962533                cj2 = nil
    26972534                @compositecelltypejoin_list.get_items.each{ |cj2t|
     
    27062543                if cj2.get_port_decl.instance_of? Decl then
    27072544                   decl2 = cj2.get_port_decl
    2708                    # å†
    2709 éƒ¨ã®åå‰ã¨å¤–部の名前の対応関係を記憶
     2545                   # 内部の名前と外部の名前の対応関係を記憶
    27102546                   inner_to_export[arg_name] = decl2.get_name
    2711                 # else cj2 は Port (既にエラー)
     2547                # else cj2 は Port (既にエラー)
    27122548                end
    27132549              end
    2714               # å†
    2715 éƒ¨ã®åå‰ã‚’外部の名前で置換
     2550              # 内部の名前を外部の名前で置換
    27162551              inner_to_export.each{ |arg_name, exp_name|
    27172552                ### p "changing #{arg_name}=>#{exp_name}"
    27182553                # exprs.gsub!( Regexp.new("#{arg_name}[^0-9A-Za-z_]"), exp_name.to_s )
    2719                 exprs.gsub!( Regexp.new("#{arg_name}(\\W)"), exp_name.to_s+"\\1" )  # 文字列末尾にないケース
    2720                 exprs.gsub!( Regexp.new("#{arg_name}\\Z"), exp_name.to_s )          # 文字列末尾にあるケース
     2554                exprs.gsub!( Regexp.new("#{arg_name}(\\W)"), exp_name.to_s+"\\1" )  # 文字列末尾にないケース
     2555                exprs.gsub!( Regexp.new("#{arg_name}\\Z"), exp_name.to_s )          # 文字列末尾にあるケース
    27212556              }
    27222557              ### p "changed: #{exprs} #{cj_size_is.to_s}"
     
    27242559                cdl_error( "S1172 \'$1\' size_is argument mismatch with exporting one \'$2\'", a.get_name, cj.get_name )
    27252560              end
    2726             # else cj は Port (既にエラー)
     2561            # else cj は Port (既にエラー)
    27272562            end
    27282563          end
     
    27372572  end
    27382573
    2739   #=== Cell# 逆 require をチェックする
    2740   # 逆 require 指定された受け口に複数の結合がないかチェックする
    2741   # composite のå†
    2742 éƒ¨ã‚»ãƒ« (f_cloned=true) もチェックする
     2574  #=== Cell# 逆 require をチェックする
     2575  # 逆 require 指定された受け口に複数の結合がないかチェックする
     2576  # composite の内部セル (f_cloned=true) もチェックする
    27432577  def check_reverse_require
    2744     # celltype がなければチェックしない(既にエラー)
     2578    # celltype がなければチェックしない(既にエラー)
    27452579    return if @celltype == nil
    27462580    return if @b_defined == false
    27472581
    27482582    # p "check reverse require   #{@name}"
    2749     # 逆require 指定された受け口に複数の結合がないかチェック
     2583    # 逆require 指定された受け口に複数の結合がないかチェック
    27502584    @referenced_port_list.each{ |port,count|
    27512585      # p port.class, count
     
    27572591  end
    27582592
    2759   #=== Cell# require 呼び口の結合を行う
     2593  #=== Cell# require 呼び口の結合を行う
    27602594  # STAGE: S
    2761   #cp_name:: Symbol           : 呼び口名
    2762   #cell_or_t:: Celltype|Cell  : celltype の require の右辺で指定されたセルタイプまたはセル
    2763   #port::  Port               : celltype の Port オブジェクト
     2595  #cp_name:: Symbol           : 呼び口名
     2596  #cell_or_t:: Celltype|Cell  : celltype の require の右辺で指定されたセルタイプまたはセル
     2597  #port::  Port               : celltype の Port オブジェクト
    27642598  def set_require_join( cp_name, cell_or_ct, port )
    27652599
    2766     # set_require_join は2度呼び出される
    2767     # 2度目は post コードを生成した後       #####  いったん見合わせ(重複エラーを見逃す)
     2600    # set_require_join は2度呼び出される
     2601    # 2度目は post コードを生成した後       #####  いったん見合わせ(重複エラーを見逃す)
    27682602    # if @require_joined_list[ cp_name ] then
    27692603    #   return
     
    27822616      end
    27832617    else
    2784       # require: cell で指定
     2618      # require: cell で指定
    27852619      cell = cell_or_ct
    27862620      if @region.distance( cell.get_region ) == nil then
     
    27922626      cdl_warning( "W1003 $1 : require call port overridden in $2" , cp_name, @name )
    27932627    else
    2794       # require の join を生成(呼び口の結合)
     2628      # require の join を生成(呼び口の結合)
    27952629#      rhs = Expression.new( [ :OP_DOT, [ :IDENTIFIER, Token.new( cell.get_name, nil, nil, nil ) ],
    27962630      nsp = NamespacePath.new( cell.get_name, false, cell.get_namespace )
     
    28052639  end
    28062640
    2807   #=== Cell# Join の definition の設定とチェック
     2641  #=== Cell# Join の definition の設定とチェック
    28082642  # STAGE: S
    28092643  def set_definition_join
    2810     return if @celltype == nil    # 既にエラー:打ち切る
    2811     return if @b_defined == false # プロトタイプ宣言のみ
    2812     return if @b_checked == true  # 既に設定(チェック)済み
     2644    return if @celltype == nil    # 既にエラー:打ち切る
     2645    return if @b_defined == false # プロトタイプ宣言のみ
     2646    return if @b_checked == true  # 既に設定(チェック)済み
    28132647
    28142648    dbgPrint "set_definition_join in #{@name}\n"
    28152649
    2816     # relay allocator をたどって再å
    2817 ¥ã—ないよう、å
    2818 ˆé ­ã§ @b_checked を true にする
     2650    # relay allocator をたどって再入しないよう、先頭で @b_checked を true にする
    28192651    @b_checked = true
    28202652
     
    28222654      check_restrict_list
    28232655     
    2824       # compoiste セルのクローンされたものは、set_definition 不要
    2825       # å
    2826 ƒã® join は既に definition されている
    2827       # å
    2828 ƒã®ã‚»ãƒ«ã«ãŠã„て、代å
    2829 ¥ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„るので、二重にチェック(through適用)されてしまう
     2656      # compoiste セルのクローンされたものは、set_definition 不要
     2657      # 元の join は既に definition されている
     2658      # 元のセルにおいて、代入チェックされているので、二重にチェック(through適用)されてしまう
    28302659      @join_list.get_items.each{ |join|
    28312660        dbgPrint " set_definition_join: checking #{@name}.#{join.get_name}\n"
     
    28332662          port = @celltype.find(join.get_name)
    28342663          join.get_array_member2.each { |am|
    2835             if am == nil then   # 未結合の場合、エラーチェックは check_join
     2664            if am == nil then   # 未結合の場合、エラーチェックは check_join
    28362665              if port && ! port.is_optional? then
    2837                 # テスト用にエラーメッセージ出力
     2666                # テスト用にエラーメッセージ出力
    28382667                # cdl_error( "TEMPORAL set_definition_join: uninitialized array member"  )
    28392668              end
     
    28482677    end
    28492678
    2850     # リレー join は through プラグイン生成後にしかできない
    2851     # through 後に結合å
    2852 ˆãŒå
    2853 ¥ã‚Œæ›¿ãˆã‚‰ã‚Œã‚‹
     2679    # リレー join は through プラグイン生成後にしかできない
     2680    # through 後に結合先が入れ替えられる
    28542681    create_relay_allocator_join
    28552682
    2856     # composite セルの展開
     2683    # composite セルの展開
    28572684    if ! @in_composite && ! @f_cloned && @celltype.instance_of?( CompositeCelltype ) then
    2858       # composite セルタイプå†
    2859 ã® composite は展開しない
    2860       # compoiste セル展開中の composite は展開しない (CompositeCelltype::expand å†
    2861 ã§å†å¸°çš„に expnad)
     2685      # composite セルタイプ内の composite は展開しない
     2686      # compoiste セル展開中の composite は展開しない (CompositeCelltype::expand 内で再帰的に expnad)
    28622687      expand
    28632688    end
    28642689
    2865     # celltype に generate が指定されされているか
     2690    # celltype に generate が指定されされているか
    28662691    celltype_plugin = @celltype.get_celltype_plugin
    28672692    if celltype_plugin then
     
    28752700  end
    28762701
    2877   #=== Cell# composite セルの展開
    2878   # このセルが composite セルタイプ
     2702  #=== Cell# composite セルの展開
     2703  # このセルが composite セルタイプ
    28792704  def expand
    28802705
     
    28822707    dbgPrint "expanding #{@name} #{@celltype.get_name}\n"
    28832708
    2884     # 展開されたセルのリスト
     2709    # 展開されたセルのリスト
    28852710    @@cloned_cell_list = {}
    28862711
    2887     # composite celltype の cell を展開
     2712    # composite celltype の cell を展開
    28882713    @cell_list, @cell_list2 = @celltype.expand( @name, @global_name, @NamespacePath, @join_list, @region, @plugin, @locale )
    28892714
    2890     # プロトタイプが参ç
    2891 §ã•ã‚Œã¦ã„る場合、子も参ç
    2892 §ã•ã‚Œã¦ã„ることにする
     2715    # プロトタイプが参照されている場合、子も参照されていることにする
    28932716    if @f_ref then
    28942717      dbgPrint "expand: set_f_ref\n"
     
    28962719    end
    28972720
    2898     # 呼び口の右辺のセルを clone したものに変更
     2721    # 呼び口の右辺のセルを clone したものに変更
    28992722    self.change_rhs_port
    29002723
    2901     # プロトタイプ宣言で設定されていたものを反映する
     2724    # プロトタイプ宣言で設定されていたものを反映する
    29022725    @entry_array_max_subscript.each{ |port,name|
    29032726      set_entry_inner_port_max_subscript( port, name )
     
    29052728  end
    29062729
    2907   #=== Cell#restrict を追加
     2730  #=== Cell#restrict を追加
    29082731  def add_restrict( entry_name, func_name, region_name_list )
    29092732    if @restrict_list[ entry_name ] then
     
    29942817      puts "entry array #{port.get_name}: max subscript=#{num}"
    29952818    }
    2996     if @cell_list then   # ここで @cell_list が nil なのは Bug
     2819    if @cell_list then   # ここで @cell_list が nil なのは Bug
    29972820      (indent+1).times { print "  " }
    29982821      puts "cloned cell list:"
     
    30182841          subscript = ""
    30192842        end
    3020         # アロケータ呼び口の結合を生成
     2843        # アロケータ呼び口の結合を生成
    30212844        (indent+2).times { print "  " }
    30222845        puts "#{cp_name}#{subscript} = #{a[4+1]}"
     
    30422865# @real_singleton:: bool : has singleton cell in this composite celltype
    30432866# @real_active:: bool : has active cell in this composite celltype
    3044 # @name_list:: NamedList item: Decl (attribute), Port エクスポート定義
     2867# @name_list:: NamedList item: Decl (attribute), Port エクスポート定義
    30452868# @internal_allocator_list:: [ [cell, internal_cp_name, port_name, func_name, param_name, ext_alloc_ent], ... ]
    30462869
     
    30822905
    30832906    Namespace.new_compositecelltype( self )
    3084     set_namespace_path # @NamespacePath の設定
     2907    set_namespace_path # @NamespacePath の設定
    30852908
    30862909    @port_list = []
     
    30982921  def end_of_parse
    30992922
    3100     # singleton に関するチェック
     2923    # singleton に関するチェック
    31012924    if @b_singleton && @real_singleton == nil then
    31022925      cdl_warning( "W1004 $1 : specified singleton but has no singleton in this celltype" , @name )
     
    31072930    end
    31082931
    3109     # active に関するチェック
     2932    # active に関するチェック
    31102933    if @b_active && @real_active == nil then
    31112934      cdl_error( "S1054 $1 : specified active but has no active in this celltype" , @name )
     
    31142937    end
    31152938
    3116     # @allocator_instance を設定する
     2939    # @allocator_instance を設定する
    31172940    @name_list.get_items.each{ |n|
    31182941      if n.instance_of? Port then
     
    31212944    }
    31222945
    3123     # リレーアロケータの entry 側
     2946    # リレーアロケータの entry 側
    31242947    @port_list.each{ |p|
    31252948      if p.get_port_type == :ENTRY then
     
    31352958      end
    31362959    }
    3137     # mikan relay が正しく抜けているかチェックされていない
    3138 
    3139     # 意味解析
     2960    # mikan relay が正しく抜けているかチェックされていない
     2961
     2962    # 意味解析
    31402963    @cell_list.get_items.each{ |c|
    31412964      c.set_definition_join
    31422965    }
    31432966
    3144     # cell の未結合の呼び口がないかチェック
     2967    # cell の未結合の呼び口がないかチェック
    31452968    @cell_list.get_items.each{ |c|
    31462969      c.check_join
     
    31482971    }
    31492972
    3150     # 呼び口の結合について、export とå†
    3151 éƒ¨çµåˆã®ä¸¡æ–¹ãŒãªã„かチェック
    3152     # リレーアロケータ、å†
    3153 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã®è¨­å®š
     2973    # 呼び口の結合について、export と内部結合の両方がないかチェック
     2974    # リレーアロケータ、内部アロケータの設定
    31542975    @port_list.each{ |p|
    31552976      p.check_dup_init
    31562977    }
    31572978
    3158     # すべてのエクスポート定義に対応した呼び口、受け口、属性が存在するかチェック
     2979    # すべてのエクスポート定義に対応した呼び口、受け口、属性が存在するかチェック
    31592980    @name_list.get_items.each{ |n|
    31602981      if( @export_name_list.get_item( n.get_name ) == nil )then
     
    31632984    }
    31642985
    3165     # å†
    3166 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã‚’設定する
     2986    # 内部アロケータを設定する
    31672987    @internal_allocator_list.each{ |cell, cp_internal_name, port_name, fd_name, par_name, ext_alloc_ent|
    31682988      res = ext_alloc_ent.get_allocator_rhs_elements( :INTERNAL_ALLOC )
     
    31953015    cell.set_owner self  # Cell (in_omposite)
    31963016    @cell_list.add_item( cell )
    3197     if cell.get_celltype then    # nil ならば、すでにセルタイプなしエラー
     3017    if cell.get_celltype then    # nil ならば、すでにセルタイプなしエラー
    31983018      if cell.get_celltype.is_singleton? then
    31993019        @real_singleton = cell
     
    32133033  end
    32143034
    3215   #=== CompositeCelltype# CompositeCelltypeJoin を作成
     3035  #=== CompositeCelltype# CompositeCelltypeJoin を作成
    32163036  # STAGE: B
    3217   #export_name:: Symbol : 外部にå
    3218 ¬é–‹ã™ã‚‹åå‰
    3219   #internal_cell_name:: Symbol : å†
    3220 éƒ¨ã‚»ãƒ«å
    3221   #internal_cell_elem_name:: Symbol : å†
    3222 éƒ¨ã‚»ãƒ«ã®è¦ç´ åï¼ˆå‘¼ã³å£åã€å—け口名、属性名のいずれか)
    3223   #type::  :CALL, :ENTRY, :ATTRIBUTE のいずれか(構文要素としてあるべきもの)
    3224   #RETURN:: Decl | Port : エクスポート定義
    3225   # new_join は
    3226   #   cCall => composite.cCall;     (セルå†
    3227 )
    3228   #   attr = composite.attr;        (セルå†
    3229 )
    3230   #   composite.eEnt => cell2.eEnt; (セル外)
    3231   # の構文要素の出現に対して呼び出される
     3037  #export_name:: Symbol : 外部に公開する名前
     3038  #internal_cell_name:: Symbol : 内部セル名
     3039  #internal_cell_elem_name:: Symbol : 内部セルの要素名(呼び口名、受け口名、属性名のいずれか)
     3040  #type::  :CALL, :ENTRY, :ATTRIBUTE のいずれか(構文要素としてあるべきもの)
     3041  #RETURN:: Decl | Port : エクスポート定義
     3042  # new_join は
     3043  #   cCall => composite.cCall;     (セル内)
     3044  #   attr = composite.attr;        (セル内)
     3045  #   composite.eEnt => cell2.eEnt; (セル外)
     3046  # の構文要素の出現に対して呼び出される
    32323047  def new_join( export_name, internal_cell_name,
    32333048                 internal_cell_elem_name, type )
     
    32423057
    32433058    celltype = cell.get_celltype
    3244     return if celltype == nil   # celltype == nil ならすでにエラー
    3245 
    3246     # å†
    3247 éƒ¨ã‚»ãƒ«ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—から対応要素を探す
    3248     # このメソッドは、構文上、呼び口、受け口、属性が記述できる箇所から呼出される
    3249     # 構文上の呼出し位置(記述位置)と、要素が対応したものかチェック
     3059    return if celltype == nil   # celltype == nil ならすでにエラー
     3060
     3061    # 内部セルのセルタイプから対応要素を探す
     3062    # このメソッドは、構文上、呼び口、受け口、属性が記述できる箇所から呼出される
     3063    # 構文上の呼出し位置(記述位置)と、要素が対応したものかチェック
    32503064    obj = celltype.find( internal_cell_elem_name )
    32513065    if obj.instance_of?( Decl ) then
     
    32553069      elsif type != :ATTRIBUTE then
    32563070        cdl_error( "S1059 \'$1\' : exporting attribute. write in cell or use \'=\' to export attribute" , export_name )
    3257         # return 次のエラーを避けるために処理続行し、付け加えてみる
     3071        # return 次のエラーを避けるために処理続行し、付け加えてみる
    32583072      end
    32593073    elsif obj.instance_of?( Port ) then
    32603074      if obj.get_port_type != type then
    32613075        cdl_error( "S1060 \'$1\' : port type mismatch. $2 type is allowed here." , export_name, type )
    3262         # return 次のエラーを避けるために処理続行し、付け加えてみる
     3076        # return 次のエラーを避けるために処理続行し、付け加えてみる
    32633077      end
    32643078    else
     
    32683082    end
    32693083
    3270     # エクスポート定義と一致するかどうかチェック
     3084    # エクスポート定義と一致するかどうかチェック
    32713085    obj2 = @name_list.get_item( export_name )
    32723086    if( obj2 == nil )then
     
    32843098        elsif obj.get_signature != obj2.get_signature then
    32853099          if obj.get_signature != nil && obj2.get_signature != nil then
    3286             # nil ならば既にエラーなので報告しない
     3100            # nil ならば既にエラーなので報告しない
    32873101            cdl_error( "S1066 $1 : signature \'$2\' mismatch with previous definition \'$3\'" , export_name, obj.get_signature.get_name, obj2.get_signature.get_name )
    32883102          end
     
    33093123    if obj.instance_of?( Decl ) then
    33103124      # attribute
    3311 #      # å†
    3312 éƒ¨ã‹ã‚‰å¤–部へ複数の結合がないかチェック
     3125#      # 内部から外部へ複数の結合がないかチェック
    33133126#      found = false
    33143127#      @attr_list.each{ |a|
     
    33233136    else
    33243137      # call/entry port
    3325 #      # å†
    3326 éƒ¨ã‹ã‚‰å¤–部へ複数の結合がないかチェック
     3138#      # 内部から外部へ複数の結合がないかチェック
    33273139#      found = false
    33283140#      @port_list.each{ |port|
     
    33373149    end
    33383150
    3339     # join を @export_name_list に登録(重複チェックとともに,後で行われる CompositeCelltypeJoin の clone に備える)
     3151    # join を @export_name_list に登録(重複チェックとともに,後で行われる CompositeCelltypeJoin の clone に備える)
    33403152    if obj.instance_of?( Decl ) && @export_name_list.get_item( export_name ) then
    3341       # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。
     3153      # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。
    33423154    elsif obj.instance_of?( Port ) && obj.get_port_type == :CALL && @export_name_list.get_item( export_name ) then
    3343       # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。
     3155      # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。
    33443156    else
    33453157      @export_name_list.add_item( join )
    33463158    end
    33473159
    3348     # export するポートに含まれる send/receive パラメータのアロケータ(allocator)呼び口をセルと結合
     3160    # export するポートに含まれる send/receive パラメータのアロケータ(allocator)呼び口をセルと結合
    33493161    if obj2.instance_of? Port then
    33503162      obj2.each_param{ |port, fd, par|
    3351         case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
     3163        case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
    33523164        when :SEND, :RECEIVE
    3353           cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
    3354           #            ポート名         é–¢æ•°å         ãƒ‘ラメータ名
     3165          cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
     3166          #            ポート名         関数名         パラメータ名
    33553167          cp_internal_name = :"#{internal_cell_elem_name}_#{fd.get_name}_#{par.get_name}"
    33563168
    3357           # リレーアロケータ or å†
    3358 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿æŒ‡å®šãŒãªã•ã‚Œã¦ã„る場合、アロケータ呼び口を追加しない
    3359           # この時点では get_allocator_instance では得られないため tmp を得る
     3169          # リレーアロケータ or 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない
     3170          # この時点では get_allocator_instance では得られないため tmp を得る
    33603171          if port.get_allocator_instance_tmp then
    33613172            found = false
     
    33653176
    33663177                if s[0] == :INTERNAL_ALLOC then
    3367                   # å†
    3368 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã®å ´åˆ    # mikan これはå†
    3369 éƒ¨ã®ã‚»ãƒ«ã«ç›´çµã™ã‚‹ã€‚外部のポートに改めるべき
     3178                  # 内部アロケータの場合    # mikan これは内部のセルに直結する。外部のポートに改めるべき
    33703179                  @internal_allocator_list << [ cell, cp_internal_name, port.get_name, fd.get_name, par.get_name, s[3] ]
    33713180                end
     
    33773186          end
    33783187
    3379           # 外部アロケータの場合
     3188          # 外部アロケータの場合
    33803189          new_join( cp_name, internal_cell_name, cp_internal_name, :CALL )
    33813190        end
     
    33833192    end
    33843193
    3385     # エクスポート定義を返す
     3194    # エクスポート定義を返す
    33863195    return obj2
    33873196  end
     
    34053214    @name_list.add_item port
    34063215
    3407     # export するポートに含まれる send/receive パラメータのアロケータ呼び口の export を生成してポートに追加
    3408     # この時点ではå†
    3409 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã‹ã©ã†ã‹åˆ¤æ–­ã§ããªã„ので、とりあえず生成しておく
     3216    # export するポートに含まれる send/receive パラメータのアロケータ呼び口の export を生成してポートに追加
     3217    # この時点では内部アロケータかどうか判断できないので、とりあえず生成しておく
    34103218    port.each_param { |port, fd, par|
    3411       case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
     3219      case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
    34123220      when :SEND, :RECEIVE
    3413         #### リレーアロケータ or å†
    3414 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿æŒ‡å®šãŒãªã•ã‚Œã¦ã„る場合、アロケータ呼び口を追加しない
    3415         # å†
    3416 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿æŒ‡å®šãŒãªã•ã‚Œã¦ã„る場合、アロケータ呼び口を追加しない
    3417         # この時点では get_allocator_instance では得られないため tmp を得る
     3221        #### リレーアロケータ or 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない
     3222        # 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない
     3223        # この時点では get_allocator_instance では得られないため tmp を得る
    34183224        if port.get_allocator_instance_tmp then
    34193225          found = false
     
    34303236
    34313237        if par.get_allocator then
    3432           cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
    3433           #           ãƒãƒ¼ãƒˆå          関数名         ãƒ‘ラメータ名
    3434           alloc_sig_path = [ par.get_allocator.get_name ]  # mikan Namespace アロケータ呼び口のシグニチャ
    3435           array_size = port.get_array_size            # 呼び口または受け口é
    3436 åˆ—のサイズ
    3437           created_port = Port.new( cp_name, alloc_sig_path, :CALL, array_size ) # 呼び口を生成
     3238          cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
     3239          #           ポート名          関数名         パラメータ名
     3240          alloc_sig_path = [ par.get_allocator.get_name ]  # mikan Namespace アロケータ呼び口のシグニチャ
     3241          array_size = port.get_array_size            # 呼び口または受け口配列のサイズ
     3242          created_port = Port.new( cp_name, alloc_sig_path, :CALL, array_size ) # 呼び口を生成
    34383243          created_port.set_allocator_port( port, fd, par )
    34393244          if port.is_omit? then
    34403245            created_port.set_omit
    34413246          end
    3442           new_port( created_port )           # セルタイプに新しい呼び口を追加
     3247          new_port( created_port )           # セルタイプに新しい呼び口を追加
    34433248        # else
    34443249        #   already error
     
    34573262    attribute.each { |a|
    34583263      a.set_owner self   # Decl (CompositeCelltype)
    3459       # V1.1.0.10 composite の attr の size_is は可となった
     3264      # V1.1.0.10 composite の attr の size_is は可となった
    34603265      # if a.get_size_is then
    34613266      #  cdl_error( "S1070 $1: size_is pointer cannot be exposed for composite attribute" , a.get_name )
     
    34683273  end
    34693274
    3470   #=== CompositeCelltype# 逆require の結合を生成する
     3275  #=== CompositeCelltype# 逆require の結合を生成する
    34713276  def create_reverse_require_join cell
    34723277    @name_list.get_items.each{ |n|
     
    34933298    return @name_list.get_item( name )
    34943299
    3495     # 従来仕様
     3300    # 従来仕様
    34963301#    cj = @export_name_list.get_item( name )
    34973302#p "#{name}, #{cj.get_port_decl}"
     
    35033308  end
    35043309
    3505   #=== CompositeCelltype# export する CompositeCelltypeJoin を得る
     3310  #=== CompositeCelltype# export する CompositeCelltypeJoin を得る
    35063311  #name:: string:
    3507   # attribute の場合、同じ名前に対し複数存在する可能性があるが、最初のものしか返さない
     3312  # attribute の場合、同じ名前に対し複数存在する可能性があるが、最初のものしか返さない
    35083313  def find_export name
    35093314    return @export_name_list.get_item( name )
    35103315  end
    35113316
    3512   #=== CompositeCelltype# composite celltype の cell を展開
    3513   #name:: string: Composite cell の名前
    3514   #global_name:: string: Composite cell の global name (C 言語名)
    3515   #join_list:: NamedList : Composite cell に対する Join の NamedList
     3317  #=== CompositeCelltype# composite celltype の cell を展開
     3318  #name:: string: Composite cell の名前
     3319  #global_name:: string: Composite cell の global name (C 言語名)
     3320  #join_list:: NamedList : Composite cell に対する Join の NamedList
    35163321  #RETURN:
    35173322  # [ { name => cell }, [ cell, ... ] ]
    3518   #  戻り値 前は 名前⇒cloneされたå†
    3519 éƒ¨ã‚»ãƒ«ã€å¾Œã‚ã¯ composite の出現順のリスト
     3323  #  戻り値 前は 名前⇒cloneされた内部セル、後ろは composite の出現順のリスト
    35203324  def expand( name, global_name, namespacePath, join_list, region, plugin, locale )
    35213325
     
    35263330    }
    35273331 
    3528     # 展開で clone されたセルのリスト、右辺は Cell (composite の場合 composite な cell の clone)
     3332    # 展開で clone されたセルのリスト、右辺は Cell (composite の場合 composite な cell の clone)
    35293333    clone_cell_list = {}
    35303334    clone_cell_list2 = []
    35313335
    3532     #  composite å†
    3533 éƒ¨ã®ã™ã¹ã¦ã® cell について
     3336    #  composite 内部のすべての cell について
    35343337    @cell_list.get_items.each { |c|
    35353338
     
    35373340      dbgPrint "expand : cell #{c.get_name}\n"
    35383341
    3539       # Join のé
    3540 åˆ—
     3342      # Join の配列
    35413343      ja = []
    35423344
    3543       # CompositeCelltype が export する呼び口、受け口、属性のリストについて
     3345      # CompositeCelltype が export する呼び口、受け口、属性のリストについて
    35443346      # @export_name_list.get_items.each{ |cj|  # cj: CompositeCelltypeJoin
    3545       # 新仕様では、@export_name_list にå
    3546 ¥ã£ã¦ã„ない attr がありうる
     3347      # 新仕様では、@export_name_list に入っていない attr がありうる
    35473348      (@port_list+@attr_list).each{ |cj|        # cj: CompositeCelltypeJoin
    35483349
     
    35503351        dbgPrint "        cj : #{cj.get_name}\n"
    35513352
    3552         # CompositeCelltypeJoin (export) の対象セルか?
     3353        # CompositeCelltypeJoin (export) の対象セルか?
    35533354        if cj.match?( c ) then
    35543355
    3555           # 対象セルå†
    3556 ã® CompositeCelltype の export する Join (attribute または call port)
     3356          # 対象セル内の CompositeCelltype の export する Join (attribute または call port)
    35573357          j = join_list.get_item( cj.get_name )
    35583358
     
    35653365
    35663366          if j then
    3567             # 呼び口、属性の場合
    3568             #  ComositeCell 用のもの(j) を対象セル用に clone (@through_list もコピーされる)
     3367            # 呼び口、属性の場合
     3368            #  ComositeCell 用のもの(j) を対象セル用に clone (@through_list もコピーされる)
    35693369            # p "expand: cloning Join #{j.get_name} #{@name} #{name}"
    35703370            jc = j.clone_for_composite( @name, name, locale )
     
    35743374            # p "cn #{jc.get_name} #{cj.get_cell_elem_name}"
    35753375
    3576             # 対象セルの呼び口または属性の名前に変更
     3376            # 対象セルの呼び口または属性の名前に変更
    35773377            jc.change_name( cj.get_cell_elem_name )
    35783378
    3579             # 対象セルに対する Join のé
    3580 åˆ—
     3379            # 対象セルに対する Join の配列
    35813380            ja << jc
    35823381          end
     
    35903389      dbgPrint "expand : clone #{name}_#{c.get_name}\n"
    35913390
    3592       # セルの clone を生成
     3391      # セルの clone を生成
    35933392#      clone_cell_list[ "#{name}_#{c.get_name}" ] =  c.clone_for_composite( name, global_name, ja )
    35943393      c2 =  c.clone_for_composite( name, global_name, namespacePath, ja, @name, region, plugin, locale )
     
    36003399    clone_cell_list.each { |nm,c|
    36013400      dbgPrint "  cloned: #{nm} = #{c.get_global_name}\n"
    3602       # join の owner を clone されたセルに変更する V1.1.0.25
     3401      # join の owner を clone されたセルに変更する V1.1.0.25
    36033402      c.get_join_list.get_items.each{ |j|
    36043403        j.set_cloned( clone_cell_list[ "#{c.get_local_name}" ] )
     
    36083407  end
    36093408
    3610   #=== CompositeCelltype 指定子リストの設定
     3409  #=== CompositeCelltype 指定子リストの設定
    36113410  def set_specifier_list( spec_list )
    36123411    return if spec_list == nil
     
    36393438
    36403439  def get_var_list
    3641     []   # 空のé
    3642 åˆ—を返す
     3440    []   # 空の配列を返す
    36433441  end
    36443442
     
    36473445  end
    36483446
    3649   #== CompositeCelltype# generate 指定子のæƒ
    3650 å ±
    3651   # CompositeCelltype には generate が指定できないので nil を返す
    3652   # Celltype::@generate を参ç
    3653 §ã®ã“と
     3447  #== CompositeCelltype# generate 指定子の情報
     3448  # CompositeCelltype には generate が指定できないので nil を返す
     3449  # Celltype::@generate を参照のこと
    36543450  def get_celltype_plugin
    36553451    nil
     
    36643460  end
    36653461
    3666   #=== CompositeCelltype# アクティブではない
    3667   # active ではないに加え、å
    3668 ¨ã¦ã®å†
    3669 éƒ¨ã‚»ãƒ«ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—が inactive の場合に inactive
    3670   # (å†
    3671 éƒ¨ã®ã‚»ãƒ«ãŒ active または factory を持っている)
     3462  #=== CompositeCelltype# アクティブではない
     3463  # active ではないに加え、全ての内部セルのセルタイプが inactive の場合に inactive
     3464  # (内部のセルが active または factory を持っている)
    36723465  def is_inactive?
    36733466    if @b_active == false then
    36743467      @cell_list.get_items.each{ |c|
    36753468        if c.get_celltype && c.get_celltype.is_inactive? == false then
    3676           # c.get_celltype == nil の場合はセルタイプ未定義ですでにエラー
     3469          # c.get_celltype == nil の場合はセルタイプ未定義ですでにエラー
    36773470          return false
    36783471        end
     
    37143507
    37153508
    3716 #== 構文要素:口を表すクラス(セルタイプの呼び口、受け口)
     3509#== 構文要素:口を表すクラス(セルタイプの呼び口、受け口)
    37173510class Port < BDNode
    37183511# @name::  str
     
    37203513# @port_type::  :CALL, :ENTRY
    37213514# @array_size:: nil: not array, "[]": sizeless, Integer: sized array
    3722 # @reverse_require_cell_path:: NamespacePath :     é€†require呼びå
    3723 ƒã‚»ãƒ«  mikan namespace (呼び口のみ指定可能)
    3724 # @reverse_require_callport_name:: Symbol:  逆require呼びå
    3725 ƒã‚»ãƒ«ã®å‘¼ã³å£å
     3515# @reverse_require_cell_path:: NamespacePath :     逆require呼び元セル  mikan namespace (呼び口のみ指定可能)
     3516# @reverse_require_callport_name:: Symbol:  逆require呼び元セルの呼び口名
    37263517#
    3727 # set_allocator_port によって設定される.設定された場合、このポートはアロケータポートである。
    3728 # @allocator_port:: Port : この呼び口ができるå
    3729 ƒã¨ãªã£ãŸå‘¼ã³å£ã¾ãŸã¯å—け口
    3730 # @allocator_func_decl:: Decl : この呼び口ができるå
    3731 ƒã¨ãªã£ãŸå‘¼ã³å£ã¾ãŸã¯å—け口の関数
    3732 # @allocator_param_decl:: ParamDecl : この呼び口ができるå
    3733 ƒã¨ãªã£ãŸå‘¼ã³å£ã¾ãŸã¯å—け口のパラメータ
     3518# set_allocator_port によって設定される.設定された場合、このポートはアロケータポートである。
     3519# @allocator_port:: Port : この呼び口ができる元となった呼び口または受け口
     3520# @allocator_func_decl:: Decl : この呼び口ができる元となった呼び口または受け口の関数
     3521# @allocator_param_decl:: ParamDecl : この呼び口ができる元となった呼び口または受け口のパラメータ
    37343522#
    3735 # set_specifier によって設定される(
     3523# set_specifier によって設定される(
    37363524# @allocator_instance:: Hash : {"func_param" => [ :RELAY_ALLOC, func_name, param_name, rhs_cp_name, rhs_func_name, rhs_param_name ]}
    37373525#                                               [:INTERNAL_ALLOC, func_name, param_name, rhs_ep_name ]
     
    37393527#                                                                                    function    parameter   rhs
    37403528#
    3741 # @b_require:: bool : require により生成された call port の場合 true
    3742 # @b_has_name:: bool : require : 名前ありのリクワイア呼び口
    3743 # @b_inline:: bool : entry port のみ
    3744 # @b_omit:: bool : omit 指定子が指定された (call port のみ)
    3745 # @b_optional:: bool : call port のみ
    3746 # @b_ref_des:: bool :  ref_desc キーワードが指定された
    3747 # @b_dynamic:: bool :  dynamic キーワードが指定された (呼び口のみ)
     3529# @b_require:: bool : require により生成された call port の場合 true
     3530# @b_has_name:: bool : require : 名前ありのリクワイア呼び口
     3531# @b_inline:: bool : entry port のみ
     3532# @b_omit:: bool : omit 指定子が指定された (call port のみ)
     3533# @b_optional:: bool : call port のみ
     3534# @b_ref_des:: bool :  ref_desc キーワードが指定された
     3535# @b_dynamic:: bool :  dynamic キーワードが指定された (呼び口のみ)
    37483536#
    37493537# optimize::
    3750 # @celltype:: 属するセルタイプ
     3538# @celltype:: 属するセルタイプ
    37513539#
    3752 # :CALL の場合の最適化
    3753 # @b_VMT_useless:: bool                     # VMT 関数テーブルを使用しない
    3754 # @b_skelton_useless:: bool                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    3755 # @b_cell_unique:: bool                     # 呼びå
    3756 ˆã¯å”¯ä¸€ã®ã‚»ãƒ«
    3757 # @only_callee_port:: Port                  # 唯一の呼びå
    3758 ˆãƒãƒ¼ãƒˆ
    3759 # @only_callee_cell:: Cell                  # 唯一の呼びå
    3760 ˆã‚»ãƒ« (@b_PEPDES_in_CB_useless = true の時有効)
     3540# :CALL の場合の最適化
     3541# @b_VMT_useless:: bool                     # VMT 関数テーブルを使用しない
     3542# @b_skelton_useless:: bool                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     3543# @b_cell_unique:: bool                     # 呼び先は唯一のセル
     3544# @only_callee_port:: Port                  # 唯一の呼び先ポート
     3545# @only_callee_cell:: Cell                  # 唯一の呼び先セル (@b_PEPDES_in_CB_useless = true の時有効)
    37613546#
    3762 # :ENTRY の場合の最適化(呼び口最適化と同じ変数名を使用)
    3763 # @b_VMT_useless:: bool                     # VMT 関数テーブルが不要
    3764 # @b_skelton_useless:: bool                 # スケルトン関数不要
     3547# :ENTRY の場合の最適化(呼び口最適化と同じ変数名を使用)
     3548# @b_VMT_useless:: bool                     # VMT 関数テーブルが不要
     3549# @b_skelton_useless:: bool                 # スケルトン関数不要
    37653550
    37663551  def initialize( name, sig_path, port_type, array_size = nil, reverse_require_cell_path = nil, reverse_require_entry_port_name = nil )
     
    37783563        @array_size = array_size.eval_const(nil)
    37793564      else
    3780         @array_size = array_size   # これはアロケータ呼び口の場合(å
    3781 ƒã®å‘¼ã³å£ã§æ—¢ã«è©•ä¾¡æ¸ˆã¿ï¼‰
     3565        @array_size = array_size   # これはアロケータ呼び口の場合(元の呼び口で既に評価済み)
    37823566      end
    37833567      if @array_size == nil then
     
    37943578    object = Namespace.find( sig_path )    #1
    37953579    if object == nil then
    3796       # mikan signature の名前が不完å
    3797 ¨
     3580      # mikan signature の名前が不完全
    37983581      cdl_error( "S1075 \'$1\' signature not found" , sig_path )
    37993582    elsif ! object.instance_of?( Signature ) then
    3800       # mikan signature の名前が不完å
    3801 ¨
     3583      # mikan signature の名前が不完全
    38023584      cdl_error( "S1076 \'$1\' not signature" , sig_path )
    38033585    else
     
    38063588    end
    38073589
    3808     # 逆require
     3590    # require
    38093591    @reverse_require_cell_path       = nil
    38103592    @reverse_require_entry_port_name = nil
     
    38163598        @reverse_require_entry_port_name = reverse_require_entry_port_name
    38173599
    3818         # 受け口é
    3819 åˆ—か?
     3600        # 受け口配列か?
    38203601        if array_size then
    38213602          cdl_error( "S1153 $1: cannot be entry port array for fixed join port", @name )
    38223603        end
    38233604
    3824         # 呼び口のセルタイプを探す
     3605        # 呼び口のセルタイプを探す
    38253606        ct_or_cell = Namespace.find( @reverse_require_cell_path )  #1
    38263607        if ct_or_cell.instance_of? Cell then
     
    38373618
    38383619        if ct == nil then
    3839           return    # 既にエラー
    3840         end
    3841 
    3842         # 添え字なしの呼び口é
    3843 åˆ—か?
     3620          return    # 既にエラー
     3621        end
     3622
     3623        # 添え字なしの呼び口配列か?
    38443624        port = ct.find( @reverse_require_entry_port_name )
    38453625        if port == nil || port.get_port_type != :CALL
     
    38633643  end
    38643644
    3865   #=== Port#最適化に関する変数をリセットする
    3866   # Region ごとに最適化のやりなおしをするため、リセットする
     3645  #=== Port#最適化に関する変数をリセットする
     3646  # Region ごとに最適化のやりなおしをするため、リセットする
    38673647  def reset_optimize
    38683648    if @port_type == :CALL then
    38693649      # call port optimize
    3870       @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
    3871       @b_skelton_useless = false                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    3872       @b_cell_unique = false                     # 唯一の呼びå
    3873 ˆã‚»ãƒ«
    3874       @only_callee_port = nil                    # 唯一の呼びå
    3875 ˆãƒãƒ¼ãƒˆ
    3876       @only_callee_cell = nil                    # 唯一の呼びå
    3877 ˆã‚»ãƒ«
     3650      @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
     3651      @b_skelton_useless = false                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     3652      @b_cell_unique = false                     # 唯一の呼び先セル
     3653      @only_callee_port = nil                    # 唯一の呼び先ポート
     3654      @only_callee_cell = nil                    # 唯一の呼び先セル
    38783655    else
    38793656      # entry port optimize
    38803657      if $unopt then
    3881         # 最適化なし
    3882         @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
    3883         @b_skelton_useless = false                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     3658        # 最適化なし
     3659        @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
     3660        @b_skelton_useless = false                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    38843661      else
    3885         # 最適化あり
    3886         @b_VMT_useless = true                      # VMT 不要 (true の時 VMT を介することなく呼出す)
    3887         @b_skelton_useless = true                  # スケルトン関数不要   (true の時、受け口関数を呼出す)
     3662        # 最適化あり
     3663        @b_VMT_useless = true                      # VMT 不要 (true の時 VMT を介することなく呼出す)
     3664        @b_skelton_useless = true                  # スケルトン関数不要   (true の時、受け口関数を呼出す)
    38883665      end
    38893666    end
     
    39143691  end
    39153692
    3916   #=== Port# アロケータポートの設定
    3917   #port:: Port : send/receive のあった呼び口または受け口
    3918   #fd:: Decl : 関数の declarator
    3919   #par:: ParamDecl : send/receive のあった引数
    3920   # この呼び口が生成されるもとになった呼び口または受け口のæƒ
    3921 å ±ã‚’設定
     3693  #=== Port# アロケータポートの設定
     3694  #port:: Port : send/receive のあった呼び口または受け口
     3695  #fd:: Decl : 関数の declarator
     3696  #par:: ParamDecl : send/receive のあった引数
     3697  # この呼び口が生成されるもとになった呼び口または受け口の情報を設定
    39223698  def set_allocator_port( port, fd, par )
    39233699    @allocator_port = port
     
    39513727  end
    39523728
    3953   #=== Port# require 呼び口が名前を持つ?
    3954   # require 限定
     3729  #=== Port# require 呼び口が名前を持つ?
     3730  # require 限定
    39553731  def has_name?
    39563732    @b_has_name
     
    39653741  end
    39663742
    3967   #=== Port# omit 指定されている?
     3743  #=== Port# omit 指定されている?
    39683744  def is_omit?
    39693745    @b_omit || ( @signature && @signature.is_empty? )
     
    39743750  end
    39753751
    3976   def set_VMT_useless                     # VMT 関数テーブルを使用しない
     3752  def set_VMT_useless                     # VMT 関数テーブルを使用しない
    39773753   @b_VMT_useless = true
    39783754  end
    39793755
    3980   def set_skelton_useless                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     3756  def set_skelton_useless                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    39813757    @b_skelton_useless = true
    39823758  end
    39833759
    3984   def set_cell_unique                     # 呼びå
    3985 ˆã‚»ãƒ«ã¯ä¸€ã¤ã ã‘
     3760  def set_cell_unique                     # 呼び先セルは一つだけ
    39863761    @b_cell_unique = true
    39873762  end
    39883763
    3989   #=== Port# 呼び口/受け口の指定子の設定
    3990   # inline, allocator の指定
     3764  #=== Port# 呼び口/受け口の指定子の設定
     3765  # inline, allocator の指定
    39913766  def set_specifier spec_list
    39923767    spec_list.each { |s|
     
    40333808  end
    40343809
    4035   #=== Port# リレーアロケータ、å†
    4036 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’設定
    4037   # 呼び口の前方参ç
    4038 §å¯èƒ½ãªã‚ˆã†ã«ã€ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の解釈の最後で行う
     3810  #=== Port# リレーアロケータ、内部アロケータのインスタンスを設定
     3811  # 呼び口の前方参照可能なように、セルタイプの解釈の最後で行う
    40393812  def set_allocator_instance
    40403813    if @allocator_instance_tmp == nil then
     
    40493822      case alloc_type
    40503823      when :INTERNAL_ALLOC
    4051         if ! @owner.instance_of? CompositeCelltype then # ミスを防ぐために composite でなければとした
    4052           cdl_error( "S1081 self allocator not supported yet"  )   # mikan これはサポートされているはず。要調査 12/1/15
     3824        if ! @owner.instance_of? CompositeCelltype then # ミスを防ぐために composite でなければとした
     3825          cdl_error( "S1081 self allocator not supported yet"  )   # mikan これはサポートされているはず。要調査 12/1/15
    40533826          next
    40543827        end
     
    40573830        # OK
    40583831      when :NORMAL_ALLOC
    4059         # ここへ来るのは composite の受け口で右辺が "eEnt.func.param" 形式で指定されていた場合
     3832        # ここへ来るのは composite の受け口で右辺が "eEnt.func.param" 形式で指定されていた場合
    40603833        cdl_error( "S1174 $1 not suitable for lhs, suitable lhs: 'func.param'", "#{ai[1]}.#{ai[3]}.#{ai[4]}" )
    40613834        next
     
    40643837      end
    40653838
    4066       # '=' 左辺(func_name,param_name)は実在するか?
    4067       if @signature then       # signature = nil なら既にエラー
     3839      # '=' 左辺(func_name,param_name)は実在するか?
     3840      if @signature then       # signature = nil なら既にエラー
    40683841        fh = @signature.get_function_head( ai[1] )
    40693842        if fh == nil then
     
    40733846        decl = fh.get_declarator
    40743847        if ! decl.is_function? then
    4075           next   # 既にエラー
     3848          next   # 既にエラー
    40763849        end
    40773850        paramdecl = decl.get_type.get_paramlist.find( ai[2] )
     
    40903863      end
    40913864
    4092       # 重複指定がないか?
     3865      # 重複指定がないか?
    40933866      if @allocator_instance[ "#{@name}_#{ai[1]}_#{ai[2]}" ] then
    40943867        cdl_error( "S1085 duplicate allocator specifier for \'$1_$2\'" , ai[1], ai[2] )
    40953868      end
    40963869
    4097       # 右辺のチェック
     3870      # 右辺のチェック
    40983871      case alloc_type
    40993872      when :INTERNAL_ALLOC
     
    41053878        end
    41063879
    4107         ep_name = ele[1]   # アロケータ受け口名
     3880        ep_name = ele[1]   # アロケータ受け口名
    41083881        ep = @owner.find ep_name.get_path[0]  # mikan "a::b"
    41093882        if ep == nil || ! ep.instance_of?( Port ) || ep.get_port_type != :ENTRY || ! ep.get_signature.is_allocator? then
    41103883          cdl_error( "S1175 $1 not found or not allocator entry port for $2" , ep_name, ai[1] )
    41113884        end
    4112         # 右辺チェック終わり
     3885        # 右辺チェック終わり
    41133886        # ai2 = [ :INTERNAL_ALLOC, func_name, param_name, rhs_ep_name ]
    41143887        ai2 = [ ai[0], ai[1], ai[2], ep_name ]
     
    41223895          #    ele[0]    ele[1][0]  ele[1][1][0]  ele[1][1][1]        ele[1][2]    ele[2]
    41233896          #      name_space_path.Token(1).Token(2) === call_port.func.param
    4124           #  mikan Expression#analyze_cell_join_expression の変種を作成して置き換えるべき
     3897          #  mikan Expression#analyze_cell_join_expression の変種を作成して置き換えるべき
    41253898
    41263899          cdl_error( "S1176 rhs not in 'call_port.func.param' form for for $1_$2" , ai[1], ai[2] )   # S1086
     
    41283901        end
    41293902        func_name = ele[1][2]; cp_name = ele[1][1][1].get_name; param_name = ele[2].to_sym
    4130         cp = @owner.find cp_name    # リレーするå
    4131 ˆã®å‘¼ã³å£
     3903        cp = @owner.find cp_name    # リレーする先の呼び口
    41323904        if cp then
    4133 # mikan cp が呼び口であることのチェック(属性の場合もある)
    4134 # mikan 受け口から受け口へのリレーへの対応 (呼び口から呼び口へのリレーはありえない)  <=== 文法にかかわる事é 
    4135 ï¼ˆå‘¼ã³å£å´ã§ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ãŒæ±ºå®šã•ã‚Œã‚‹ï¼‰
     3905# mikan cp が呼び口であることのチェック(属性の場合もある)
     3906# mikan 受け口から受け口へのリレーへの対応 (呼び口から呼び口へのリレーはありえない)  <=== 文法にかかわる事項(呼び口側でアロケータが決定される)
    41363907          sig = cp.get_signature
    41373908          if sig && @signature then
     
    41433914            decl = fh.get_declarator
    41443915            if ! decl.is_function? then
    4145               next   # 既にエラー
     3916              next   # 既にエラー
    41463917            end
    41473918            paramdecl = decl.get_type.get_paramlist.find( param_name )
     
    41623933
    41633934            # else
    4164             # sig == nil ならば既にエラー
     3935            # sig == nil ならば既にエラー
    41653936          end
    41663937        else
     
    41733944          next
    41743945        end
    4175         # 右辺チェック終わり
     3946        # 右辺チェック終わり
    41763947        # ai2 = [ :RELAY_ALLOC, func_name, param_name, rhs_cp_name, rhs_func_name, rhs_param_name ]
    41773948        ai2 = [ ai[0], ai[1], ai[2], cp_name, func_name, param_name ]
     
    41863957  end
    41873958
    4188   def is_VMT_useless?                     # VMT 関数テーブルを使用しない
     3959  def is_VMT_useless?                     # VMT 関数テーブルを使用しない
    41893960   @b_VMT_useless
    41903961  end
    41913962
    4192   def is_skelton_useless?                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     3963  def is_skelton_useless?                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    41933964    @b_skelton_useless
    41943965  end
    41953966
    4196   def is_cell_unique?                     # 呼びå
    4197 ˆã®ã‚»ãƒ«ã¯ä¸€ã¤ï¼Ÿ
     3967  def is_cell_unique?                     # 呼び先のセルは一つ?
    41983968    @b_cell_unique
    41993969  end
    42003970
    4201   #=== Port# 受け口最適化の設定
    4202   # この受け口を参ç
    4203 §ã™ã‚‹å‘¼ã³å£ãŒ VMT, skelton をå¿
    4204 è¦ã¨ã—ているかどうかを設定
    4205   # 一つでも呼び口がå¿
    4206 è¦ã¨ã—ている(すなわち b_*_useless が false)場合は、
    4207   # この受け口の最適化を false とする
     3971  #=== Port# 受け口最適化の設定
     3972  # この受け口を参照する呼び口が VMT, skelton を必要としているかどうかを設定
     3973  # 一つでも呼び口が必要としている(すなわち b_*_useless が false)場合は、
     3974  # この受け口の最適化を false とする
    42083975  def set_entry_VMT_skelton_useless( b_VMT_useless, b_skelton_useless )
    42093976    if ! b_VMT_useless then
     
    42153982  end
    42163983
    4217   #=== Port# 唯一の結合å
    4218 ˆã‚’設定
    4219   # 最適化で使用
    4220   #  b_VMT_useless == true || b_skelton_useless == true の時に設定される
    4221   #  optional の場合 callee_cell, callee_port が nil となる
     3984  #=== Port# 唯一の結合先を設定
     3985  # 最適化で使用
     3986  #  b_VMT_useless == true || b_skelton_useless == true の時に設定される
     3987  #  optional の場合 callee_cell, callee_port が nil となる
    42223988  def set_only_callee( callee_port, callee_cell )
    42233989    @only_callee_port = callee_port
     
    42253991  end
    42263992
    4227   #=== Port# 唯一の結合å
    4228 ˆãƒãƒ¼ãƒˆã‚’返す(compositeの場合実セル)
    4229   # optional 呼び口で未結合の場合 nil を返す
     3993  #=== Port# 唯一の結合先ポートを返す(compositeの場合実セル)
     3994  # optional 呼び口で未結合の場合 nil を返す
    42303995  def get_real_callee_port
    42313996    if @only_callee_cell then
     
    42343999  end
    42354000
    4236   #=== Port# 唯一の結合å
    4237 ˆã‚»ãƒ«ã‚’返す(compositeの場合実セル)
    4238   # optional 呼び口で未結合の場合 nil を返す
     4001  #=== Port# 唯一の結合先セルを返す(compositeの場合実セル)
     4002  # optional 呼び口で未結合の場合 nil を返す
    42394003  def get_real_callee_cell
    42404004    if @only_callee_cell then
     
    42514015  end
    42524016
    4253   #=== Port# 逆require の結合を生成する
     4017  #=== Port# 逆require の結合を生成する
    42544018  # STAGE: S
    42554019  def create_reverse_require_join cell
     
    42584022    end
    42594023
    4260     # 呼びå
    4261 ƒã‚»ãƒ«ã‚’探す
     4024    # 呼び元セルを探す
    42624025    ct_or_cell = Namespace.find( @reverse_require_cell_path )   # mikan namespace    #1
    42634026    if ct_or_cell.instance_of? Cell then
     
    42654028      ct = cell2.get_celltype
    42664029      if ct == nil then
    4267         return    # 既にエラー
     4030        return    # 既にエラー
    42684031      end
    42694032    elsif ct_or_cell.instance_of? Celltype then
     
    42754038      ct = ct_or_cell
    42764039    else
    4277       # 既にエラー:無視
     4040      # 既にエラー:無視
    42784041      return
    42794042    end
    42804043
    4281     # 結合を生成する
     4044    # 結合を生成する
    42824045    dbgPrint "create_reverse_require_join #{cell2.get_name}.#{@reverse_require_entry_port_name}[] = #{cell.get_name}.#{@name}"
    42834046    nsp = NamespacePath.new( cell.get_name, false, cell.get_namespace )
     
    42914054  end
    42924055
    4293   #=== Port# signature のすべての関数のすべてのパラメータをたどる
    4294   #block:: ブロックを引数として取る(ruby の文法で書かない)
    4295   #  ブロックは3つの引数を受け取る(Port, Decl,      ParamDecl)    Decl: 関数ヘッダ
    4296   # Signature クラスにも each_param がある(同じ働き)
    4297   def each_param # ブロック引数{  |port, func_decl, param_decl| }
    4298     return if @signature == nil                         # signature 未定義(既にエラー)
    4299     fha = @signature.get_function_head_array            # 呼び口または受け口のシグニチャの関数é
    4300 åˆ—
    4301     return if fha == nil                                # nil なら文法エラーで有効値が設定されなかった
    4302 
    4303     pr = Proc.new   # このメソッドのブロック引数を pr に代å
    4304 ¥
     4056  #=== Port# signature のすべての関数のすべてのパラメータをたどる
     4057  #block:: ブロックを引数として取る(ruby の文法で書かない)
     4058  #  ブロックは3つの引数を受け取る(Port, Decl,      ParamDecl)    Decl: 関数ヘッダ
     4059  # Signature クラスにも each_param がある(同じ働き)
     4060  def each_param # ブロック引数{  |port, func_decl, param_decl| }
     4061    return if @signature == nil                         # signature 未定義(既にエラー)
     4062    fha = @signature.get_function_head_array            # 呼び口または受け口のシグニチャの関数配列
     4063    return if fha == nil                                # nil なら文法エラーで有効値が設定されなかった
     4064
     4065    pr = Proc.new   # このメソッドのブロック引数を pr に代入
    43054066    port = self
    4306     fha.each{ |fh|  # fh: FuncHead                      # 関数é
    4307 åˆ—中の各関数頭部
    4308       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    4309       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    4310         fd.get_type.get_paramlist.get_items.each{ |par| # すべてのパラメータについて
     4067    fha.each{ |fh|  # fh: FuncHead                      # 関数配列中の各関数頭部
     4068      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     4069      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     4070        fd.get_type.get_paramlist.get_items.each{ |par| # すべてのパラメータについて
    43114071          pr.call( port, fd, par )
    43124072        }
     
    43154075  end
    43164076
    4317   #=== Port# 逆require指定されている?
     4077  #=== Port# 逆require指定されている?
    43184078  def is_reverse_required?
    43194079    @reverse_require_cell_path != nil
     
    43574117#== Namespace
    43584118#
    4359 # root namespace だけ、Region クラスのインスタンスとして生成される
    4360 # root namespace は、root region をå
    4361 ¼ã­ã‚‹ãŸã‚
     4119# root namespace だけ、Region クラスのインスタンスとして生成される
     4120# root namespace は、root region を兼ねるため
    43624121#
    4363 # @cell_list は Region の場合にのみ持つ (mikan @cell_list 関連は Region に移すべき)
     4122# @cell_list は Region の場合にのみ持つ (mikan @cell_list 関連は Region に移すべき)
    43644123#
    43654124class Namespace < NSBDNode
    4366 # @name::  Symbol     # root の場合 "::" (String)
     4125# @name::  Symbol     # root の場合 "::" (String)
    43674126# @global_name:: str
    43684127# @name_list:: NamedList   Signature,Celltype,CompositeCelltype,Cell,Typedef,Namespace
    43694128# @struct_tag_list:: NamedList : StructType
    4370 # @namespace_list:: Namespace[] : Region は Namespace の子クラスであり、含まれる
     4129# @namespace_list:: Namespace[] : Region は Namespace の子クラスであり、含まれる
    43714130# @signature_list:: Sginature[]
    43724131# @celltype_list:: Celltype[]
     
    43744133# @cell_list:: Cell[]
    43754134# @typedef_list:: Typedef[]
    4376 # @decl_list:: ( Typedef | StructType | EnumType )[]   ä¾å­˜é–¢ä¿‚がある場合に備えて、順番どおりにé
    4377 åˆ—に格納 mikan enum
     4135# @decl_list:: ( Typedef | StructType | EnumType )[]   依存関係がある場合に備えて、順番どおりに配列に格納 mikan enum
    43784136# @const_decl_list:: Decl[]
    4379 # @cache_n_cells:: Integer :  get_n_cells の結果をキャッシュする
    4380 # @cache_generating_region:: Region :  get_n_cells の結果をキャッシュするしているリージョン
    4381 
    4382   # mikan namespace の push, pop
    4383 
    4384   # namespace 階層用のスタック
     4137# @cache_n_cells:: Integer :  get_n_cells の結果をキャッシュする
     4138# @cache_generating_region:: Region :  get_n_cells の結果をキャッシュするしているリージョン
     4139
     4140  # mikan namespace push, pop
     4141
     4142  # namespace 階層用のスタック
    43854143  @@namespace_stack = []      # @@namespace_stack[0] = "::" (generator.rb)
    43864144  @@namespace_sp = -1
    43874145
    4388   # Generator ネスト用のスタック (namespace 階層用のスタックを対比する)
     4146  # Generator ネスト用のスタック (namespace 階層用のスタックを対比する)
    43894147  @@nest_stack_index = -1
    43904148  @@nest_stack = []
     
    43924150  @@root_namespace = nil
    43934151
    4394   # Generator ネスト用スタックの push, pop (クラスメソッド)
     4152  # Generator ネスト用スタックの push, pop (クラスメソッド)
    43954153  def self.push
    43964154    dbgPrint "push Namespace\n"
     
    44124170  end
    44134171
    4414   # namespace 階層用スタックの push, pop (インスタンスメソッド)
     4172  # namespace 階層用スタックの push, pop (インスタンスメソッド)
    44154173  def push ns
    44164174    @@namespace_sp += 1
     
    44344192    if( name == "::" )then
    44354193      if( @@root_namespace != nil )then
    4436         # root は一回のみ生成できる
     4194        # root は一回のみ生成できる
    44374195        raise "try to re-create root namespace"
    44384196      end
     
    44434201      if ns.kind_of? Namespace then
    44444202        dbgPrint "namespace: re-appear #{@name}\n"
    4445         # 登録済み namespace の再登録
     4203        # 登録済み namespace の再登録
    44464204        ns.push ns
    44474205        return
     
    44544212    end
    44554213
    4456     if @@namespace_sp >= 0 then   # root は除外
     4214    if @@namespace_sp >= 0 then   # root は除外
    44574215      @@namespace_stack[@@namespace_sp].new_namespace( self )
    44584216    end
    44594217    push self
    44604218
    4461     @global_name = Namespace.get_global_name    # stack 登録後取る
     4219    @global_name = Namespace.get_global_name    # stack 登録後取る
    44624220    @name_list = NamedList.new( nil, "symbol in namespace '#{@name}'" )
    44634221    @struct_tag_list = NamedList.new( nil, "struct tag" )
     
    44744232    @cache_generating_region = nil
    44754233    if @NamespacePath == nil then
    4476       # root namespace の場合は設定済 (親 namespace が見つからず例外になる)
    4477       set_namespace_path # @NamespacePath の設定
     4234      # root namespace の場合は設定済 (親 namespace が見つからず例外になる)
     4235      set_namespace_path # @NamespacePath の設定
    44784236    end
    44794237  end
     
    44874245  end
    44884246
    4489   #=== Namespace:: global_name を得る
    4490   # parse 中のみこのメソッドは使える
     4247  #=== Namespace:: global_name を得る
     4248  # parse 中のみこのメソッドは使える
    44914249  # STAGE: P
    4492   def self.get_global_name    # parse 中有効
     4250  def self.get_global_name    # parse 中有効
    44934251    if @@namespace_sp <= 0 then
    44944252      return ""
     
    45094267  end
    45104268
    4511   #=== Namespace#セルの個数を得る
    4512   # 子 region が linkunit, node 指定されていれば、含めない(別のリンク単位)
    4513   # プロトタイプ宣言のもののみの個数を含めない
    4514   # mikan namespace 下に cell を置けない仕様になると、このメソッドは Region のものでよい
    4515   # mikan 上記の場合 instance_of? Namespace の条件判定は不要となる
     4269  #=== Namespace#セルの個数を得る
     4270  # 子 region が linkunit, node 指定されていれば、含めない(別のリンク単位)
     4271  # プロトタイプ宣言のもののみの個数を含めない
     4272  # mikan namespace 下に cell を置けない仕様になると、このメソッドは Region のものでよい
     4273  # mikan 上記の場合 instance_of? Namespace の条件判定は不要となる
    45164274  def get_n_cells
    45174275    if @cache_generating_region == $generating_region then
    4518       # このメソッドは繰り返し呼び出されるため、結果をキャッシュする
     4276      # このメソッドは繰り返し呼び出されるため、結果をキャッシュする
    45194277      return @cache_n_cells
    45204278    end
     
    45224280    count = 0
    45234281    @cell_list.each{ |c|
    4524       # 定義かプロトタイプ宣言だけかは、new_cell の段階で判断できないため、カウントしなおす
     4282      # 定義かプロトタイプ宣言だけかは、new_cell の段階で判断できないため、カウントしなおす
    45254283      if c.get_f_def == true then
    45264284        # print "get_n_cells: cell: #{c.get_name}\n"
     
    45334291        count += ns.get_n_cells
    45344292      else
    4535         # ns は Region である
     4293        # ns は Region である
    45364294        rt = ns.get_region_type
    45374295        # print "get_n_cells: region: #{ns.get_name}: #{rt}\n"
    45384296        if rt == :NODE || rt == :LINKUNIT then
    4539           # 別の linkunit なので加算しない
     4297          # 別の linkunit なので加算しない
    45404298        else
    45414299          count += ns.get_n_cells
     
    45494307  end
    45504308
    4551   #=== Namespace.find : in_path で示されるオブジェクトを探す
     4309  #=== Namespace.find : in_path で示されるオブジェクトを探す
    45524310  #in_path:: NamespacePath
    4553   #in_path:: Array : 古い形式
     4311  #in_path:: Array : 古い形式
    45544312  #  path [ "::", "ns1", "ns2" ]   absolute
    45554313  #  path [ "ns1", "ns2" ]         relative
     
    45664324      if name == "::" then
    45674325        i = 1
    4568         name = path[i]   # 構文的にå¿
    4569 ãšå­˜åœ¨
     4326        name = path[i]   # 構文的に必ず存在
    45704327        object = @@root_namespace.find( name )  # root
    45714328      else
    4572         # 相対パス
     4329        # 相対パス
    45734330        i = 0
    45744331        object = @@namespace_stack[@@namespace_sp].find_one( name ) # crrent
     
    46034360
    46044361      unless object.kind_of?( Namespace ) then
    4605         # クラスメソッドå†
    4606 ã§ cdl_error を呼び出すことはできない
    4607         # また、前方参ç
    4608 §å¯¾å¿œå¾Œã€æ­£ç¢ºãªè¡Œç•ªå·ãŒå‡ºãªã„問題も生じる
     4362        # クラスメソッド内で cdl_error を呼び出すことはできない
     4363        # また、前方参照対応後、正確な行番号が出ない問題も生じる
    46094364        # cdl_error( "S1092 \'$1\' not namespace" , name )
    4610         # このメソッドから nil が帰った場合 "not found" が出るので、ここでは出さない
     4365        # このメソッドから nil が帰った場合 "not found" が出るので、ここでは出さない
    46114366        return nil
    46124367      end
     
    46244379  end
    46254380
    4626   #=== Namespace# namespace から探す。見つからなければ親 namespace から探す
     4381  #=== Namespace# namespace から探す。見つからなければ親 namespace から探す
    46274382  def self.find_one( name )
    46284383    return @@namespace_stack[@@namespace_sp].find_one( name )
     
    46324387
    46334388    object = find( name )
    4634     # これは出すぎ
     4389    # これは出すぎ
    46354390    # dbgPrint "in '#{@name}' find '#{name}' object #{object ? object.class : "Not found"}\n"
    46364391
     
    46494404
    46504405  def self.find_tag( name )
    4651     # mikan tag : namespace の path に対応しない
    4652     # namespace の中にあっても、root namespace にあるものと見なされる
    4653     # よって カレント namespace から根に向かって探す
     4406    # mikan tag : namespace の path に対応しない
     4407    # namespace の中にあっても、root namespace にあるものと見なされる
     4408    # よって カレント namespace から根に向かって探す
    46544409    i = @@namespace_sp
    46554410    while i >= 0
     
    47274482  end
    47284483
    4729   #=== Namespace# 参ç
    4730 §ã•ã‚Œã¦ã„るが、未定義のセルを探す
    4731   # プロトタイプ宣言だけで定義されていないケースをエラーとする
    4732   # 受動の未結合セルについて警告する
     4484  #=== Namespace# 参照されているが、未定義のセルを探す
     4485  # プロトタイプ宣言だけで定義されていないケースをエラーとする
     4486  # 受動の未結合セルについて警告する
    47334487  def check_ref_but_undef
    47344488    @cell_list.each { |c|
    4735       if ! c.get_f_def then   # Namespace の @cell_list にはプロトタイプが含まれるケースあり
     4489      if ! c.get_f_def then   # Namespace の @cell_list にはプロトタイプが含まれるケースあり
    47364490        if c.get_f_ref then
    47374491          cdl_error( "S1093 $1 : undefined cell" , c.get_namespace_path.get_path_str )
     
    47534507  end
    47544508
    4755   #=== Namespace# セルの受け口の参ç
    4756 §ã‚«ã‚¦ãƒ³ãƒˆã‚’設定する
     4509  #=== Namespace# セルの受け口の参照カウントを設定する
    47574510  def set_port_reference_count
    47584511    @cell_list.each { |c|
     
    47704523
    47714524  def new_structtype( struct )
    4772     # struct.set_owner self   # StructType (Namespace) # StructType は BDNode ではない
     4525    # struct.set_owner self   # StructType (Namespace) # StructType は BDNode ではない
    47734526    dup = @struct_tag_list.get_item(struct.get_name)
    47744527    if dup != nil then
    47754528      if struct.same? dup then
    4776         # 同じものが typedef された
     4529        # 同じものが typedef された
    47774530        # p "#{struct.get_name}"
    47784531        return
     
    47984551      if typedef_type.get_type_str == dup_type.get_type_str &&
    47994552          typedef_type.get_type_str_post == dup_type.get_type_str_post then
    4800         # 同じものが typedef された
    4801         # ここへ来るのは C で関数ポインタを typedef しているケース
    4802         # 以下のように二重に定義されている場合は type_specifier_qualifier_list として扱われる
     4553        # 同じものが typedef された
     4554        # ここへ来るのは C で関数ポインタを typedef しているケース
     4555        # 以下のように二重に定義されている場合は type_specifier_qualifier_list として扱われる
    48034556        #    typedef long LONG;
    48044557        #    typedef long LONG;
    4805         # bnf.y.rb では declarator に TYPE_NAME を許さないので、ここへ来ることはない
     4558        # bnf.y.rb では declarator に TYPE_NAME を許さないので、ここへ来ることはない
    48064559        # p "#{typedef.get_declarator.get_type.get_type_str} #{typedef.get_name} #{typedef.get_declarator.get_type.get_type_str_post}"
    48074560        return
     
    48444597  def new_const_decl( decl )
    48454598    decl.set_owner self   # Decl (Namespace:const)
    4846     if ! decl.is_const? then                    # const 修飾さていること
     4599    if ! decl.is_const? then                    # const 修飾さていること
    48474600      if decl.is_type?( PtrType ) then
    48484601        cdl_error( "S1094 $1: pointer is not constant. check \'const\'" , decl.get_name )
     
    48524605    elsif ! decl.is_type?( IntType ) && ! decl.is_type?( FloatType ) &&
    48534606        ! decl.is_type?( BoolType ) && ! decl.is_type?( PtrType ) then
    4854                                             # IntType, FloatType であること
     4607                                            # IntType, FloatType であること
    48554608      cdl_error( "S1096 $1: should be int, float, bool or pointer type" , decl.get_name )
    4856     elsif decl.get_initializer == nil then   # 初期値を持つこと
     4609    elsif decl.get_initializer == nil then   # 初期値を持つこと
    48574610      cdl_error( "S1097 $1: has no initializer" , decl.get_name )
    4858 #    elsif decl.get_initializer.eval_const(nil) == nil then  #eval_const は check_init で呼出されるので二重チェック
    4859 #                                            # mikan 初期値が型に対し適切であること
     4611#    elsif decl.get_initializer.eval_const(nil) == nil then  #eval_const は check_init で呼出されるので二重チェック
     4612#                                            # mikan 初期値が型に対し適切であること
    48604613#      cdl_error( "S1098 $1: has unsuitable initializer" , decl.get_name )
    48614614    else
     
    48794632 ###
    48804633
    4881   #=== Namespace# すべてのセルの require ポートを設定
     4634  #=== Namespace# すべてのセルの require ポートを設定
    48824635  # STAGE: S
    48834636  def set_require_join
     
    48854638      ct.set_require_join
    48864639    }
    4887     # すべての namespace について require ポートをセット
     4640    # すべての namespace について require ポートをセット
    48884641    @namespace_list.each{ |ns|
    48894642      ns.set_require_join
     
    48914644  end
    48924645
    4893   #=== Namespace# Join への definition の設定とチェック
    4894   # セルタイプに属するすべてのセルに対して実施
     4646  #=== Namespace# Join への definition の設定とチェック
     4647  # セルタイプに属するすべてのセルに対して実施
    48954648  def set_definition_join
    4896     # celltype のコードを生成
     4649    # celltype のコードを生成
    48974650    @cell_list.each { |c|
    48984651      dbgPrint "set_definition_join #{c.get_name}\n"
     
    49044657  end
    49054658
    4906   #=== Namespace# セルの結合をチェックする
     4659  #=== Namespace# セルの結合をチェックする
    49074660  def check_join
    49084661    @cell_list.each { |c|
     
    49164669  end
    49174670
    4918   #== Namespace# ルートか?
    4919   # ルートネームスペース と ルートリージョンは同じ
     4671  #== Namespace# ルートか?
     4672  # ルートネームスペース と ルートリージョンは同じ
    49204673  def is_root?
    49214674    @name == "::"
    49224675  end
    49234676
    4924   #== Namespace# ルートを得る
    4925   # ルートリージョンとルートネームスペースは同じオブジェクト
     4677  #== Namespace# ルートを得る
     4678  # ルートリージョンとルートネームスペースは同じオブジェクト
    49264679  def self.get_root
    49274680    @@root_namespace
     
    49454698#
    49464699# available if definition is Port
    4947 # @cell_name:: string : 右辺のセルの名前
    4948 # @cell:: Cell  : 右辺のセル
    4949 # @celltype:: Celltype : 右辺のセルタイプ
    4950 # @port_name:: string : 右辺の受け口名
    4951 # @port:: Port : 右辺の受け口
     4700# @cell_name:: string : 右辺のセルの名前
     4701# @cell:: Cell  : 右辺のセル
     4702# @celltype:: Celltype : 右辺のセルタイプ
     4703# @port_name:: string : 右辺の受け口名
     4704# @port:: Port : 右辺の受け口
    49524705# @array_member:: rhs array : available only for first appear in the same name
    49534706# @array_member2:: Join array : available only for first appear in the same name
    4954 # @rhs_subscript:: nil : not array, >=0: 右辺の添数
     4707# @rhs_subscript:: nil : not array, >=0: 右辺の添数
    49554708#
    49564709
    49574710# @through_list::  @cp_through_list + @region_through_list
    4958 #  以下の構造を持つ(@cp_through_list の構造はå
    4959 ±é€šï¼‰
    4960 # @cp_through_list::  呼び口に指定された through
     4711#  以下の構造を持つ(@cp_through_list の構造は共通)
     4712# @cp_through_list::  呼び口に指定された through
    49614713#   [ [plugin_name, cell_name, plugin_arg], [plugin_name2, cell_name2, plugin_arg], ... ]
    4962 # @region_through_list::  region に指定された through
     4714# @region_through_list::  region に指定された through
    49634715#   [ [plugin_name, cell_name, plugin_arg, region], [plugin_name2, cell_name2, plugin_arg, region2], ... ]
    49644716#
    4965 # @through_generated_list:: [Plugin_class object, ...]: @through_list に対応
    4966 # @region_through_generated_list:: [Plugin_class object, ...]: @region_through_list に対応
     4717# @through_generated_list:: [Plugin_class object, ...]: @through_list に対応
     4718# @region_through_generated_list:: [Plugin_class object, ...]: @region_through_list に対応
    49674719#
    49684720
    49694721  include PluginModule
    49704722
    4971   #=== Join# 初期化
    4972   #name:: string: 名前(属性名、呼び口名)
    4973   #subscript:: Nil=非é
    4974 åˆ—, -1="[]", N="[N]"
    4975   #rhs:: Expression: 右辺の式
     4723  #=== Join# 初期化
     4724  #name:: string: 名前(属性名、呼び口名)
     4725  #subscript:: Nil=非配列, -1="[]", N="[N]"
     4726  #rhs:: Expression: 右辺の式
    49764727  def initialize( name, subscript, rhs, locale = nil )
    49774728    # dbgPrint "Join#new: #{name}, #{subscript} #{rhs.eval_const(nil)}\n"
     
    49854736    @name = name
    49864737    if subscript.instance_of?( Expression ) then
    4987        #mikan é
    4988 åˆ—添数が整数であることを未チェック
     4738       #mikan 配列添数が整数であることを未チェック
    49894739       @subscript = subscript.eval_const(nil)
    49904740       if @subscript == nil then
     
    49984748    @definition = nil
    49994749
    5000     # é
    5001 åˆ—要素を設定
    5002     # 本当は、初出の要素のみ設定するのが適当
    5003     # new_join で add_array_member の中で初出要素の array_member に対し設定する
     4750    # 配列要素を設定
     4751    # 本当は、初出の要素のみ設定するのが適当
     4752    # new_join で add_array_member の中で初出要素の array_member に対し設定する
    50044753    if @subscript == -1 then
    50054754      @array_member  = [self]
     
    50194768  end
    50204769
    5021   #===  Join# 左辺に対応する celltype の定義を設定するとともにチェックする
     4770  #===  Join# 左辺に対応する celltype の定義を設定するとともにチェックする
    50224771  # STAGE:   S
    50234772  #
    5024   #     ä»£å
    5025 ¥å¯èƒ½ã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹
    5026   #definition:: Decl (attribute,varの時) または Port (callの時) または nil (definition が見つからなかった時)
     4773  #     代入可能かチェックする
     4774  #definition:: Decl (attribute,varの時) または Port (callの時) または nil (definition が見つからなかった時)
    50274775
    50284776  def set_definition( definition )
     
    50304778    dbgPrint "set_definition: #{@owner.get_name}.#{@name} = #{definition.class}\n"
    50314779
    5032     # 二重チェックの防止
     4780    # 二重チェックの防止
    50334781    if @definition then
    5034       # set_definition を個別に行うケースで、二重に行われる可能性がある(異常ではない)
    5035       # 二重に set_definition が実行されると through が二重に適用されてしまう
     4782      # set_definition を個別に行うケースで、二重に行われる可能性がある(異常ではない)
     4783      # 二重に set_definition が実行されると through が二重に適用されてしまう
    50364784      # cdl_warning( "W9999 $1, internal error: set_definition duplicate", @name )
    50374785      return
     
    50404788    @definition = definition
    50414789
    5042     # mikan 左辺値、右辺値の型チェックなど
     4790    # mikan 左辺値、右辺値の型チェックなど
    50434791    if @definition.instance_of?( Decl ) then
    50444792      check_var_init
    50454793    elsif @definition.instance_of?( Port ) then
    50464794      check_call_port_init
    5047       if @definition.get_port_type == :CALL then   # :ENTRY ならエラー。無視しない
     4795      if @definition.get_port_type == :CALL then   # :ENTRY ならエラー。無視しない
    50484796        check_and_gen_through
    5049         create_allocator_join  # through プラグイン生成した後でないと、挿å
    5050 ¥å‰ã®ã‚»ãƒ«ã®ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã‚’結合してしまう
     4797        create_allocator_join  # through プラグイン生成した後でないと、挿入前のセルのアロケータを結合してしまう
    50514798      end
    50524799    elsif @definition == nil then
     
    50574804  end
    50584805
    5059   #=== Join# 変数の初期化チェック
     4806  #=== Join# 変数の初期化チェック
    50604807  def check_var_init
    5061     # attribute, var の場合
     4808    # attribute, var の場合
    50624809    if @definition.get_kind == :ATTRIBUTE then
    50634810#        check_cell_cb_init( definition.get_type, @rhs )
    5064       # 右辺で初期化可能かチェック
     4811      # 右辺で初期化可能かチェック
    50654812      @definition.get_type.check_init( @locale, @definition.get_identifier, @rhs, :ATTRIBUTE )
    50664813    elsif @definition.get_kind == :VAR then
    5067       # var は初期化できない
     4814      # var は初期化できない
    50684815      cdl_error( "S1100 $1: cannot initialize var" , @name )
    50694816    else
     
    50734820  end
    50744821
    5075   #=== Join# 呼び口の初期化チェック
     4822  #=== Join# 呼び口の初期化チェック
    50764823  def check_call_port_init
    50774824    ### Port
    50784825
    5079     # 左辺は受け口か(受け口を初期化しようとしている)?
     4826    # 左辺は受け口か(受け口を初期化しようとしている)?
    50804827    if @definition.get_port_type == :ENTRY then
    50814828      cdl_error( "S1101 \'$1\' cannot initialize entry port" , @name )
     
    50834830    end
    50844831
    5085 #      # é
    5086 åˆ—添数の整合性チェック
    5087 #      # 呼び口の定義で、非é
    5088 åˆ—なら添数なし、添数なしé
    5089 åˆ—なら添数なし、添数ありé
    5090 åˆ—なら添数あり
     4832#      # 配列添数の整合性チェック
     4833#      # 呼び口の定義で、非配列なら添数なし、添数なし配列なら添数なし、添数あり配列なら添数あり
    50914834    as = @definition.get_array_size
    50924835    if ( @subscript == nil && as != nil ) then
     
    51114854#    end
    51124855
    5113     # mikan Expression の get_type で型導出させる方がスマート
    5114     # mikan '=' の左辺がé
    5115 åˆ—かどうか未チェック
    5116     #(1) '=' の右辺は "Cell.ePort" の形式か?
    5117     #     æ¼”算子は "."  かつ "." の左辺が :IDENTIFIER
    5118     #     "." の右辺はチェック不要 (synatax 的に :IDENTIFIER)
    5119     #(2) "Cell" は存在するか?(名前が一致するものはあるか)
    5120     #(3) "Cell" は cell か?
    5121     #(4) "Cell" の celltype は有効か? (無効なら既にエラー)
    5122     #(5) "ePort" は "Cell" の celltype å†
    5123 ã«å­˜åœ¨ã™ã‚‹ã‹ï¼Ÿ
    5124     #(6) "ePort" は entry port か?
    5125     #(7) signature は一致するか
    5126 
    5127     # 右辺がない(以前の段階でエラー)
     4856    # mikan Expression の get_type で型導出させる方がスマート
     4857    # mikan '=' の左辺が配列かどうか未チェック
     4858    #(1) '=' の右辺は "Cell.ePort" の形式か?
     4859    #     演算子は "."  かつ "." の左辺が :IDENTIFIER
     4860    #     "." の右辺はチェック不要 (synatax 的に :IDENTIFIER)
     4861    #(2) "Cell" は存在するか?(名前が一致するものはあるか)
     4862    #(3) "Cell" は cell か?
     4863    #(4) "Cell" の celltype は有効か? (無効なら既にエラー)
     4864    #(5) "ePort" は "Cell" の celltype 内に存在するか?
     4865    #(6) "ePort" は entry port か?
     4866    #(7) signature は一致するか
     4867
     4868    # 右辺がない(以前の段階でエラー)
    51284869    return unless @rhs
    51294870
    5130     # cCall = composite.cCall; のチェック.この形式は属性用
    5131     # 呼び口を export するには cCall => composite.cCall; の形式を用いる
     4871    # cCall = composite.cCall; のチェック.この形式は属性用
     4872    # 呼び口を export するには cCall => composite.cCall; の形式を用いる
    51324873    if @rhs.instance_of?( Array ) == true && @rhs[0] == :COMPOSITE then
    51334874      cdl_error( "S1107 to export port, use \'cCall => composite.cCall\'"  )
     
    51374878    end
    51384879
    5139     # 右辺の Expression の要素を取り出す
     4880    # 右辺の Expression の要素を取り出す
    51404881    ret = @rhs.analyze_cell_join_expression
    51414882    if ret == nil then   #1
     
    51454886
    51464887    nsp, @rhs_subscript, @port_name = ret[0], ret[1], ret[2]
    5147     @cell_name = nsp.get_name     # mikan ns::cellname の形式の考æ
    5148 ®
    5149 
    5150     # composite の定義の中なら object は結合å
    5151 ˆ cell か、見つからなければ nil が返る
    5152     # composite の定義外なら false が返る
     4888    @cell_name = nsp.get_name     # mikan ns::cellname の形式の考慮
     4889
     4890    # composite の定義の中なら object は結合先 cell か、見つからなければ nil が返る
     4891    # composite の定義外なら false が返る
    51534892    object = CompositeCelltype.find( @cell_name )
    51544893    if object == false then
    5155 #     mikan 左辺が namespace に対応していないため。 path にして find
     4894#     mikan 左辺が namespace に対応していないため。 path にして find
    51564895      # p nsp.get_path_str, nsp.get_path
    51574896      object = Namespace.find( nsp )    #1
     
    51724911      object.set_f_ref
    51734912
    5174       # 右辺のセルのセルタイプ
     4913      # 右辺のセルのセルタイプ
    51754914      celltype = object.get_celltype
    51764915
     
    51854924          cdl_error( "S1113 \'$1\' signature mismatch" , @port_name )
    51864925        elsif object2.get_array_size then
    5187           # 受け口é
    5188 åˆ—
     4926          # 受け口配列
    51894927
    51904928          unless @rhs_subscript then
    5191             # 右辺に添数指定がなかった
     4929            # 右辺に添数指定がなかった
    51924930            cdl_error( "S1114 \'$1\' should be array" , @port_name )
    51934931          else
     
    51954933            as = object2.get_array_size
    51964934            if( as.kind_of?( Integer ) && as <= @rhs_subscript )then
    5197               # 受け口é
    5198 åˆ—の大きさに対し、右辺の添数が同じか大きい
     4935              # 受け口配列の大きさに対し、右辺の添数が同じか大きい
    51994936              cdl_error( "S1115 $1[$2]: subscript out of range (< $3)" , @port_name, @rhs_subscript, as )
    52004937            else
     
    52034940              @celltype = celltype
    52044941              @port = object2
    5205               # 右辺のセルの受け口 object2 を参ç
    5206 §æ¸ˆã¿ã«ã™ã‚‹
     4942              # 右辺のセルの受け口 object2 を参照済みにする
    52074943              # object2: Port, @definition: Port
    52084944              @cell.set_entry_port_max_subscript( @port, @rhs_subscript )
     
    52144950          end
    52154951        elsif @rhs_subscript then
    5216           # 受け口é
    5217 åˆ—でないのに右辺で添数指定されている
     4952          # 受け口配列でないのに右辺で添数指定されている
    52184953          cdl_error( "S1116 \'$1\' entry port is not array" , @port_name )
    52194954        else
     
    52234958          @celltype = celltype
    52244959
    5225           # 右辺のセル object の受け口 object2 を参ç
    5226 §æ¸ˆã¿ã«ã™ã‚‹
     4960          # 右辺のセル object の受け口 object2 を参照済みにする
    52274961          # object2: Port, @definition: Port
    52284962
    52294963          # debug
    52304964          # p "rhs:  #{@cell}  #{@cell.get_name}"
    5231         end  # end of port (object2) チェック
     4965        end  # end of port (object2) チェック
    52324966
    52334967        #else
    5234         #  celltype == nil (すでにエラー)
    5235       end  # end of celltyep チェック
     4968        #  celltype == nil (すでにエラー)
     4969      end  # end of celltyep チェック
    52364970
    52374971
    52384972      check_region( object )
    52394973
    5240     end  # end of cell (object) チェック
    5241 
    5242   end
    5243 
    5244   #=== Join# アロケータの結合を生成
     4974    end  # end of cell (object) チェック
     4975
     4976  end
     4977
     4978  #=== Join# アロケータの結合を生成
    52454979  # STAGE: S
    5246   #cell::  呼び口の結合å
    5247 ˆã®ã‚»ãƒ«
     4980  #cell::  呼び口の結合先のセル
    52484981  #
    5249   # ここでは呼び口側に生成されるアロケータ呼び口の結合を生成
    5250   # 受け口側は Cell の set_specifier_list で生成
    5251   #  a[*] のå†
    5252 å®¹ã¯ Cell の set_specifier_list を参ç
    5253 §
     4982  # ここでは呼び口側に生成されるアロケータ呼び口の結合を生成
     4983  # 受け口側は Cell の set_specifier_list で生成
     4984  #  a[*] の内容は Cell の set_specifier_list を参照
    52544985  def create_allocator_join
    52554986
    5256     cell = get_rhs_cell2   # 右辺のセルを得る
     4987    cell = get_rhs_cell2   # 右辺のセルを得る
    52574988    port = get_rhs_port2
    52584989
    5259     if( cell && cell.get_allocator_list ) then      # cell == nil なら既にエラー
     4990    if( cell && cell.get_allocator_list ) then      # cell == nil なら既にエラー
    52604991
    52614992      dbgPrint "create_allocator_join: #{@owner.get_name}.#{@name}=>#{cell ? cell.get_name : "nil"}\n"
     
    52644995
    52654996        if( a[0+1] == port && a[1+1] == @rhs_subscript )then
    5266           # 名前の一致するものの結合を生成する
    5267           # 過不足は、別途チェックされる
     4997          # 名前の一致するものの結合を生成する
     4998          # 過不足は、別途チェックされる
    52684999          cp_name = :"#{@name}_#{a[2+1]}_#{a[3+1]}"
    52695000          # p "creating allocator join #{cp_name} #{@subscript} #{a[1+1]}"
     
    52805011  end
    52815012
    5282   #=== Join# リージョン間の結合をチェック
    5283   # リージョン間の through による @region_through_list の作成
    5284   # 実際の生成は check_and_gen_through で行う
    5285   # mikan Cell#distance とRegion へたどり着くまでための処理にå
    5286 ±é€šéƒ¨åˆ†ãŒå¤šã„
     5013  #=== Join# リージョン間の結合をチェック
     5014  # リージョン間の through による @region_through_list の作成
     5015  # 実際の生成は check_and_gen_through で行う
     5016  # mikan Cell#distance とRegion へたどり着くまでための処理に共通部分が多い
    52875017  def check_region( object )
    52885018
     
    52915021    # print "DOMAIN: check_region #{@owner.get_name}.#{@name} => #{object.get_name}\n"
    52925022
    5293     # プラグインで生成されたなかでは生成しない
    5294     # さもないとプラグイン生成されたものとの間で、無限に生成される
     5023    # プラグインで生成されたなかでは生成しない
     5024    # さもないとプラグイン生成されたものとの間で、無限に生成される
    52955025##    if Generator.get_nest >= 1 then
    5296 ##    if Generator.get_plugin then     # mikan これはå¿
    5297 è¦ï¼Ÿ (意味解析段階での実行になるので不適切)
     5026##    if Generator.get_plugin then     # mikan これは必要? (意味解析段階での実行になるので不適切)
    52985027    if @owner.get_plugin.kind_of?( ThroughPlugin ) then
    5299       # プラグイン生成されたセルの場合、結合チェックのみ
     5028      # プラグイン生成されたセルの場合、結合チェックのみ
    53005029      return
    53015030    end
    53025031
    5303     # region のチェック
    5304     r1 = @owner.get_region      # 呼び口セルの region
    5305     r2 = object.get_region      # 受け口セルの region
    5306 
    5307     if ! r1.equal? r2 then      # 同一 region なら呼出し可能
     5032    # region のチェック
     5033    r1 = @owner.get_region      # 呼び口セルの region
     5034    r2 = object.get_region      # 受け口セルの region
     5035
     5036    if ! r1.equal? r2 then      # 同一 region なら呼出し可能
    53085037
    53095038      f1 = r1.get_family_line
     
    53125041      len2 = f2.length
    53135042
    5314       # 不一致になるところ(å
    5315 „弟)を探す
    5316       i = 1  # i = 0 は :RootRegion なのでå¿
    5317 ãšä¸€è‡´
     5043      # 不一致になるところ(兄弟)を探す
     5044      i = 1  # i = 0 は :RootRegion なので必ず一致
    53185045      while( i < len1 && i < len2 )
    53195046        if( f1[i] != f2[i] )then
     
    53235050      end
    53245051
    5325       sibling_level = i     # å
    5326 „弟となるレベル、もしくはどちらか一方が終わったレベル
     5052      sibling_level = i     # 兄弟となるレベル、もしくはどちらか一方が終わったレベル
    53275053
    53285054      dbgPrint "sibling_level: #{i}\n"
     
    53375063
    53385064
    5339       # 呼び側について呼びå
    5340 ƒã®ãƒ¬ãƒ™ãƒ«ã‹ã‚‰å
    5341 „弟レベルまで(out_through をチェックおよび挿å
    5342 ¥ï¼‰
     5065      # 呼び側について呼び元のレベルから兄弟レベルまで(out_through をチェックおよび挿入)
    53435066      i = len1 -1
    53445067      if b_to_through then
     
    53645087
    53655088        out_through_list.each { |ol|
    5366           if ol[0] then    # plugin_name が指定されていなければ登録しない
     5089          if ol[0] then    # plugin_name が指定されていなければ登録しない
    53675090            plugin_arg = CDLString.remove_dquote ol[1]
    53685091            through = [ ol[0], :"Join_out_through_", plugin_arg, f1[i], f1[i-1], :OUT_THROUGH, region_count]
     
    53775100      end
    53785101
    5379       # å
    5380 „弟レベルにおいて(to_through をチェックおよび挿å
    5381 ¥ï¼‰
     5102      # 兄弟レベルにおいて(to_through をチェックおよび挿入)
    53825103      if f1[sibling_level] && f2[sibling_level] then
    53835104        dbgPrint "going from #{f1[sibling_level].get_name} to #{f2[sibling_level].get_name}\n"
    53845105        found = 0
    5385         region_count = f1[i].next_to_through_count( f2[sibling_level].get_name )   # to_through の region カウント
     5106        region_count = f1[i].next_to_through_count( f2[sibling_level].get_name )   # to_through の region カウント
    53865107        f1[sibling_level].get_to_through_list.each { |t|
    5387           if t[0][0] == f2[sibling_level].get_name then   # region 名が一致するか ?
    5388             if t[1] then    # plugin_name が指定されていなければ登録しない
     5108          if t[0][0] == f2[sibling_level].get_name then   # region 名が一致するか ?
     5109            if t[1] then    # plugin_name が指定されていなければ登録しない
    53895110              plugin_arg = CDLString.remove_dquote t[2]
    53905111              through = [ t[1], :"Join_to_through__", plugin_arg, f1[sibling_level], f2[sibling_level], :TO_THROUGH, region_count ]
     
    54095130      end
    54105131
    5411       # 受け側についてå
    5412 „弟レベルから受け側のレベルまで(in_through をチェックおよび挿å
    5413 ¥ï¼‰
     5132      # 受け側について兄弟レベルから受け側のレベルまで(in_through をチェックおよび挿入)
    54145133      if b_to_through then
    5415         i = sibling_level + 1      # to_through を経た場合、最初の in_through は適用しない
     5134        i = sibling_level + 1      # to_through を経た場合、最初の in_through は適用しない
    54165135      else
    54175136        i = sibling_level
     
    54365155        end
    54375156        in_through_list.each { |il|
    5438           if il[0] then    # plugin_name が指定されていなければ登録しない
     5157          if il[0] then    # plugin_name が指定されていなければ登録しない
    54395158            plugin_arg = CDLString.remove_dquote il[1]
    54405159            through = [ il[0], :"Join_in_through_", plugin_arg, f2[i-1], f2[i],:IN_THROUGH, region_count ]
     
    54495168
    54505169
    5451   #=== Join# 生成しないリージョンへの結合かチェック
    5452   # 右辺のセルが、生成されないリージョンにあればエラー
    5453   # 右辺は、プラグイン生成されたセルがあれば、それを対象とする
     5170  #=== Join# 生成しないリージョンへの結合かチェック
     5171  # 右辺のセルが、生成されないリージョンにあればエラー
     5172  # 右辺は、プラグイン生成されたセルがあれば、それを対象とする
    54545173  def check_region2
    54555174    lhs_cell = @owner
    54565175
    5457     # 生成しないリージョンのセルへの結合か?
     5176    # 生成しないリージョンのセルへの結合か?
    54585177    # if join.get_cell && ! join.get_cell.is_generate? then
    5459     # if get_rhs_cell && ! get_rhs_cell.is_generate? then # composite セルがプロタイプ宣言の場合例外
     5178    # if get_rhs_cell && ! get_rhs_cell.is_generate? then # composite セルがプロタイプ宣言の場合例外
    54605179    # print "Link root: (caller #{@owner.get_name}) '#{@owner.get_region.get_link_root.get_name}'"
    54615180    # print " #{@owner.get_region.get_link_root == get_rhs_region.get_link_root ? "==" : "!="} "
     
    54705189      end
    54715190    else
    5472       # rhs のセルが存在しなかった (既にエラー)
     5191      # rhs のセルが存在しなかった (既にエラー)
    54735192    end
    54745193  end
     
    54785197  end
    54795198
    5480   #=== Join# specifier を設定
     5199  #=== Join# specifier を設定
    54815200  # STAGE: B
    5482   # set_specifier_list は、join の解析の最後で呼び出される
    5483   # through 指定子を設定
    5484   #  check_and_gen_through を呼出して、through 生成
     5201  # set_specifier_list は、join の解析の最後で呼び出される
     5202  # through 指定子を設定
     5203  #  check_and_gen_through を呼出して、through 生成
    54855204  def set_specifier_list( specifier_list )
    54865205
     
    54905209        # set plugin_name
    54915210        plugin_name = s[1].to_s
    5492         plugin_name[0] = "#{plugin_name[/^./].upcase}"     # å
    5493 ˆé ­æ–‡å­—を大文字に : ruby のクラス名の制約
     5211        plugin_name[0] = "#{plugin_name[/^./].upcase}"     # 先頭文字を大文字に : ruby のクラス名の制約
    54945212
    54955213        # set cell_name
     
    54985216        # set plugin_arg
    54995217        plugin_arg = CDLString.remove_dquote s[2].to_s
    5500         # plugin_arg = s[2].to_s.gsub( /\A"(.*)/, '\1' )   # 前後の "" を取り除く
     5218        # plugin_arg = s[2].to_s.gsub( /\A"(.*)/, '\1' )   # 前後の "" を取り除く
    55015219        # plugin_arg.sub!( /(.*)"\z/, '\1' )
    55025220
     
    55075225  end
    55085226
    5509   #=== Join# through のチェックと生成
    5510   # new_join の中の check_region で region 間の through が @region_through に設定される
    5511   # set_specifier で呼び口の結合で指定された through が @cp_through 設定される
    5512   # その後、このメソッドが呼ばれる
     5227  #=== Join# through のチェックと生成
     5228  # new_join の中の check_region で region 間の through が @region_through に設定される
     5229  # set_specifier で呼び口の結合で指定された through が @cp_through 設定される
     5230  # その後、このメソッドが呼ばれる
    55135231  def check_and_gen_through
    55145232
     
    55315249
    55325250    @through_list = @cp_through_list + @region_through_list
    5533       # 後から @cp_through_list と @region_through_list に分けたため、このような実è£
    5534 ã«ãªã£ãŸ
     5251      # 後から @cp_through_list と @region_through_list に分けたため、このような実装になった
    55355252
    55365253    if @through_list then           # nil when the join is not Port
    5537       len = @through_list.length    # through が連接している数
     5254      len = @through_list.length    # through が連接している数
    55385255    else
    55395256      len = 0
     
    55465263    end
    55475264
    5548     # 連続した through について、受け口側から順にセルを生成し解釈する
     5265    # 連続した through について、受け口側から順にセルを生成し解釈する
    55495266    i = len - 1
    55505267    while i >= 0
     
    55755292
    55765293      else
    5577         # 最後のセルの場合、次のセルの名前、ポート名
     5294        # 最後のセルの場合、次のセルの名前、ポート名
    55785295        next_cell      = @cell
    55795296        next_port_name = @port_name
    55805297
    55815298        if next_cell == nil then
    5582           # 結合å
    5583 ˆãŒãªã„
     5299          # 結合先がない
    55845300          return
    55855301        end
     
    55875303
    55885304      if i >= cp_len then
    5589         # region_through_list 部分
    5590         # region から @cell_name.@port_name への through がないか探す
     5305        # region_through_list 部分
     5306        # region から @cell_name.@port_name への through がないか探す
    55915307        # rp = @through_list[i][3].find_cell_port_through_plugin( @cell_name, @port_name ) #762
    55925308        rp = @through_list[i][3].find_cell_port_through_plugin( @cell.get_global_name, @port_name )
    5593            # @through_list[i] と @region_through_list[i-cp_len] は同じ
    5594         # å
    5595 ±ç”¨ã—ないようにするには、見つからなかったことにすればよい
     5309           # @through_list[i] と @region_through_list[i-cp_len] は同じ
     5310        # 共用しないようにするには、見つからなかったことにすればよい
    55965311        # rp = nil
    55975312      else
    5598         # region 以外のものはå
    5599 ±æœ‰ã—ない
    5600         # 呼び口側に指定されているし、plugin_arg が異なるかもしれない
     5313        # region 以外のものは共有しない
     5314        # 呼び口側に指定されているし、plugin_arg が異なるかもしれない
    56015315        rp = nil
    56025316      end
     
    56075321        end
    56085322      else
    5609         # 見つかったものをå
    5610 ±ç”¨ã™ã‚‹
     5323        # 見つかったものを共用する
    56115324        @through_generated_list[ i ] = rp
    56125325      end
    56135326
    56145327      if i >= cp_len then
    5615         # @through_generated_list のうち @region_through_listに対応する部分
     5328        # @through_generated_list のうち @region_through_listに対応する部分
    56165329        @region_through_generated_list[ i - cp_len ] = @through_generated_list[ i ]
    56175330        if rp == nil then
    5618           # 生成したものを region(@through_list[i][3]) のリストに追加
     5331          # 生成したものを region(@through_list[i][3]) のリストに追加
    56195332          # @through_list[i][3].add_cell_port_through_plugin( @cell_name, @port_name, @through_generated_list[i] ) #762
    56205333          @through_list[i][3].add_cell_port_through_plugin( @cell.get_global_name, @port_name, @through_generated_list[i] )
     
    56235336
    56245337      if i == 0 then
    5625         # 最も呼び口側のセルは、CDL 上の結合がないため、参ç
    5626 §ã•ã‚ŒãŸã“とにならない
    5627         # mikan namespace 対応
     5338        # 最も呼び口側のセルは、CDL 上の結合がないため、参照されたことにならない
     5339        # mikan namespace 対応
    56285340        # cell = Namespace.find( [ @through_generated_list[0].get_cell_name] )    #1
    56295341        if @through_generated_list[0] == nil then
    5630           return  # plugin_object の生成に失敗している
     5342          return  # plugin_object の生成に失敗している
    56315343        end
    56325344        cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
     
    56525364  end
    56535365
    5654   #=== Join# through プラグインを呼び出して CDL 生成させるとともに、import する
     5366  #=== Join# through プラグインを呼び出して CDL 生成させるとともに、import する
    56555367  def gen_through_cell_code_and_parse( plugin_name, i, next_cell, next_port_name )
    56565368
     
    56605372    plugin_arg            = through[ 2 ]
    56615373    if through[ 3 ] then
    5662       # region 間の through の場合
     5374      # region 間の through の場合
    56635375      @@start_region      = through[ 3 ]
    56645376      if next_cell.get_region.equal? @@start_region then
     
    56705382      @@region_count      = through[ 6 ]
    56715383    else
    5672       # 呼び口の through の場合
    5673       @@start_region      = @owner.get_region    # 呼び口側セルの region
    5674       @@end_region        = next_cell.get_region # 次のセルの region
    5675       @@through_type      = :THROUGH             # 呼び口の through 指定
     5384      # 呼び口の through の場合
     5385      @@start_region      = @owner.get_region    # 呼び口側セルの region
     5386      @@end_region        = next_cell.get_region # 次のセルの region
     5387      @@through_type      = :THROUGH             # 呼び口の through 指定
    56765388      @@region_count      = 0
    56775389    end
     
    56875399
    56885400    begin
    5689       eval( eval_str )     # plugin を生成
     5401      eval( eval_str )     # plugin を生成
    56905402      plugin_object.set_locale @locale
    56915403    rescue Exception => evar
     
    57025414    @through_generated_list[ i ] = plugin_object
    57035415
    5704     # Region に関するæƒ
    5705 å ±ã‚’設定
    5706     # 後から追加したので、new の引数外で設定
     5416    # Region に関する情報を設定
     5417    # 後から追加したので、new の引数外で設定
    57075418    # plugin_object.set_through_info( start_region, end_region, through_type )
    57085419
     
    57105421  end
    57115422
    5712   #プラグインへの引数で渡さないものを、一時的に記憶しておく
    5713   # プラグインの initialize の中でコールバックして設定する
     5423  #プラグインへの引数で渡さないものを、一時的に記憶しておく
     5424  # プラグインの initialize の中でコールバックして設定する
    57145425  @@plugin_creating_join = nil
    57155426  @@start_region = nil
     
    57185429  @@region_count = nil
    57195430
    5720   #=== Join# ThroughPlugin の追加æƒ
    5721 å ±ã‚’設定する
    5722   # このメソッドは ThroughPlugin#initialize から呼び出される
    5723   # plugin_object を生成する際の引数では不足するæƒ
    5724 å ±ã‚’追加する
     5431  #=== Join# ThroughPlugin の追加情報を設定する
     5432  # このメソッドは ThroughPlugin#initialize から呼び出される
     5433  # plugin_object を生成する際の引数では不足する情報を追加する
    57255434  def self.set_through_info plugin_object
    57265435    plugin_object.set_through_info( @@start_region, @@end_region, @@through_type,
     
    57345443  end
    57355444
    5736   #=== Join#é
    5737 åˆ—添数を得る
    5738   # @subscript の説明を参ç
    5739 §ã®ã“と
     5445  #=== Join#配列添数を得る
     5446  # @subscript の説明を参照のこと
    57405447  def get_subscript
    57415448    @subscript
    57425449  end
    57435450
    5744   def get_cell_name         # 受け口セル名
     5451  def get_cell_name         # 受け口セル名
    57455452    @cell_name
    57465453  end
     
    57545461  end
    57555462
    5756   #=== Join# 右辺の実セルを得る
    5757   #    実セルとは through で挿å
    5758 ¥ã•ã‚ŒãŸã‚‚の、composite のå†
    5759 éƒ¨ãªã©å®Ÿéš›ã«çµåˆã•ã‚Œã‚‹å
    5760 ˆ
    5761   #    このメソッドは get_rhs_port と対になっている
    5762   #    このメソッドは、意味解析段階では呼び出してはならない (対象セルの意味解析が済む前には正しい結果を返さない)
     5463  #=== Join# 右辺の実セルを得る
     5464  #    実セルとは through で挿入されたもの、composite の内部など実際に結合される先
     5465  #    このメソッドは get_rhs_port と対になっている
     5466  #    このメソッドは、意味解析段階では呼び出してはならない (対象セルの意味解析が済む前には正しい結果を返さない)
    57635467  def get_rhs_cell
    5764     # through 指定あり?
     5468    # through 指定あり?
    57655469    if @through_list[0] then
    5766       # mikan through で生成したものが root namespace 限定
     5470      # mikan through で生成したものが root namespace 限定
    57675471      if @through_generated_list[0] then
    57685472        # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] )    #1
    57695473        cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
    5770         # cell が nil になるのはプラグインの get_cell_namespace_path が正しくないか、
    5771         # プラグイン生成コードがエラーになっている。
    5772         # できの悪いプラグインが多ければ、cell == nil をはじいた方がよい。
     5474        # cell が nil になるのはプラグインの get_cell_namespace_path が正しくないか、
     5475        # プラグイン生成コードがエラーになっている。
     5476        # できの悪いプラグインが多ければ、cell == nil をはじいた方がよい。
    57735477        return cell.get_real_cell( @through_generated_list[0].get_through_entry_port_name )
    57745478      else
    5775         return nil            # generate に失敗している
     5479        return nil            # generate に失敗している
    57765480      end
    57775481    elsif @cell then
    57785482      return @cell.get_real_cell( @port_name )
    57795483    else
    5780       # 右辺が未定義の場合 @cell は nil (既にエラー)
     5484      # 右辺が未定義の場合 @cell は nil (既にエラー)
    57815485      return nil
    57825486    end
    57835487  end
    57845488
    5785   #=== Join# 右辺のセルを得る
    5786   # 右辺のセルを得る。ただし、composite 展開されていない
    5787   # composite 展開されたものを得るには get_rhs_cell を使う
    5788   # プロトタイプ宣言しかされていない場合には、こちらしか使えない
    5789   # このメソッドは get_rhs_port2 と対になっている
     5489  #=== Join# 右辺のセルを得る
     5490  # 右辺のセルを得る。ただし、composite 展開されていない
     5491  # composite 展開されたものを得るには get_rhs_cell を使う
     5492  # プロトタイプ宣言しかされていない場合には、こちらしか使えない
     5493  # このメソッドは get_rhs_port2 と対になっている
    57905494  def get_rhs_cell2
    5791     # through 指定あり?
     5495    # through 指定あり?
    57925496    if @through_list[0] then
    5793       # mikan through で生成したものが root namespace 限定
     5497      # mikan through で生成したものが root namespace 限定
    57945498      # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name ] )
    57955499      if @through_generated_list[0] then
     
    57975501        cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
    57985502      else
    5799         cell = @cell            # generate に失敗している
     5503        cell = @cell            # generate に失敗している
    58005504      end
    58015505    else
     
    58065510  end
    58075511
    5808   #=== Join# 右辺のセルを得る
    5809   # through は適用しないが、composite は展開した後のセル
    5810   # (意味解析が終わっていないと、composite 展開が終わっていない)
    5811   # このメソッドは get_rhs_port3 と対になっている
     5512  #=== Join# 右辺のセルを得る
     5513  # through は適用しないが、composite は展開した後のセル
     5514  # (意味解析が終わっていないと、composite 展開が終わっていない)
     5515  # このメソッドは get_rhs_port3 と対になっている
    58125516  def get_rhs_cell3
    58135517    if @cell then
     
    58165520  end
    58175521
    5818   #=== Join# 右辺のセルのリージョンを得る
    5819   # 右辺が未定義の場合、nil を返す
    5820   # composite の場合、実セルではなく composite cell の region を返す(composite はすべて同じ region に属する)
    5821   # composite の cell がプロトタイプ宣言されているとき get_rhs_cell/get_real_cell は ruby の例外となる
     5522  #=== Join# 右辺のセルのリージョンを得る
     5523  # 右辺が未定義の場合、nil を返す
     5524  # composite の場合、実セルではなく composite cell の region を返す(composite はすべて同じ region に属する)
     5525  # composite の cell がプロトタイプ宣言されているとき get_rhs_cell/get_real_cell は ruby の例外となる
    58225526  def get_rhs_region
    5823     # through 指定あり?
     5527    # through 指定あり?
    58245528    if @through_list[0] then
    58255529      if @through_generated_list[0] then
    5826         # mikan through で生成したものが root namespace 限定
     5530        # mikan through で生成したものが root namespace 限定
    58275531        # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] )    #1
    58285532        cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
     
    58315535        end
    58325536      else
    5833         return nil       # generate に失敗している
     5537        return nil       # generate に失敗している
    58345538      end
    58355539    elsif @cell then
    58365540      return @cell.get_region
    58375541    end
    5838     # 右辺が未定義の場合 @cell は nil (既にエラー)
     5542    # 右辺が未定義の場合 @cell は nil (既にエラー)
    58395543    return nil
    58405544  end
    58415545
    5842   def get_cell_global_name  # 受け口セル名(コンポジットなら展開したå†
    5843 å´ã®ã‚»ãƒ«ï¼‰
     5546  def get_cell_global_name  # 受け口セル名(コンポジットなら展開した内側のセル)
    58445547
    58455548    # debug
     
    58555558  end
    58565559
    5857   #===  Join# 結合の右辺の受け口の名前
    5858   #     namespace 名 + '_' + セル名 + '_' + 受け口名   ï¼ˆã“のセルが composite ならば展開後のセル名、受け口名)
    5859   #subscript:: Integer  呼び口é
    5860 åˆ—の時添数 または nil 呼び口é
    5861 åˆ—でない時
    5862   def get_port_global_name( subscript = nil )  # 受け口名(コンポジットなら展開したå†
    5863 å´ã®ã‚»ãƒ«ï¼‰
     5560  #===  Join# 結合の右辺の受け口の名前
     5561  #     namespace 名 + '_' + セル名 + '_' + 受け口名   (このセルが composite ならば展開後のセル名、受け口名)
     5562  #subscript:: Integer  呼び口配列の時添数 または nil 呼び口配列でない時
     5563  def get_port_global_name( subscript = nil )  # 受け口名(コンポジットなら展開した内側のセル)
    58645564
    58655565    # debug
    58665566    dbgPrint "Cell get_port_global_name:  #{@cell_name}\n"
    58675567
    5868     # through 指定あり?
     5568    # through 指定あり?
    58695569    if @through_list[0] then
    58705570
    5871       # mikan through で生成したものが root namespace 限定
     5571      # mikan through で生成したものが root namespace 限定
    58725572      # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] )    #1
    58735573      cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
    58745574
    5875       # through で挿å
    5876 ¥ã•ã‚ŒãŸã‚»ãƒ«ã§ã€å®Ÿéš›ã«æŽ¥ç¶šã•ã‚Œã‚‹ã‚»ãƒ«ï¼ˆcompositeの場合å†
    5877 éƒ¨ã®)の受け口の C 言語名前
     5575      # through で挿入されたセルで、実際に接続されるセル(compositeの場合内部の)の受け口の C 言語名前
    58785576      return cell.get_real_global_port_name( @through_generated_list[0].get_through_entry_port_name )
    58795577    else
    58805578
    5881       # 実際に接続されるセルの受け口の C 言語名前
     5579      # 実際に接続されるセルの受け口の C 言語名前
    58825580      if @cell then
    58835581        return @cell.get_real_global_port_name( @port_name )
     
    59025600  end
    59035601
    5904   #=== Join# 右辺のポートを得る
    5905   #    右辺が composite の場合は、å†
    5906 éƒ¨ã®ç¹‹ãŒã‚‹ã‚»ãƒ«ã®ãƒãƒ¼ãƒˆ, through の場合は挿å
    5907 ¥ã•ã‚ŒãŸã‚»ãƒ«ã®ãƒãƒ¼ãƒˆ
    5908   #    このメソッドは get_rhs_cell と対になっている
     5602  #=== Join# 右辺のポートを得る
     5603  #    右辺が composite の場合は、内部の繋がるセルのポート, through の場合は挿入されたセルのポート
     5604  #    このメソッドは get_rhs_cell と対になっている
    59095605  def get_rhs_port
    5910     # through 指定あり?
     5606    # through 指定あり?
    59115607    if @through_list[0] then
    5912       # mikan through で生成したものが root namespace 限定
    5913       # through で生成されたセルを探す
     5608      # mikan through で生成したものが root namespace 限定
     5609      # through で生成されたセルを探す
    59145610#      cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] )    #1
    59155611      cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
    5916       # cell のプラグインで生成されたポート名のポートを探す (composite ならå†
    5917 éƒ¨ã®ç¹‹ãŒã‚‹ãƒãƒ¼ãƒˆ)
     5612      # cell のプラグインで生成されたポート名のポートを探す (composite なら内部の繋がるポート)
    59185613      return cell.get_real_port( @through_generated_list[0].get_through_entry_port_name )
    59195614    else
    5920       # ポートを返す(composite ならå†
    5921 éƒ¨ã®ç¹‹ãŒã‚‹ãƒãƒ¼ãƒˆã‚’返す)
     5615      # ポートを返す(composite なら内部の繋がるポートを返す)
    59225616      return @cell.get_real_port( @port_name )
    59235617    end
    59245618  end
    59255619
    5926   #=== Join# 右辺のポートを得る
    5927   # 右辺のポートを得る。
    5928   # これはプロトタイプ宣言しかされていない場合には、こちらしか使えない
     5620  #=== Join# 右辺のポートを得る
     5621  # 右辺のポートを得る。
     5622  # これはプロトタイプ宣言しかされていない場合には、こちらしか使えない
    59295623  def get_rhs_port2
    5930     # through 指定あり?
     5624    # through 指定あり?
    59315625    if @through_list[0] then
    59325626      if @through_generated_list[0] then
    59335627        port = @through_generated_list[0].get_through_entry_port_name.to_sym
    59345628      else
    5935         port = @port_name    # generate に失敗している
     5629        port = @port_name    # generate に失敗している
    59365630      end
    59375631    else
     
    59425636  end
    59435637
    5944   #=== Join# 右辺のポートを得る
    5945   # through は適用しないが、composite は展開した後のセルの対応するポート
     5638  #=== Join# 右辺のポートを得る
     5639  # through は適用しないが、composite は展開した後のセルの対応するポート
    59465640  def get_rhs_port3
    59475641    if @cell then
     
    59505644  end
    59515645
    5952   #=== Join# 呼び口é
    5953 åˆ—の2番目以降の要素を追加する
    5954   #     ä¸€ç•ªæœ€åˆã«å®šç¾©ã•ã‚ŒãŸé
    5955 åˆ—要素がå
    5956 ¨è¦ç´ ã®åˆæœŸå€¤ã®é
    5957 åˆ—を持つ
    5958   #     ã“のメソッドは非é
    5959 åˆ—の場合も呼出される(join 重複エラーの場合)
    5960   #join2:: Join  呼び口é
    5961 åˆ—要素の Join
     5646  #=== Join# 呼び口配列の2番目以降の要素を追加する
     5647  #     一番最初に定義された配列要素が全要素の初期値の配列を持つ
     5648  #     このメソッドは非配列の場合も呼出される(join 重複エラーの場合)
     5649  #join2:: Join  呼び口配列要素の Join
    59625650  def add_array_member join2
    59635651
    5964     # subscript2: join2 の左辺添数
     5652    # subscript2: join2 の左辺添数
    59655653    subscript2 = join2.get_subscript
    59665654
    59675655    if @subscript == nil then           # not array : initialize duplicate
    5968       # 非é
    5969 åˆ—の場合、join が重複している
     5656      # 非配列の場合、join が重複している
    59705657      cdl_error( "S1127 \'$1\' duplicate", @name )
    59715658      # print "add_array_member2: #{@owner.get_name}\n"
    59725659
    59735660    elsif @subscript >= 0 then
    5974       # 添数指定ありの場合
     5661      # 添数指定ありの場合
    59755662      if( subscript2 == nil || subscript2 < 0 ) then
    5976         # join2 左辺は非é
    5977 åˆ—または添数なし
    5978         # é
    5979 åˆ—が不一致
     5663        # join2 左辺は非配列または添数なし
     5664        # 配列が不一致
    59805665        cdl_error( "S1128 \'$1\' inconsistent array definition", @name )
    59815666      elsif @array_member[subscript2] != nil then
    5982         # 同じ添数が既に定義済み
     5667        # 同じ添数が既に定義済み
    59835668        cdl_error( "S1129 \'$1\' redefinition of subscript $2" ,@name, subscript2 )
    59845669      else
    5985         # 添数の位置に要素を追加
     5670        # 添数の位置に要素を追加
    59865671        @array_member[subscript2] = join2.get_rhs
    59875672        @array_member2[subscript2] = join2
     
    59905675
    59915676    else
    5992       # 添数指定なしの場合
     5677      # 添数指定なしの場合
    59935678      if( subscript2 == nil || subscript2 >= 0 ) then
    5994         # join2 左辺は非é
    5995 åˆ—または添数有
    5996         # é
    5997 åˆ—が不一致
     5679        # join2 左辺は非配列または添数有
     5680        # 配列が不一致
    59985681        cdl_error( "S1130 \'R1\' inconsistent array definition", @name )
    59995682      end
    60005683
    6001       # 添数なしé
    6002 åˆ—の場合、é
    6003 åˆ—要素を追加
     5684      # 添数なし配列の場合、配列要素を追加
    60045685      @array_member  << join2.get_rhs
    60055686      @array_member2 << join2
     
    60255706      while i < @array_member2.length
    60265707        if @array_member2[i] != self && @array_member[i] != nil then
    6027           # @array_member2[i] が nil になるのは optional の時と、
    6028           # Join の initialize で無駄に @array_member2 が設定されている場合
    6029           # 無駄に設定されているものについては、再帰的に呼び出すå¿
    6030 è¦ã¯ãªã„(clone_for_composite では対策している)
     5708          # @array_member2[i] が nil になるのは optional の時と、
     5709          # Join の initialize で無駄に @array_member2 が設定されている場合
     5710          # 無駄に設定されているものについては、再帰的に呼び出す必要はない(clone_for_composite では対策している)
    60315711          @array_member2[i].change_name( name )
    60325712        end
     
    60365716  end
    60375717
    6038   # composite cell を展開したセルの結合を clone したセルの名前に変更
     5718  # composite cell を展開したセルの結合を clone したセルの名前に変更
    60395719  def change_rhs_port( clone_cell_list, celltype )
    60405720
     
    60545734    dbgPrint "  cell_name:   #{@cell_name} => #{c.get_global_name}, #{c.get_name}\n"
    60555735
    6056     # @rhs のå†
    6057 å®¹ã‚’調整しておく(このå†
    6058 å®¹ã¯ã€subscript を除いて、後から使われていない)
     5736    # @rhs の内容を調整しておく(この内容は、subscript を除いて、後から使われていない)
    60595737    elements = @rhs.get_elements
    6060     if elements[0] == :OP_SUBSC then  # 右辺:受け口é
    6061 åˆ—?
     5738    if elements[0] == :OP_SUBSC then  # 右辺:受け口配列?
    60625739      elements  = elements[1]
    60635740    end
    60645741
    6065     # 右辺が cell.ePort の形式でない
     5742    # 右辺が cell.ePort の形式でない
    60665743    if elements[0] != :OP_DOT || elements[1][0] != :IDENTIFIER then   #1
    60675744      return
    60685745    else
    6069       # セル名を composite å†
    6070 éƒ¨ã®åå‰ã‹ã‚‰ã€å¤–部の名前にå
    6071 ¥ã‚Œæ›¿ãˆã‚‹
     5746      # セル名を composite 内部の名前から、外部の名前に入れ替える
    60725747      # elements[1][1] = Token.new( c.get_name, nil, nil, nil )
    60735748      elements[1][1] = NamespacePath.new( c.get_name, false, c.get_namespace )
     
    60765751    @cell_name = c.get_name
    60775752    @cell = c
    6078     # @definition = nil          # @definition が有効: チェック済み(とは、しない)
     5753    # @definition = nil          # @definition が有効: チェック済み(とは、しない)
    60795754
    60805755    if @array_member2 then
     
    60855760      i = 0
    60865761      while i < @array_member2.length
    6087         # @array_member2[i] が nil になるのは optional の時と、
    6088         # Join の initialize で無駄に @array_member2 が設定されている場合
    6089         # 無駄に設定されているものについては、再帰的に呼び出すå¿
    6090 è¦ã¯ãªã„(clone_for_composite では対策している)
     5762        # @array_member2[i] が nil になるのは optional の時と、
     5763        # Join の initialize で無駄に @array_member2 が設定されている場合
     5764        # 無駄に設定されているものについては、再帰的に呼び出す必要はない(clone_for_composite では対策している)
    60915765        if @array_member2[i] != self && @array_member[i] != nil then
    60925766          @array_member2[i].change_rhs_port( clone_cell_list, celltype )
     
    60985772  end
    60995773
    6100   #=== Join# composite セル用にクローン
    6101   #cell_global_name:: string : 親セルのグローバル名
    6102   # 右辺の C_EXP に含まれる $id$, $cell$, $ct$ を置換
    6103   # ここで置換するのは composite の attribute の C_EXP を composite セルタイプおよびセル名に置換するため
    6104   # (å†
    6105 éƒ¨ã‚»ãƒ«ã® C_EXP もここで置換される)
    6106   # @through_list などもコピーされるので、これが呼び出される前に確定するå¿
    6107 è¦ãŒã‚ã‚‹
     5774  #=== Join# composite セル用にクローン
     5775  #cell_global_name:: string : 親セルのグローバル名
     5776  # 右辺の C_EXP に含まれる $id$, $cell$, $ct$ を置換
     5777  # ここで置換するのは composite の attribute の C_EXP を composite セルタイプおよびセル名に置換するため
     5778  # (内部セルの C_EXP もここで置換される)
     5779  # @through_list などもコピーされるので、これが呼び出される前に確定する必要がある
    61085780  def clone_for_composite( ct_name, cell_name, locale, b_need_recursive = true )
    61095781
     
    61255797
    61265798  def clone_array_member( array_member, array_member2, ct_name, cell_name, prev, locale )
    6127     # é
    6128 åˆ—のコピーを作る
     5799    # 配列のコピーを作る
    61295800    am  = array_member.clone
    61305801    am2 = array_member2.clone
    61315802
    6132     # é
    6133 åˆ—要素のコピーを作る
     5803    # 配列要素のコピーを作る
    61345804    i = 0
    61355805    while i < am2.length
    61365806      if array_member2[i] == prev then
    6137         # 自分自身である(ので、呼出すと無限再帰呼出しとなる)
     5807        # 自分自身である(ので、呼出すと無限再帰呼出しとなる)
    61385808        am2[i] = self
    61395809      elsif array_member2[i] then
    61405810        am2[i] = array_member2[i].clone_for_composite( ct_name, cell_name, locale, false )
    61415811      else
    6142         # 以前のエラーで array_member2[i] は nil になっている
     5812        # 以前のエラーで array_member2[i] は nil になっている
    61435813      end
    61445814
     
    61495819    end
    61505820
    6151     # i = 0 は、ここで自分自身を設定
     5821    # i = 0 は、ここで自分自身を設定
    61525822    # am2[0] = self
    61535823
     
    61575827  end
    61585828
    6159   #=== Join# rhs をå
    6160 ¥ã‚Œæ›ãˆã‚‹
     5829  #=== Join# rhs を入れ換える
    61615830  #rhs:: Expression | initializer
    6162   # 右辺をå
    6163 ¥ã‚Œæ›ãˆã‚‹ï¼Ž
    6164   # このメソッドは、composite で cell の属性の初期値を attribute の値で置き換えるのに使われる
    6165   # このメソッドは composite å†
    6166 ã® cell の属性の初期値が定数ではなく式になった場合、不要になる
     5831  # 右辺を入れ換える.
     5832  # このメソッドは、composite で cell の属性の初期値を attribute の値で置き換えるのに使われる
     5833  # このメソッドは composite 内の cell の属性の初期値が定数ではなく式になった場合、不要になる
    61675834  def change_rhs rhs
    61685835    @rhs = rhs
    61695836  end
    61705837
    6171   #=== Join# clone された join の owner を変更
     5838  #=== Join# clone された join の owner を変更
    61725839  def set_cloned( owner )
    61735840    dbgPrint "Join#set_cloned: #{@name}  prev owner: #{@owner.get_name} new owner: #{owner.get_name}\n"
     
    62555922end
    62565923
    6257 #== 逆結合
     5924#== 逆結合
    62585925class ReverseJoin < BDNode
    62595926#@ep_name:: Symbol
     
    62805947end
    62815948
    6282 # CLASS: CompositeCelltype 用の Join
    6283 # REM:   CompositeCelltype が export するもの
     5949# CLASS: CompositeCelltype 用の Join
     5950# REM:   CompositeCelltype が export するもの
    62845951class CompositeCelltypeJoin < BDNode
    6285 # @export_name:: string     :  CompositeCelltype が export する名前(呼び口、受け口、属性)
    6286 # @internal_cell_name:: string : CompositeCelltype å†
    6287 éƒ¨ã®ã‚»ãƒ«ã®åå‰
    6288 # @internal_cell_elem_name:: string : CompositeCelltype å†
    6289 éƒ¨ã®ã‚»ãƒ«ã®å‘¼ã³å£ã€å—け口、属性の名前
    6290 # @cell : Cell : Cell::  internal cell  : CompositeCelltyep å†
    6291 éƒ¨ã®ã‚»ãƒ«ï¼ˆin_compositeセル)
     5952# @export_name:: string     :  CompositeCelltype が export する名前(呼び口、受け口、属性)
     5953# @internal_cell_name:: string : CompositeCelltype 内部のセルの名前
     5954# @internal_cell_elem_name:: string : CompositeCelltype 内部のセルの呼び口、受け口、属性の名前
     5955# @cell : Cell : Cell::  internal cell  : CompositeCelltyep 内部のセル(in_compositeセル)
    62925956# @port_decl:: Port | Decl
    62935957# @b_pseudo: bool :
     
    63045968  end
    63055969
    6306   #=== CompositeCelltypeJoin# CompositeCelltypeJoin の対象セルか?
    6307   #cell::  Cell 対象かどうかチェックするセル
     5970  #=== CompositeCelltypeJoin# CompositeCelltypeJoin の対象セルか?
     5971  #cell::  Cell 対象かどうかチェックするセル
    63085972  #
    6309   #     CompositeCelltypeJoin と cell の名前が一致するかチェックする
    6310   #     port_decl が指定された場合は、現状使われていない
     5973  #     CompositeCelltypeJoin と cell の名前が一致するかチェックする
     5974  #     port_decl が指定された場合は、現状使われていない
    63115975  def match?( cell, port_decl = nil )
    63125976
     
    63245988
    63255989#    if @cell.equal?( cell ) && ( port_decl == nil || @port_decl.equal?( port_decl ) ) then
    6326     # なぜ port_decl が一致しなければならなかったか忘れた。
    6327     # recursive_composite で名前の一致に変更   060917
     5990    # なぜ port_decl が一致しなければならなかったか忘れた。
     5991    # recursive_composite で名前の一致に変更   060917
    63285992    if((@cell.get_name == cell.get_name) && (port_decl == nil || @port_decl.get_name == port_decl.get_name))then
    63295993      true
     
    63576021  end
    63586022
    6359   # @port_decl が Port の場合のみ呼び出してよい
     6023  # @port_decl が Port の場合のみ呼び出してよい
    63606024  def get_port_type
    63616025    if @port_decl then
     
    63796043  end
    63806044
    6381   # @port_decl が Port の場合のみ呼び出してよい
     6045  # @port_decl が Port の場合のみ呼び出してよい
    63826046  def is_require?
    63836047    if @port_decl then
     
    63866050  end
    63876051
    6388   # @port_decl が Port の場合のみ呼び出してよい
     6052  # @port_decl が Port の場合のみ呼び出してよい
    63896053  def is_allocator_port?
    63906054    if @port_decl then
     
    63936057  end
    63946058
    6395   # @port_decl が Port の場合のみ呼び出してよい
     6059  # @port_decl が Port の場合のみ呼び出してよい
    63966060  def is_optional?
    63976061    if @port_decl then
     
    64006064  end
    64016065
    6402   #=== CompositeCelltypeJoin# 右辺が Decl ならば初期化子(式)を返す
    6403   # このメソッドは Cell の check_join から初期値チェックのために呼び出される
     6066  #=== CompositeCelltypeJoin# 右辺が Decl ならば初期化子(式)を返す
     6067  # このメソッドは Cell の check_join から初期値チェックのために呼び出される
    64046068  def get_initializer
    64056069    if @port_decl.instance_of? Decl then
     
    64146078  end
    64156079
    6416   #=== CompositeCelltypeJoin# é
    6417 åˆ—サイズを得る
    6418   #RETURN:: nil: not array, "[]": 大きさ指定なし, Integer: 大きさ指定あり
     6080  #=== CompositeCelltypeJoin# 配列サイズを得る
     6081  #RETURN:: nil: not array, "[]": 大きさ指定なし, Integer: 大きさ指定あり
    64196082  def get_array_size
    64206083    @port_decl.get_array_size
    64216084  end
    64226085
    6423   #=== CompositeCelltypeJoin# signature を得る
    6424   # @port_decl が Port の時のみ呼び出してもよい
     6086  #=== CompositeCelltypeJoin# signature を得る
     6087  # @port_decl が Port の時のみ呼び出してもよい
    64256088  def get_signature
    64266089    @port_decl.get_signature
     
    64656128# @file_name:: string
    64666129# @format:: string
    6467 # @arg_list:: Expression の elements と同じ形式 [ [:IDENTIFIER, String], ... ]
     6130# @arg_list:: Expression の elements と同じ形式 [ [:IDENTIFIER, String], ... ]
    64686131# @f_celltype:: bool : true: celltype factory, false: cell factory
    64696132
     
    64766139    case name
    64776140    when :write
    6478       # write 関数
     6141      # write 関数
    64796142      @name = name
    64806143
    6481       # write 関数の第一引数:出力å
    6482 ˆãƒ•ã‚¡ã‚¤ãƒ«å
    6483         # 式を評価する(通常単一の文字列であるから、単一の文字列が返される)
     6144      # write 関数の第一引数:出力先ファイル名
     6145        # 式を評価する(通常単一の文字列であるから、単一の文字列が返される)
    64846146      @file_name = file_name.eval_const(nil).val  # file_name : Expression
    64856147      if ! @file_name.instance_of?( String ) then
    6486         # 文字列定数ではなかった
     6148        # 文字列定数ではなかった
    64876149        cdl_error( "S1132 $1: 1st parameter is not string(file name)" , @name )
    64886150        @file_name = nil
    64896151      end
    64906152
    6491       # write 関数の第二引数:フォーマット文字列
     6153      # write 関数の第二引数:フォーマット文字列
    64926154      @format    = format.eval_const(nil).val     # format : Expression
    6493         # 式を評価する(通常単一の文字列であるから、単一の文字列が返される)
     6155        # 式を評価する(通常単一の文字列であるから、単一の文字列が返される)
    64946156      if ! @format.instance_of?( String ) then
    6495         # 文字列定数ではなかった
     6157        # 文字列定数ではなかった
    64966158        cdl_error( "S1133 $1: 2nd parameter is not string(fromat)" , @name )
    64976159        @format = nil
    64986160      end
    64996161
    6500       # 第三引数以降を引数リストとする mikan 引数のチェック
     6162      # 第三引数以降を引数リストとする mikan 引数のチェック
    65016163      @arg_list = arg_list
    65026164
     
    65756237#== Domain
    65766238#
    6577 # region の domain を記憶するクラス
     6239# region の domain を記憶するクラス
    65786240class DomainType < Node
    6579 #@name::Symbol : ドメインタイプの名前 ex) HRP2
     6241#@name::Symbol : ドメインタイプの名前 ex) HRP2
    65806242#@region::Region
    65816243#@plugin_name::Symbol : ex) HRP2Plugin
    65826244#@option::String : ex) "trusted", "nontrusted"
    6583 #@plugin::DomainPlugin の子クラス
     6245#@plugin::DomainPlugin の子クラス
    65846246
    65856247  include PluginModule
    65866248
    6587   # ドメインに属する region の Hash
    6588   # domain 指定が一度も行われない場合、このリストは空である
    6589   # ルートリージョンは option = "OutOfDomain" で登録される (domain 指定が無ければ登録されない)
     6249  # ドメインに属する region の Hash
     6250  # domain 指定が一度も行われない場合、このリストは空である
     6251  # ルートリージョンは option = "OutOfDomain" で登録される (domain 指定が無ければ登録されない)
    65906252  @@domain_regions = { }  # { :domain_type => [ region, ... ] }
    65916253
     
    66286290  end
    66296291
    6630   #== Domain リージョンの Hash を得る
    6631   # @@domain_regions の説明参ç
    6632 §
     6292  #== Domain リージョンの Hash を得る
     6293  # @@domain_regions の説明参照
    66336294  def self.get_domain_regions
    66346295    return @@domain_regions
     
    66496310end
    66506311
    6651 #== Region クラス
     6312#== Region クラス
    66526313#
    6653 # Region は Namespace を継承している
    6654 # root region は特殊で、root namespace と同じである
     6314# Region は Namespace を継承している
     6315# root region は特殊で、root namespace と同じである
    66556316#
    6656 # cell は region に属する
    6657 # region に属する cell のリストは Namespace クラスのインスタンス変数として記憶される
     6317# cell は region に属する
     6318# region に属する cell のリストは Namespace クラスのインスタンス変数として記憶される
    66586319#
    66596320class Region < Namespace
    66606321# @name:: string
    6661 # @in_through_list:: [ [ plugin_name, plugin_arg ], ... ] : plungin_name = nil の時 in 禁止
    6662 # @out_through_list:: [ [ plugin_name, plugin_arg ], ... ] : plungin_name = nil の時 out 禁止
     6322# @in_through_list:: [ [ plugin_name, plugin_arg ], ... ] : plungin_name = nil の時 in 禁止
     6323# @out_through_list:: [ [ plugin_name, plugin_arg ], ... ] : plungin_name = nil の時 out 禁止
    66636324# @to_through_list:: [ [ dst_region, plugin_name, plugin_arg ], ... ]
    6664 # @cell_port_throug_plugin_list:: { "#{cell_name}.#{port_name}" => through_generated_list の要素 }
    6665 #    この region から cell_name.port_name への through プラグインで生成されたオブジェクト
     6325# @cell_port_throug_plugin_list:: { "#{cell_name}.#{port_name}" => through_generated_list の要素 }
     6326#    この region から cell_name.port_name への through プラグインで生成されたオブジェクト
    66666327# @region_type::Symbol : :NODE, :LINKUNIT, :DOMAIN, :CLASS
    6667 # @region_type_param::Symbol : domain, class の名前. node, linkunit では nil
    6668 # @link_root:: Region : linkUnit の根っことなる region (node, linkunit が指定された region)
    6669 # @family_line:: [ @region_root, ...,@region_me ]  家系
    6670 # @in_through_count:: Integer :  n 番目の in_through 結合 (n>=0)
    6671 # @out_through_count:: Integer : n 番目の out_through 結合 (n>=0)
    6672 # @to_through_count:: { :RegionName => Integer }: RegionName への n 番目の to_through 結合 (n>=0)
    6673 # @domain_type::DomainType : domain 指定されていない場合、nil
    6674 # @domain_root::Region : domain 指定されていなる Region (root の場合 nil)
     6328# @region_type_param::Symbol : domain, class の名前. node, linkunit では nil
     6329# @link_root:: Region : linkUnit の根っことなる region (node, linkunit が指定された region)
     6330# @family_line:: [ @region_root, ...,@region_me ]  家系
     6331# @in_through_count:: Integer :  n 番目の in_through 結合 (n>=0)
     6332# @out_through_count:: Integer : n 番目の out_through 結合 (n>=0)
     6333# @to_through_count:: { :RegionName => Integer }: RegionName への n 番目の to_through 結合 (n>=0)
     6334# @domain_type::DomainType : domain 指定されていない場合、nil
     6335# @domain_root::Region : domain 指定されていなる Region (root の場合 nil)
    66756336
    66766337  @@in_through_list  = []
     
    66806341  @@region_type_param = nil
    66816342  @@domain_name = nil
    6682   @@domain_option = nil    # Token がå
    6683 ¥ã‚‹
     6343  @@domain_option = nil    # Token が入る
    66846344
    66856345  @@link_roots = []
    66866346
    66876347  def initialize( name )
    6688     # mikan name の Namespace 修飾
    6689     # object = Namespace.find( [ name ] )   # 親まで捜しにいく
     6348    # mikan name の Namespace 修飾
     6349    # object = Namespace.find( [ name ] )   # 親まで捜しにいく
    66906350    if name != "::" then
    66916351      object = Namespace.get_current.find( name )    #1
    66926352    else
    6693       # root リージョン
     6353      # root リージョン
    66946354      object = nil
    66956355      @@region_type = :NODE
     
    67276387        dbgPrint "Region.new: re-appear #{@name}\n"
    67286388
    6729         # # Region path が前回出現と一致するか?
     6389        # # Region path が前回出現と一致するか?
    67306390        # if @@region_stack[ @@region_stack_sp - 1 ] then
    67316391        #   my_path = @@region_stack[ @@region_stack_sp - 1 ].get_path_string.to_s + "." + @name.to_s
     
    67376397        # end
    67386398
    6739         # 再出現
     6399        # 再出現
    67406400        # @@region_stack[@@region_stack_sp] = object
    67416401
    6742         # 再出現時に specifier が指定されているか?
     6402        # 再出現時に specifier が指定されているか?
    67436403        if( @in_through_list.length != 0 || @out_through_list.length != 0 || @to_through_list.length != 0 || @region_type != nil )then
    67446404          cdl_error( "S1140 $1: region specifier must place at first appearence" , name )
     
    67476407
    67486408      else
    6749         # エラー用ダミー定義
    6750 
    6751         # 異なる同名のオブジェクトが定義済み
     6409        # エラー用ダミー定義
     6410
     6411        # 異なる同名のオブジェクトが定義済み
    67526412        cdl_error( "S1141 $1 duplication, previous one : $2" , name, object.class )
    6753         # @@region_stack[@@region_stack_sp] = self    # エラー時暫定 region
    6754       end
    6755     else
    6756       # 初出現
     6413        # @@region_stack[@@region_stack_sp] = self    # エラー時暫定 region
     6414      end
     6415    else
     6416      # 初出現
    67576417      dbgPrint "Region.new: #{@name}\n"
    67586418      set_region_family_line
     
    68076467  end
    68086468
    6809   #== Region ルートリージョンを得る
    6810   # ルートリージョンは、ルートネームスペースと同じである
     6469  #== Region ルートリージョンを得る
     6470  # ルートリージョンは、ルートネームスペースと同じである
    68116471  def self.get_root
    68126472    Namespace.get_root
     
    68166476
    68176477    dbgPrint  "set_region_family_line: Region: #{@name}  \n"
    6818     # root namespace (root region) の region type は :NODE
     6478    # root namespace (root region) の region type は :NODE
    68196479    if @name == "::" then
    68206480      @region_type = :NODE
     
    68346494
    68356495    if @domain_type then
    6836       # ルートリージョンが最初から @domain_type 設定されることはないの
    6837       # で @owner == nil を調べるå¿
    6838 è¦ã¯ãªã„
     6496      # ルートリージョンが最初から @domain_type 設定されることはないの
     6497      # で @owner == nil を調べる必要はない
    68396498      @owner.set_domain_type @domain_type
    68406499    end
     
    68506509    @link_root = nil
    68516510
    6852     # @family_line を作成する
    6853     # @link_root もみつける
    6854     # (上位にたどっていって Region で node または linkunit のいずれかå
    6855 ˆã«è¦‹ã¤ã‹ã£ãŸã‚‚のが @link_root となる)
    6856     # root namespace は Region かつ node なのでå¿
    6857 ãš @link_root は見つかる
    6858     # mikan: self が node, linkUnit の場合、ここで期å¾
    6859 ã—たとおりに設定されないため、Region#initialize で再設定
     6511    # @family_line を作成する
     6512    # @link_root もみつける
     6513    # (上位にたどっていって Region で node または linkunit のいずれか先に見つかったものが @link_root となる)
     6514    # root namespace は Region かつ node なので必ず @link_root は見つかる
     6515    # mikan: self が node, linkUnit の場合、ここで期待したとおりに設定されないため、Region#initialize で再設定
    68606516    obj = self
    68616517    while 1
     
    68686524        end
    68696525      else
    6870         # さもなければ Namespace
    6871         # namespace の下に region がある場合
    6872       end
    6873 
    6874       # root namespace にたどり着けば終り
     6526        # さもなければ Namespace
     6527        # namespace の下に region がある場合
     6528      end
     6529
     6530      # root namespace にたどり着けば終り
    68756531      break if obj.get_name == "::"
    68766532
     
    68836539  end
    68846540
    6885   #== Region#ドメインを設定する
     6541  #== Region#ドメインを設定する
    68866542  def set_domain_type domain_type
    68876543    if @region_type == :NODE then
     
    69276583  end
    69286584
    6929   #== Region# domain の根っことなる region を得る
    6930   # Region のインスタンスを返す
    6931   # domain 指定子があれば、そのリージョンがドメインルートである
    6932   # なければ、親リージョンのドメインルートとする
     6585  #== Region# domain の根っことなる region を得る
     6586  # Region のインスタンスを返す
     6587  # domain 指定子があれば、そのリージョンがドメインルートである
     6588  # なければ、親リージョンのドメインルートとする
    69336589  def get_domain_root
    69346590    @domain_root
     
    69706626  end
    69716627
    6972   #=== Region# 構文解析中の region を得る
    6973   # 構文解析中 Namespace (あるいは子クラスの Region) の上位をたどって Region を見つける
    6974   # cell が namespace 下におくことができなければ、ループをまわすå¿
    6975 è¦ã¯ãªã„
     6628  #=== Region# 構文解析中の region を得る
     6629  # 構文解析中 Namespace (あるいは子クラスの Region) の上位をたどって Region を見つける
     6630  # cell が namespace 下におくことができなければ、ループをまわす必要はない
    69766631  def self.get_current
    69776632    # @@region_stack[@@region_stack_sp]
     
    69866641  end
    69876642
    6988   #=== Region# through プラグインで、この region から cell_name.port_name へのプラグインオブジェクトを登録
    6989   # mikan namesppace 対応 (cell_name)
     6643  #=== Region# through プラグインで、この region から cell_name.port_name へのプラグインオブジェクトを登録
     6644  # mikan namesppace 対応 (cell_name)
    69906645  def add_cell_port_through_plugin( cell_name, port_name, through_plugin_object )
    69916646    @cell_port_throug_plugin_list[ "#{cell_name}.#{port_name}" ] = through_plugin_object
     
    70026657  end
    70036658
    7004   #=== Region# to_region への距離(unreachable な場合 nil)
    7005   # mikan Cell#check_region とRegion へたどり着くまでための処理にå
    7006 ±é€šæ€§ãŒé«˜ã„
    7007   # region#distance は require で用いられる
     6659  #=== Region# to_region への距離(unreachable な場合 nil)
     6660  # mikan Cell#check_region とRegion へたどり着くまでための処理に共通性が高い
     6661  # region#distance は require で用いられる
    70086662  def distance( to_region )
    70096663
    7010     r1 = self                   # 出発 region
    7011     r2 = to_region              # 目的 region
     6664    r1 = self                   # 出発 region
     6665    r2 = to_region              # 目的 region
    70126666    dist = 0
    70136667
    7014     if ! r1.equal? r2 then      # 同一 region なら呼出し可能
    7015 
    7016       # mikan namespace 対応
     6668    if ! r1.equal? r2 then      # 同一 region なら呼出し可能
     6669
     6670      # mikan namespace 対応
    70176671      f1 = r1.get_family_line
    70186672      len1 = f1.length
     
    70206674      len2 = f2.length
    70216675
    7022       # 不一致になるところ(å
    7023 „弟)を探す
    7024       i = 1  # i = 0 は :RootRegion なのでå¿
    7025 ãšä¸€è‡´
     6676      # 不一致になるところ(兄弟)を探す
     6677      i = 1  # i = 0 は :RootRegion なので必ず一致
    70266678      while( i < len1 && i < len2 )
    70276679        if( f1[i] != f2[i] )then
     
    70316683      end
    70326684
    7033       sibling_level = i     # å
    7034 „弟となるレベル、もしくはどちらか一方が終わったレベル
     6685      sibling_level = i     # 兄弟となるレベル、もしくはどちらか一方が終わったレベル
    70356686
    70366687      # p "sibling_level: #{i}"
     
    70386689      # p "to: #{f2[i].get_name}" if f2[i]
    70396690
    7040       # 呼び側について呼びå
    7041 ƒã®ãƒ¬ãƒ™ãƒ«ã‹ã‚‰å
    7042 „弟レベルまで(out_through をチェックおよび挿å
    7043 ¥ï¼‰
     6691      # 呼び側について呼び元のレベルから兄弟レベルまで(out_through をチェックおよび挿入)
    70446692      i = len1 -1
    70456693      while i >= sibling_level
     
    70646712      end
    70656713
    7066       # å
    7067 „弟レベルにおいて(to_through をチェックおよび挿å
    7068 ¥ï¼‰
     6714      # 兄弟レベルにおいて(to_through をチェックおよび挿入)
    70696715      if f1[sibling_level] && f2[sibling_level] then
    70706716        dbgPrint "going from #{f1[sibling_level].get_name} to #{f2[sibling_level].get_name}\n"
     
    70816727          found = 0
    70826728          f1[sibling_level].get_to_through_list.each { |t|
    7083             if t[0][0] == f2[sibling_level].get_name then   # region 名が一致するか ?
     6729            if t[0][0] == f2[sibling_level].get_name then   # region 名が一致するか ?
    70846730              found = 1
    70856731            end
     
    70926738      end
    70936739
    7094       # 受け側についてå
    7095 „弟レベルから受け側のレベルまで(in_through をチェックおよび挿å
    7096 ¥ï¼‰
     6740      # 受け側について兄弟レベルから受け側のレベルまで(in_through をチェックおよび挿入)
    70976741      i = sibling_level
    70986742      while i < len2
     
    71376781class Import_C < Node
    71386782
    7139   # ヘッダの名前文字列のリスト
     6783  # ヘッダの名前文字列のリスト
    71406784  @@header_list = {}
    71416785  @@header_list2 = []
    71426786  @@define_list = {}
    71436787
    7144   #=== Import_C# import_C の生成(ヘッダファイルを取込む)
    7145   #header:: Token : import_C の第一引数文字列リテラルトークン
    7146   #define:: Token : import_C の第二引数文字列リテラルトークン
     6788  #=== Import_C# import_C の生成(ヘッダファイルを取込む)
     6789  #header:: Token : import_C の第一引数文字列リテラルトークン
     6790  #define:: Token : import_C の第二引数文字列リテラルトークン
    71476791  def initialize( header, define = nil )
    71486792    super()
    7149     # ヘッダファイル名文字列から前後の "" を取り除く
     6793    # ヘッダファイル名文字列から前後の "" を取り除く
    71506794    # header = header.to_s.gsub( /\A"(.*)"\z/, '\1' )
    71516795    header = CDLString.remove_dquote header.to_s
    71526796
    71536797    if define then
    7154       # 前後の "" を取り除く
     6798      # 前後の "" を取り除く
    71556799      # def_opt = define.to_s.gsub( /\A"(.*)/, '\1' )
    71566800      # def_opt.sub!( /(.*)"\z/, '\1' )
    71576801      def_opt = CDLString.remove_dquote define.to_s
    71586802
    7159       # "," を -D に置き換え
     6803      # "," を -D に置き換え
    71606804      def_opt = def_opt.gsub( /,/, " -D " )
    71616805
    7162       # å
    7163 ˆé ­ã« -D を挿å
    7164 ¥ # mikan 不適切な define å
    7165 ¥åŠ›ãŒã‚った場合、CPP 時にエラー
     6806      # 先頭に -D を挿入 # mikan 不適切な define 入力があった場合、CPP 時にエラー
    71666807      def_opt = def_opt.gsub( /^/, "-D " )
    71676808
    71686809    end
    71696810
    7170     # コマンドライン指定された DEFINE
     6811    # コマンドライン指定された DEFINE
    71716812    $define.each{ |define|
    71726813      if $IN_EXERB then
     
    71896830      if found == false then
    71906831        begin
    7191           # ファイルの stat を取ってみる(なければ例外発生)
     6832          # ファイルの stat を取ってみる(なければ例外発生)
    71926833          File.stat( "#{path}/#{header}" )
    71936834
    7194           # cdl を見つかったファイルパスに再設定
     6835          # cdl を見つかったファイルパスに再設定
    71956836          header_path = "#{path}/#{header}"
    71966837          found = true
     
    72076848    end
    72086849
    7209     # 読込み済み?
     6850    # 読込み済み?
    72106851    if( @@header_list[ header ] ) then
    7211       # 第二引数 define が以前と異なる
     6852      # 第二引数 define が以前と異なる
    72126853      if @@define_list[ header ].to_s != define.to_s then
    72136854        cdl_error( "S1143 import_C: arg2: mismatch with previous one"  )
    72146855      end
    7215       # いずれにせよ読み込まない
     6856      # いずれにせよ読み込まない
    72166857      return
    72176858    end
    72186859
    7219     # ヘッダのリストを記録
     6860    # ヘッダのリストを記録
    72206861    @@header_list[ header ] = header_path
    72216862    @@header_list2 << header
     
    72416882    end
    72426883
    7243     # CPP 出力用 tmp ファイル名
     6884    # CPP 出力用 tmp ファイル名
    72446885    tmp_header = header.gsub( /\//, "_" )
    72456886    tmp_header = "#{$gen}/tmp_#{tmp_header}"
    72466887
    7247     # CPP コマンドラインを作成
     6888    # CPP コマンドラインを作成
    72486889    cmd = "#{$cpp} #{def_opt} #{include_opt} #{tmp_C}"
    72496890
     
    72536894      end
    72546895
    7255       # プリプロセッサコマンドを pipe として開く
    7256           # cmd は cygwin/Linux では bash(sh) 経由で実行される
    7257           # Exerb 版では cmd.exe 経由で実行される
    7258           # この差は引き数の (), $, % などシェルの特別な文字の評価に現れるので注意
     6896      # プリプロセッサコマンドを pipe として開く
     6897          # cmd は cygwin/Linux では bash(sh) 経由で実行される
     6898          # Exerb 版では cmd.exe 経由で実行される
     6899          # この差は引き数の (), $, % などシェルの特別な文字の評価に現れるので注意
    72596900          cpp = IO.popen( cmd, "r:ASCII-8BIT" )
    72606901      begin
     
    72696910        print_exception( evar )
    72706911      ensure
    7271         tmp_file.close if tmp_file    # mikan File.open に失敗した時 tmp_file == nil は保証されている ?
     6912        tmp_file.close if tmp_file    # mikan File.open に失敗した時 tmp_file == nil は保証されている ?
    72726913        cpp.close
    72736914      end
     
    72776918    end
    72786919
    7279     # C 言語のパーサインスタンスを生成
     6920    # C 言語のパーサインスタンスを生成
    72806921    c_parser = C_parser.new
    72816922
    7282     # tmp_header をパース
     6923    # tmp_header をパース
    72836924    c_parser.parse( [tmp_header] )
    72846925
    7285     # 終期化 パーサスタックを戻す
     6926    # 終期化 パーサスタックを戻す
    72866927    c_parser.finalize
    72876928
     
    73376978
    73386979class Import < Node
    7339 # @b_reuse::bool:       å†åˆ©ç”¨ï¼Žã‚»ãƒ«ã‚¿ã‚¤ãƒ—の template 生成不要
    7340 # @b_reuse_real::bool:  実際に再利用
    7341 # @cdl::      string:   import する CDL
    7342 # @cdl_path:: string:   CDL のパス
    7343 # @b_imported:: bool:   import された(コマンドライン指定されていない)
    7344 
    7345   # ヘッダの名前文字列のリスト  添字:expand したパス、値:Import
     6980# @b_reuse::bool:       再利用.セルタイプの template 生成不要
     6981# @b_reuse_real::bool:  実際に再利用
     6982# @cdl::      string:   import する CDL
     6983# @cdl_path:: string:   CDL のパス
     6984# @b_imported:: bool:   import された(コマンドライン指定されていない)
     6985
     6986  # ヘッダの名前文字列のリスト  添字:expand したパス、値:Import
    73466987  @@import_list = {}
    73476988
     
    73647005  end
    73657006
    7366   #=== Import# import を行う
    7367   #cdl::      string   cdl へのパス."" で囲まれていることを仮定
    7368   #b_reuse::  bool     true: template を生成しない
     7007  #=== Import# import を行う
     7008  #cdl::      string   cdl へのパス."" で囲まれていることを仮定
     7009  #b_reuse::  bool     true: template を生成しない
    73697010  def initialize( cdl, b_reuse = false, b_imported = true )
    73707011    Import.push self
     
    73727013    super()
    73737014    @@current_import = self
    7374     # ヘッダファイル名文字列から前後の "", <> を取り除くn
     7015    # ヘッダファイル名文字列から前後の "", <> を取り除くn
    73757016    @cdl = cdl.to_s.gsub( /\A["<](.*)[">]\z/, '\1' )
    73767017
    7377     # サーチパスから探す
     7018    # サーチパスから探す
    73787019    found = false
    73797020    @cdl_path = ""
     
    73837024
    73847025    if Generator.get_plugin then
    7385       # plugin から import されている場合 gen をサーチパスのå
    7386 ˆé ­ã«åŠ ãˆã‚‹
     7026      # plugin から import されている場合 gen をサーチパスの先頭に加える
    73877027      search_path = [ $gen ] + $import_path
    73887028    else
     
    73997039        end
    74007040
    7401         # ファイルの stat を取ってみる(なければ例外発生)
     7041        # ファイルの stat を取ってみる(なければ例外発生)
    74027042        File.stat( cdl_path )
    74037043
    7404         # cdl を見つかったファイルパスに再設定
     7044        # cdl を見つかったファイルパスに再設定
    74057045        @cdl_path = cdl_path
    74067046        found = true
     
    74197059    end
    74207060
    7421     # 読込み済みなら、読込まない
     7061    # 読込み済みなら、読込まない
    74227062    prev = @@import_list[ File.expand_path( @cdl_path ) ]
    74237063    if( prev ) then
     
    74287068    end
    74297069
    7430     # import リストを記録
     7070    # import リストを記録
    74317071    @@import_list[ File.expand_path( @cdl_path ) ] = self
    74327072
    7433     # plugin から import されている場合
     7073    # plugin から import されている場合
    74347074    plugin = Generator.get_plugin
    74357075
    7436     # パーサインスタンスを生成(別パーサで読み込む)
     7076    # パーサインスタンスを生成(別パーサで読み込む)
    74377077    parser = Generator.new
    74387078
    7439     # plugin から import されている場合の plugin 設定
     7079    # plugin から import されている場合の plugin 設定
    74407080    parser.set_plugin plugin
    74417081
    7442     # reuse フラグを設定
     7082    # reuse フラグを設定
    74437083    parser.set_reuse @b_reuse_real
    74447084
    7445     # cdl をパース
     7085    # cdl をパース
    74467086    parser.parse( [@cdl_path] )
    74477087
    7448     # 終期化 パーサスタックを戻す
     7088    # 終期化 パーサスタックを戻す
    74497089    parser.finalize
    74507090    Import.pop
     
    74717111  end
    74727112
    7473   #=== cdl の名前を返す
    7474   # 引数で指定されている cdl 名。一部パスを含む可能性がある
     7113  #=== cdl の名前を返す
     7114  # 引数で指定されている cdl 名。一部パスを含む可能性がある
    74757115  def get_cdl_name
    74767116    @cdl
     
    74787118end
    74797119
    7480 #== generate: signature プラグインのロードと実行
     7120#== generate: signature プラグインのロードと実行
    74817121class Generate < Node
    74827122#@plugin_name:: Symbol
    74837123#@signature_nsp:: NamespacePath
    7484 #@option::         String '"', '"' で囲まれている
     7124#@option::         String '"', '"' で囲まれている
    74857125
    74867126  include PluginModule
     
    74907130    @plugin_name = plugin_name
    74917131    @signature_nsp = signature_nsp
    7492     option = option.to_s    # option は Token
     7132    option = option.to_s    # option Token
    74937133    @option = option
    74947134
     
    75117151
    75127152    begin
    7513       eval( eval_str )     # plugin を生成
     7153      eval( eval_str )     # plugin を生成
    75147154      plugin_object.set_locale @locale
    75157155    rescue Exception => evar
     
    75237163end
    75247164
    7525 #== 名前空間パス
     7165#== 名前空間パス
    75267166class NamespacePath < Node
    75277167#@b_absolute::Bool
    75287168#@path::[ Symbol,... ]
    7529 #@namespace::Namespace:  @b_absolute == false のとき、基点となる namespace
     7169#@namespace::Namespace:  @b_absolute == false のとき、基点となる namespace
    75307170
    75317171  #=== NamespacePath# initialize
    7532   #ident::Symbol           æœ€åˆã®åå‰, ただし "::" のみの場合は String
    7533   #b_absolute:Bool         "::" で始まっている場合 true
    7534   #namespace::Namespace    b_absolute = false かつ、構文解釈段階以外で呼び出す場合は、å¿
    7535 ãšæŒ‡å®šã™ã‚‹ã“と
     7172  #ident::Symbol           最初の名前, ただし "::" のみの場合は String
     7173  #b_absolute:Bool         "::" で始まっている場合 true
     7174  #namespace::Namespace    b_absolute = false かつ、構文解釈段階以外で呼び出す場合は、必ず指定すること
    75367175  def initialize( ident, b_absolute, namespace = nil )
    75377176    super()
     
    75597198  end
    75607199
    7561   #=== NamespacePath# append する
     7200  #=== NamespacePath# append する
    75627201  #RETURN self
    7563   # このメソッドは、å
    7564 ƒã® NamespacePath オブジェクトを変形して返す
     7202  # このメソッドは、元の NamespacePath オブジェクトを変形して返す
    75657203  def append!( ident )
    75667204    @path << ident
    75677205    return self
    75687206  end
    7569   #=== NamespacePath# append する
    7570   # このメソッドは、å
    7571 ƒã® NamespacePath オブジェクトを変形しない
    7572   #RETURN:: 複製した NamespacePath
     7207  #=== NamespacePath# append する
     7208  # このメソッドは、元の NamespacePath オブジェクトを変形しない
     7209  #RETURN:: 複製した NamespacePath
    75737210  def append( ident )
    75747211    cl = self.clone
     
    75867223  end
    75877224
    7588   #=== NamespacePath#クローンを作成して名前を変更する
     7225  #=== NamespacePath#クローンを作成して名前を変更する
    75897226  def change_name name
    75907227    cl = self.clone
     
    75957232  alias :change_name_clone :change_name
    75967233
    7597   #=== NamespacePath#名前を変更する
    7598   # このインスタンスを参ç
    7599 §ã™ã‚‹ã™ã¹ã¦ã«å½±éŸ¿ã‚’与えることに注意
     7234  #=== NamespacePath#名前を変更する
     7235  # このインスタンスを参照するすべてに影響を与えることに注意
    76007236  def change_name_no_clone name
    76017237    @path[ @path.length - 1 ] = name
     
    76037239  end
    76047240
    7605   #=== NamespacePath:: path 文字列を得る
    7606   # CDL 用の path 文字列を生成
     7241  #=== NamespacePath:: path 文字列を得る
     7242  # CDL 用の path 文字列を生成
    76077243  def to_s
    76087244    get_path_str
     
    76337269  end
    76347270
    7635   #=== NamespacePath:: パスのé
    7636 åˆ—を返す
    7637   # is_absolute? true の場合、ルートからのパス
    7638   #              false の場合、base_namespace からの相対
    7639   # ルート namespace の場合、長さ0のé
    7640 åˆ—を返す
     7271  #=== NamespacePath:: パスの配列を返す
     7272  # is_absolute? true の場合、ルートからのパス
     7273  #              false の場合、base_namespace からの相対
     7274  # ルート namespace の場合、長さ0の配列を返す
    76417275  #
    76427276  def get_path
     
    76447278  end
    76457279
    7646   #=== NamespacePath#フルパスのé
    7647 åˆ—を返す
    7648   # 返されたé
    7649 åˆ—を書き換えてはならない
     7280  #=== NamespacePath#フルパスの配列を返す
     7281  # 返された配列を書き換えてはならない
    76507282  def get_full_path
    76517283    if @b_absolute then
     
    76567288  end
    76577289
    7658   #=== NamespacePath:: 相対パスのベースとなる namespace
    7659   # is_absolute? == false の時のみ有効な値を返す (true なら nil)
     7290  #=== NamespacePath:: 相対パスのベースとなる namespace
     7291  # is_absolute? == false の時のみ有効な値を返す (true なら nil)
    76607292  def get_base_namespace
    76617293    @namespace
    76627294  end
    76637295
    7664   #=== NamespacePath:: C 言語グローバル名を得る
     7296  #=== NamespacePath:: C 言語グローバル名を得る
    76657297  def get_global_name
    76667298    if @b_absolute then
     
    76807312  end
    76817313
    7682   #=== NamespacePath:: 分解して NamespacePath インスタンスを生成する
    7683   #path_str:: String       : namespace または region のパス ex) "::path::A" , "::", "ident"
    7684   #b_force_absolute:: Bool : "::" で始まっていない場合でも絶対パスに扱う
     7314  #=== NamespacePath:: 分解して NamespacePath インスタンスを生成する
     7315  #path_str:: String       : namespace または region のパス ex) "::path::A" , "::", "ident"
     7316  #b_force_absolute:: Bool : "::" で始まっていない場合でも絶対パスに扱う
    76857317  #
    7686   # NamespacePath は通常構文解析されて作成される
    7687   # このメソッドは、オプションなどで指定される文字列を分解して NamespacePath を生成するのに用いる
    7688   # チェックはゆるい。不適切なパス指定は、不適切な NamespacePath が生成される
     7318  # NamespacePath は通常構文解析されて作成される
     7319  # このメソッドは、オプションなどで指定される文字列を分解して NamespacePath を生成するのに用いる
     7320  # チェックはゆるい。不適切なパス指定は、不適切な NamespacePath が生成される
    76897321  def self.analyze( path_str, b_force_absolute = false )
    76907322
     
    77257357end
    77267358
    7727 # 以下単体テストコード
     7359# 以下単体テストコード
    77287360if $unit_test then
    77297361  root_namespace = Namespace.new("::")
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/ctypes.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: ctypes.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
    55 # CType は C_parser で定義される型を扱う CIntType, CFloatType などに include するもの
    56 # CIntType は IntType を継承するなど、C の型では TECS の型を継承する
     40# CType は C_parser で定義される型を扱う CIntType, CFloatType などに include するもの
     41# CIntType は IntType を継承するなど、C の型では TECS の型を継承する
    5742module CType
    5843
    59   #=== 構文要素 type_specifier が複数指定されている場合に merge する
    60   # merge は const(CIntType) unsigned(CIntTtype), long(CIntType), などと他の型をマージする
    61   # const, unsigned, long などは、単体で int (CIntType) 型になりうる
     44  #=== 構文要素 type_specifier が複数指定されている場合に merge する
     45  # merge は const(CIntType) unsigned(CIntTtype), long(CIntType), などと他の型をマージする
     46  # const, unsigned, long などは、単体で int (CIntType) 型になりうる
    6247  #
    63   # mikan C の文法を厳密にはチェックしていない  long struct 等もできてしまう
     48  # mikan C の文法を厳密にはチェックしていない  long struct 等もできてしまう
    6449  def merge another
    6550
    6651    # p "self: #{self.class} kind_of( IntType ): #{self.kind_of?( IntType )}  another: #{another.class}"
    6752
    68     # signed, unsigned が Symbol として来る事は無くなった
     53    # signed, unsigned が Symbol として来る事は無くなった
    6954    # if another.instance_of? Symbol then
    70     #   # ここで Symbol は :SIGNED, :UNSIGNED のいずれか
     55    #   # ここで Symbol は :SIGNED, :UNSIGNED のいずれか
    7156    #
    72     #   # CIntType か?
     57    #   # CIntType か?
    7358    #   if self.instance_of? CIntType then
    7459    #     self.set_sign another
     
    8469          @bit_size = -5  # long long
    8570        else
    86           # self は int 型、another の bit_size が (int 以外であれば)そちらにする
    87           # mikan 上記以外で 両方 -3 でなければ、本来エラー
     71          # self は int 型、another の bit_size が (int 以外であれば)そちらにする
     72          # mikan 上記以外で 両方 -3 でなければ、本来エラー
    8873          @bit_size = another.get_bit_size
    8974        end
     
    9176
    9277      if another.get_sign then
    93         # another で sign が指定されていれば、そちらのものを採用する mikan 矛盾のチェック
     78        # another で sign が指定されていれば、そちらのものを採用する mikan 矛盾のチェック
    9479        @sign = another.get_sign
    9580      end
    9681
    9782#      if another.get_qualifier then
    98 #        # another で qualifier が指定されていれば、そちらのものを採用する mikan 矛盾のチェック
     83#        # another で qualifier が指定されていれば、そちらのものを採用する mikan 矛盾のチェック
    9984#        @qualifier = another.get_qualifier
    10085#      end
     
    11095      return another.merge self
    11196    elsif self.instance_of?( CDefinedType ) then
    112       # mikan unsigned などとの merge の不正検出
     97      # mikan unsigned などとの merge の不正検出
    11398      if another.is_const? then
    11499        @b_const = true
     
    135120    else
    136121      # mikan long double
    137       #   TECS には long double を表現する手段がない (double80_t を定義すればよいか?)
     122      #   TECS には long double を表現する手段がない (double80_t を定義すればよいか?)
    138123#      cdl_warning( "C1003 $1 & $2 incompatible (\'long double\' is not supported.). Treated as $3." , self.class, another.class, self.class )
    139124      cdl_warning( "W9999 $1 & $2 incompatible (\'long double\' is not supported.). Treated as $3." , self.get_type_str, another.get_type_str, self.get_type_str )
     
    142127  end
    143128
    144   #=== qualifier を設定する
    145   #     å
    146 ƒã® Type クラスでは矛盾チェックしない(TECSの本来の文法では重複指定できないため)
     129  #=== qualifier を設定する
     130  #     元の Type クラスでは矛盾チェックしない(TECSの本来の文法では重複指定できないため)
    147131  def set_qualifier( qual )
    148132
     
    181165
    182166  def initialize( bit_size )
    183     #p super.class   mikan super.class が Symbol だ、なぜ?
     167    #p super.class   mikan super.class が Symbol だ、なぜ?
    184168    super( bit_size )
    185169  end
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/expression.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: expression.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
     
    7156
    7257  #=== Expression# to_s
    73   # C 言語ソース向きの文字列を生成 (globa_name)
     58  # C 言語ソース向きの文字列を生成 (globa_name)
    7459  def to_s
    7560    elements_to_s( @elements )
     
    7762
    7863  #=== Expression# to_str
    79   # C 言語ソース向きの文字列を生成 (globa_name)
     64  # C 言語ソース向きの文字列を生成 (globa_name)
    8065  def to_str( name_list, pre, post )
    8166    elements_to_s( @elements, name_list, pre, post )
     
    8368
    8469  #=== Expression#to_CDL_str
    85   # CDL 表現の文字列を生成
     70  # CDL 表現の文字列を生成
    8671  def to_CDL_str
    8772    return to_s
    8873  end
    8974
    90   #=== 定数式として評価する(トライしてみる)
     75  #=== 定数式として評価する(トライしてみる)
    9176  #
    92   # このメソッドは、定数式を評価する
    93   # ・attribute, var の初期化子
    94   # ・size_is, count_is 引数
    95   # ・é
    96 åˆ—の添数
     77  # このメソッドは、定数式を評価する
     78  # ・attribute, var の初期化子
     79  # ・size_is, count_is 引数
     80  # ・配列の添数
    9781  #
    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 (関数仮引数)
    10184  #
    102   # name_list2(NamedList|Nil) : NamedList の要素は Decl (attribute, var) である.省略時 nil
     85  # name_list2(NamedList|Nil) : NamedList の要素は Decl (attribute, var) である.省略時 nil
    10386  #
    104   # RETURN: 評価した定数.評価できなかった場合は nil を返す
     87  # RETURN: 評価した定数.評価できなかった場合は nil を返す
    10588  #
    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 の右辺を評価した場合
    10891
    10992  def eval_const( name_list, name_list2 = nil )
     
    11699      return val.to_i
    117100    elsif val.kind_of? PointerVal then
    118       return val.to_i           # mikan エラー V1008 が発生してしまう
     101      return val.to_i           # mikan エラー V1008 が発生してしまう
    119102      # elsif val.kind_of? EnumVal then
    120103      # enum mikan
    121104    else
    122       # C_EXP, Array または nil :そのまま返す
     105      # C_EXP, Array または nil :そのまま返す
    123106      return val
    124107    end
    125108  end
    126109
    127   #=== 定数式として評価する2(トライしてみる)
     110  #=== 定数式として評価する2(トライしてみる)
    128111  #
    129   # IntegerVal, FloatVal をそのまま返す(eval_const では Integer, Float に変換)
     112  # IntegerVal, FloatVal をそのまま返す(eval_const では Integer, Float に変換)
    130113  def eval_const2( name_list, name_list2 = nil, nest = 0 )
    131114    val = elements_eval_const( @elements, name_list, name_list2, nest )
    132115  end
    133116
    134   #=== 式の型を評価する
     117  #=== 式の型を評価する
    135118  #
    136   # eval_const で値が得られない場合、型を導出可能であれば型を得る
    137   # param を含んだ式は定数値を求められないが、型を得ることはできる
    138   # 未定義変数を含んだ型は、得ることができない (ダミー型定義が返る)
    139   def get_type( namedList )        # 名前空間の NamedList を指定
     119  # eval_const で値が得られない場合、型を導出可能であれば型を得る
     120  # param を含んだ式は定数値を求められないが、型を得ることはできる
     121  # 未定義変数を含んだ型は、得ることができない (ダミー型定義が返る)
     122  def get_type( namedList )        # 名前空間の NamedList を指定
    140123    elements_get_type( @elements, namedList )
    141124  end
     
    150133
    151134  def show_tree( indent )
    152     # mikan override してしまった print を呼出す方法がわからないのでこうした
     135    # mikan override してしまった print を呼出す方法がわからないのでこうした
    153136    str = ""
    154137    indent.times { str += "  " }
     
    158141## private
    159142
    160   #=== 式を文字列に変換
    161   #name_list:: attribute (Celltype::@attribute_list), struct の @member_list を仮定している
     143  #=== 式を文字列に変換
     144  #name_list:: attribute (Celltype::@attribute_list), struct の @member_list を仮定している
    162145  def elements_to_s( elements, name_list = nil, pre = nil, post = nil )
    163146    if elements.instance_of? Token then
    164       return elements.to_s    # OP_DOT, OP_REF の右辺
     147      return elements.to_s    # OP_DOT, OP_REF の右辺
    165148    end
    166149
     
    246229  end
    247230
    248   # 定数式(elements)を評価する
     231  # 定数式(elements)を評価する
    249232  #
    250   # このメソッドは Expression クラスのメソッドであるå¿
    251 è¦ã¯ãªã„(関数化できる)
     233  # このメソッドは Expression クラスのメソッドである必要はない(関数化できる)
    252234  #
    253   # elements は式の要素
     235  # elements は式の要素
    254236  #
    255   # name_list, name_list2 は eval_const を参ç
    256 §
     237  # name_list, name_list2 は eval_const を参照
    257238  #
    258   # RETURN: 評価した定数、評価できなかった場合は nil を返す
    259 
    260   MAX_NEST_LEVEL = 64    # 簡易のループ検出(参ç
    261 §ã®ãƒã‚¹ãƒˆã‚’ 64 まで許可する)
     239  # RETURN: 評価した定数、評価できなかった場合は nil を返す
     240
     241  MAX_NEST_LEVEL = 64    # 簡易のループ検出(参照のネストを 64 まで許可する)
    262242  def elements_eval_const( elements, name_list, name_list2 = nil, nest = nil )
    263243
     
    266246      nsp = elements[1]
    267247
    268       # #809 の修正しかけ (別の問題が解決しきれていない)
    269       # nest += 1     # 参ç
    270 §ãŒãƒ«ãƒ¼ãƒ—になっていないかのチェック
    271       #               # mikan 本当にループしているかどうかではなく、単純に多数の参ç
    272 §ã‚’繰り返していることで判定している
     248      # #809 の修正しかけ (別の問題が解決しきれていない)
     249      # nest += 1     # 参照がループになっていないかのチェック
     250      #               # mikan 本当にループしているかどうかではなく、単純に多数の参照を繰り返していることで判定している
    273251      # if nest > MAX_NEST_LEVEL then
    274252      #   cdl_error( "E9999: '$1' too many reference (maybe loop) max=$1" , nsp.to_s, MAX_NEST_LEVEL )
     
    285263      end
    286264
    287       # 見つからなければ定数定義から探す
     265      # 見つからなければ定数定義から探す
    288266      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 は見つからなかった?
    300277      if object == nil then
    301278        cdl_error( "E1001 $1: not found" , nsp.get_path_str )
     
    303280        return nil
    304281      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) でない?
    307284        if ! object.get_definition.instance_of?( Decl ) then
    308285          cdl_error( "E1002 $1: not constant (port)" , nsp.get_path_str )
     
    311288        return object.get_rhs.eval_const2( name_list, name_list2, nest )
    312289      elsif ! object.instance_of?( Decl ) then
    313         # Decl でない場合: 定数でもない
     290        # Decl でない場合: 定数でもない
    314291        if ( ! object.instance_of?( ParamDecl ) ) then
    315                                                       # mikan paramdecl は無視する
    316                                                       # ParamList から呼ばれたとき
     292                                                      # mikan paramdecl は無視する
     293                                                      # ParamList から呼ばれたとき
    317294          cdl_error( "E1003 $1: not constant" , nsp.get_path_str )
    318295        else
     
    324301        object.referenced
    325302        if object.get_initializer == nil then
    326           # 初期化子の存在しない変数   # mikan ここへくるのは、通常ありえないはず(未検証)
     303          # 初期化子の存在しない変数   # mikan ここへくるのは、通常ありえないはず(未検証)
    327304          return IntegerVal.new( 0 )
    328305        else
    329           # Decl の右辺の評価
    330           # mikan size_is 引数に現れる変数の型が適切かのチェックする
     306          # Decl の右辺の評価
     307          # mikan size_is 引数に現れる変数の型が適切かのチェックする
    331308          if object.get_initializer.instance_of?( Expression ) || object.get_initializer.instance_of?( C_EXP ) then
    332309            return object.get_initializer.eval_const2( name_list, name_list2, nest )
    333310          else
    334             # Array の場合
     311            # Array の場合
    335312            return object.get_initializer
    336313          end
     
    440417# p "val.respond_to?( \"-@\" )=#{val.respond_to?( "-@" )} #{val.class}"
    441418# 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 版では例外が発生してしまう
    443420      if val.kind_of? IntegerVal then
    444421        return ~ val
     
    586563  def elements_get_type( elements, namedList )
    587564    type = elements_get_type_sub( elements, namedList )
    588     # 返された方が DefinedType の場合 å
    589 ƒã®åž‹ã‚’返す
     565    # 返された方が DefinedType の場合 元の型を返す
    590566    if type.kind_of?( DefinedType ) then
    591567      type = type.get_type
     
    626602      unless type.kind_of?( PtrType ) then
    627603        cdl_error( "E1013 \'*\': operand is not pointer value"  )
    628         return IntType.new( 8 )    # IntType を返しておく
     604        return IntType.new( 8 )    # IntType を返しておく
    629605      end
    630606      return type.get_referto
    631607
    632608    when :OP_U_PLUS, :OP_U_MINUS
    633       # mikan operand が適切な型かチェックしていない
     609      # mikan operand が適切な型かチェックしていない
    634610      return elements_get_type( elements[1], namedList )
    635611
    636612    when :OP_ADD, :OP_SUB, :OP_MULT, :OP_DIV, :OP_REMAIN
    637       # mikan operand が適切な型かチェックしていない&左辺の型を採用している
     613      # mikan operand が適切な型かチェックしていない&左辺の型を採用している
    638614      return elements_get_type( elements[1], namedList )
    639615
    640616    when :OP_U_TILDE
    641       # mikan operand が整数かチェックしていない
     617      # mikan operand が整数かチェックしていない
    642618      return elements_get_type( elements[1], namedList )
    643619    when :OP_AND, :OP_EOR, :OP_OR, :OP_LSFT, :OP_RSFT
    644       # mikan operand が整数かチェックしていない
     620      # mikan operand が整数かチェックしていない
    645621      return BoolType.new
    646622    when :OP_U_EXCLAM
    647       # mikan operand が整数かチェックしていない
     623      # mikan operand が整数かチェックしていない
    648624      return BoolType.new
    649625
     
    655631  end
    656632
    657   # 式が size_is, count_is, string の引数である場合の方向のチェック
     633  # 式が size_is, count_is, string の引数である場合の方向のチェック
    658634  def elements_check_dir_for_param( elements, namedList, dir, spec )
    659    # dir : å
    660 ƒã®å¼•æ•°ã®æ–¹å‘
    661    # direct: size_is などの引数の変数の方向
     635   # dir : 元の引数の方向
     636   # direct: size_is などの引数の変数の方向
    662637
    663638    case elements[0]
     
    690665          judge = true if ( direct == :IN || direct == :INOUT )
    691666          req_direct = "in or inout"
    692         when :OUT, :RECEIVE     # mikan out で count_is のみ指定されている場合 in でなくてはならない
     667        when :OUT, :RECEIVE     # mikan out で count_is のみ指定されている場合 in でなくてはならない
    693668          judge = true if ( direct == :OUT || direct == :INOUT )
    694669          req_direct = "out or inout"
     
    706681      return true
    707682
    708     # 単é 
    709 æ¼”算子
     683    # 単項演算子
    710684    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,
    711685      elements_check_dir_for_param( elements[1], namedList, dir, spec )
    712686
    713     # 2é 
    714 æ¼”算子
     687    # 2項演算子
    715688    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
    716689      return elements_check_dir_for_param( elements[1], namedList, dir, spec ) && elements_check_dir_for_param( elements[2], namedList, dir, spec )
    717690
    718     # 3é 
    719 æ¼”算子
     691    # 3項演算子
    720692    when :OP_CEX
    721693      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 )
     
    729701  #Express# get_allocator_rhs_elem
    730702  #alloc_type::Symbol  :NORMAL_ALLOC|:INTERNAL_ALLOC|:RELAY_ALLOC
    731   #式がアロケータ指定子の右辺として妥当かチェックし、正しければ分解した値を返す
     703  #式がアロケータ指定子の右辺として妥当かチェックし、正しければ分解した値を返す
    732704  #return:
    733705  #  :NORMAL_ALLOC      [ cell_nsp, ep_name ]               # rhs = cell_nsp.ep_name    ex) Alloc.eAlloc
     
    767739  end
    768740
    769   #Expression#Expression のクローンを作成する
     741  #Expression#Expression のクローンを作成する
    770742  def clone_for_composite
    771743    cl = self.clone
     
    775747  end
    776748
    777   #Expression#elements のクローンを作成
     749  #Expression#elements のクローンを作成
    778750  #elements::Array
    779   # このメソッドは、Array のディープコピーを行う
     751  # このメソッドは、Array のディープコピーを行う
    780752  def clone_elements elements
    781753    elements = elements.clone
     
    794766  end
    795767
    796   #=== Expression#セル結合の式を解析する
     768  #=== Expression#セル結合の式を解析する
    797769  # Cell.eEntry  => [ :OP_DOT, [ :IDENTIFIER, token ], token ]
    798770  # Cell.eEntry[expression] => [ :OP_SUBSC, [ :OP_DOT, [ :IDENTIFIER, token ], token ], expression ]
    799771  # Return: [ NamespacePath(cell_name), Integer(subscript) or nil, Token(port_name)]
    800772  def analyze_cell_join_expression
    801     # 右辺の Expression の要素を取り出す
     773    # 右辺の Expression の要素を取り出す
    802774    elements = @elements
    803     if elements[0] == :OP_SUBSC then  # 右辺:受け口é
    804 åˆ—?
     775    if elements[0] == :OP_SUBSC then  # 右辺:受け口配列?
    805776      # 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 配列だった場合
    810779    else
    811780      subscript = nil
     
    823792  end
    824793
    825   #=== Expression# セルへの結合の式を生成する
     794  #=== Expression# セルへの結合の式を生成する
    826795  #nsp:: NamespacePath
    827796  #subscript:: Integer
    828797  #port_name:: Symbol
    829   # analyze_cell_join_expression と対になっている
     798  # analyze_cell_join_expression と対になっている
    830799  def self.create_cell_join_expression( nsp, subscript, port_name, locale = nil )
    831800    if ! port_name.instance_of?( Symbol ) then
     
    843812  end
    844813
    845   #=== Expression#整数定数の式を生成する
    846   #val:: Integer : 値: 整数
     814  #=== Expression#整数定数の式を生成する
     815  #val:: Integer : 値: 整数
    847816  def self.create_integer_constant( val, locale = nil )
    848817    if val != Integer( val ) || val < 0 then
     
    852821  end
    853822
    854   #=== Expression#単一の識別子の式を解析する
     823  #=== Expression#単一の識別子の式を解析する
    855824  # Identifier  => [ :IDENTIFIER, token ]
    856825  # Return: NamespacePath(Identifier)
    857826  def analyze_single_identifier
    858     # 右辺の Expression の要素を取り出す
     827    # 右辺の Expression の要素を取り出す
    859828    elements = @elements
    860829    if elements[0] == :IDENTIFIER
     
    866835
    867836  #=== Expression#
    868   #nsp:: NamespacePath :  参ç
    869 §ã™ã‚‹ã‚‚の識別子
     837  #nsp:: NamespacePath :  参照するもの識別子
    870838  def self.create_single_identifier( nsp, locale )
    871839    if ! nsp.instance_of?( NamespacePath ) then
     
    875843  end
    876844
    877   #=== 評価可能かチェックする
    878   #*v:: 可変個引数(任意の型)
    879   # すべてが BaseVal の子クラス(値)であれば、評価可能と判断する
     845  #=== 評価可能かチェックする
     846  #*v:: 可変個引数(任意の型)
     847  # すべてが BaseVal の子クラス(値)であれば、評価可能と判断する
    880848  def evaluable?( *v )
    881849    v.each{ |val|
     
    896864
    897865  #c_exp_string::String
    898   #b_renew::Bool  : true なら C_EXP の clone 作成(エスケープ処理等をしない)
     866  #b_renew::Bool  : true なら C_EXP の clone 作成(エスケープ処理等をしない)
    899867  def initialize( c_exp_string, b_renew = false )
    900868    if b_renew then
    901869      @c_exp_string = c_exp_string
    902870    else
    903       # 前後の " を取り除く
     871      # 前後の " を取り除く
    904872      # str = c_exp_string.to_s.sub( /^\"(.*)\"$/, "\\1" )
    905873      str = CDLString.remove_dquote c_exp_string.to_s
     
    908876  end
    909877
    910   #=== composite 用に C_EXP を clone する
     878  #=== composite 用に C_EXP を clone する
    911879  #ct_name::
    912880  #cell_name::
    913   # composite の attribute に現れる C_EXP を文字列置換して生成しなおす.
    914   # この文字列置換は、意味解釈段階で行う.
    915   # 他の C_EXP の文字列置換は、コード生成段階で行う.
     881  # composite の attribute に現れる C_EXP を文字列置換して生成しなおす.
     882  # この文字列置換は、意味解釈段階で行う.
     883  # 他の C_EXP の文字列置換は、コード生成段階で行う.
    916884  def clone_for_composite( ct_name, cell_name, locale )
    917885    dbgPrint "C_EXP: #{ct_name} #{cell_name} #{@c_exp_string}\n"
     
    928896  end
    929897
    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 で対応
    933901  def eval_const( name_list, name_list2 = nil )
    934902     return self
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/gen_xml.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: gen_xml.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
     
    8065
    8166  def gen_XML( file, nest )
    82     # signature のコードを生成
     67    # signature のコードを生成
    8368    @signature_list.each { |s|
    8469      s.gen_XML file, nest
    8570    }
    8671
    87     # celltype のコードを生成
     72    # celltype のコードを生成
    8873    @celltype_list.each { |t|
    8974      t.gen_XML( file, nest )
    9075    }
    9176
    92     # composite のコードを生成
     77    # composite のコードを生成
    9378    @compositecelltype_list.each { |t|
    9479      t.gen_XML( file, nest )
    9580    }
    9681
    97     # cell のコードを生成
     82    # cell のコードを生成
    9883    @cell_list.each { |t|
    9984      t.gen_XML( file, nest )
    10085    }
    10186
    102     # サブネームスペースのコードを生成
     87    # サブネームスペースのコードを生成
    10388    @namespace_list.each { |n|
    10489      kind = n.instance_of?( Namespace ) ? "namespace" : "region"
     
    250235
    251236#
    252 # Celltype とå
    253 ±ç”¨å¯èƒ½ãªã¯ãšã ãŒã€ä»¥ä¸‹ã®ç‚¹ã®å¤‰æ›´ãŒå¿
    254 è¦
    255 #  @active ⇒ @b_active
    256 #  @singleton ⇒ @b_singleton
    257 #  @attribute ⇒ @name_list (Decl)
    258 #  @port ⇒ @name_list (Port)
     237# Celltype と共用可能なはずだが、以下の点の変更が必要
     238#  @active ⇒ @b_active
     239#  @singleton ⇒ @b_singleton
     240#  @attribute ⇒ @name_list (Decl)
     241#  @port ⇒ @name_list (Port)
    259242class CompositeCelltype
    260243  def gen_XML file, nest
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/generate.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2016 by TOPPERS Project
    77#--
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: generate.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
     
    134119end
    135120
    136 # celltype_private.h を生成
     121# celltype_private.h を生成
    137122
    138123class Namespace
     
    140125
    141126    begin
    142       # root namespace ならば makefile を出力する(å
    143 ¨ã‚»ãƒ«ã‚¿ã‚¤ãƒ—に関わるものだけ)
    144       # å
    145 ˆã«å‡ºåŠ›ã™ã‚‹
     127      # root namespace ならば makefile を出力する(全セルタイプに関わるものだけ)
     128      # 先に出力する
    146129      if @name == "::" then
    147130
     
    155138
    156139      dbgPrint "generating region: #{$generating_region.get_name} namespace=#{@name} gen_dir=#{$gen}\n"
    157       # global_tecsgen.h (typedef, struct, const) の生成
     140      # global_tecsgen.h (typedef, struct, const) の生成
    158141      gen_global_header
    159142
    160       # signature のコードを生成
     143      # signature のコードを生成
    161144      @signature_list.each { |s|
    162145        s.generate
    163146      }
    164147
    165       # celltype のコードを生成
     148      # celltype のコードを生成
    166149      @celltype_list.each { |t|
    167150        t.generate
    168151      }
    169152
    170       # サブネームスペースのコードを生成
     153      # サブネームスペースのコードを生成
    171154      @namespace_list.each { |n|
    172155        n.generate
     
    174157
    175158    rescue => evar
    176       # もしスタックトレースが出るまでい時間がかかるようならば、次をコメントアウトしてみるべし
     159      # もしスタックトレースが出るまでい時間がかかるようならば、次をコメントアウトしてみるべし
    177160      cdl_error( "H1001 tecsgen: fatal internal error during code generation"  )
    178161      print_exception( evar )
     
    187170
    188171    begin
    189       # global_tecsgen.h (typedef, struct, const) の終わりのガードコード生成
     172      # global_tecsgen.h (typedef, struct, const) の終わりのガードコード生成
    190173      gen_global_header_post
    191174
    192       # signature のコードを生成
     175      # signature のコードを生成
    193176      @signature_list.each { |s|
    194177        s.generate_post
    195178      }
    196179
    197       # celltype のコードを生成
     180      # celltype のコードを生成
    198181      @celltype_list.each { |t|
    199182        t.generate_post
    200183      }
    201184
    202       # サブネームスペースのコードを生成
     185      # サブネームスペースのコードを生成
    203186      @namespace_list.each { |n|
    204187        n.generate_post
     
    214197  def gen_global_header
    215198
    216     # global_tecs.h の生成
     199    # global_tecs.h の生成
    217200    f = AppFile.open( "#{$gen}/global_tecsgen.#{$h_suffix}" )
    218201
     
    220203      print_note f
    221204
    222       # ガードコードを出力
     205      # ガードコードを出力
    223206      f.print <<EOT
    224207#ifndef GLOBAL_TECSGEN_H
     
    227210EOT
    228211
    229       # import_C で指定されたヘッダファイルの #include を出力
     212      # import_C で指定されたヘッダファイルの #include を出力
    230213      if Import_C.get_header_list2.length > 0 then
    231         # ヘッダ include の出力
     214        # ヘッダ include の出力
    232215        f.printf TECSMsg.get( :IMP_comment ), "#_IMP_#"
    233216        Import_C.get_header_list2.each{ |h|
     
    240223    end
    241224
    242     # typedef, struct, enum を生成
     225    # typedef, struct, enum を生成
    243226    @decl_list.each { |d|
    244227
    245       # d は Typedef, StructType, EnumType のいずれか
     228      # d は Typedef, StructType, EnumType のいずれか
    246229      if d.instance_of?( Typedef ) then
    247230
    248         # Typedef の場合、declarator の @type が CType でないか
     231        # Typedef の場合、declarator の @type が CType でないか
    249232        if ! d.get_declarator.get_type.kind_of?( CType ) then
    250233          d.gen_gh f
     
    252235      elsif ! d.kind_of?( CType ) then
    253236
    254         # CType ではない (StructType または EnumType)
     237        # CType ではない (StructType または EnumType)
    255238        d.gen_gh f
    256239#     else
    257 #       ã“こに該当するのは CStructType, CEnumType
     240#       ここに該当するのは CStructType, CEnumType
    258241      end
    259242    }
     
    283266    end
    284267
    285     # const を生成  mikan
     268    # const を生成  mikan
    286269    @const_decl_list.each { |d|
    287270      f.printf( "#define %-14s ((%s%s)%s)\n", d.get_global_name,
     
    296279  def gen_global_header_post
    297280
    298     # global_tecs.h を開く
     281    # global_tecs.h を開く
    299282    f = AppFile.open( "#{$gen}/global_tecsgen.#{$h_suffix}" )
    300283
     
    310293  end
    311294
    312   #=== Makefile.tecsgen, Makefile.templ の出力
    313   # å
    314 ¨ã‚»ãƒ«ã‚¿ã‚¤ãƒ—名を出力する部分を出力
    315   #    (本メソッドは root namespace に対して呼出す)
    316   #     å€‹ã€
    317 ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—のメークルールは Celltype クラスで出力
     295  #=== Makefile.tecsgen, Makefile.templ の出力
     296  # 全セルタイプ名を出力する部分を出力
     297  #    (本メソッドは root namespace に対して呼出す)
     298  #     個々のセルタイプのメークルールは Celltype クラスで出力
    318299  def gen_makefile
    319300    gen_makefile_template
     
    325306    return if $generate_no_template
    326307
    327     ### Makefile.templ の生成
     308    ### Makefile.templ の生成
    328309    f = AppFile.open( "#{$gen}/Makefile.templ" )
    329310
    330311    print_Makefile_note f
    331312
    332     # Makefile の変数の出力
     313    # Makefile の変数の出力
    333314    f.printf TECSMsg.get( :MVAR_comment ), "#_MVAR_#"
    334315    f.printf "# fixed variable (unchangeable by config or plugin)\n"
    335316
    336     # TARGET の出力 (第一引数 $target に region 名および .exe を付加)
     317    # TARGET の出力 (第一引数 $target に region 名および .exe を付加)
    337318    target = $target
    338319    if $generating_region != @@root_namespace then
    339       # 子 region のリンクターゲットの場合
     320      # 子 region のリンクターゲットの場合
    340321      target += "-#{$generating_region.get_global_name}"
    341322    end
     
    419400EOT
    420401
    421     # make ルールの出力
     402    # make ルールの出力
    422403    f.printf( TECSMsg.get( :MRUL_comment), "#_MRUL_#" )
    423404
     
    447428    f.print "-include $(GEN_DIR)/Makefile.tecsgen\n"
    448429    if $generating_region.get_n_cells != 0 then
    449       # Makefile.depend の include
     430      # Makefile.depend include
    450431      f.print "-include $(GEN_DIR)/Makefile.depend\n\n"
    451432
     
    457438      f.print "\nsub_regions:$(TIMESTAMP)\n"
    458439      Region.get_link_roots.each {|region|
    459         if region.get_global_name != "" then  # Root region: この Makefile 自身
     440        if region.get_global_name != "" then  # Root region: この Makefile 自身
    460441          f.print "\tcd #{region.get_global_name}; make all\n"
    461442        end
     
    464445    end
    465446
    466     # clean: ターゲット
     447    # clean: ターゲット
    467448    f.print "clean :\n"
    468449    if $generating_region == @@root_namespace then
    469450      Region.get_link_roots.each {|region|
    470         if region.get_global_name != "" then  # Root region: この Makefile 自身
     451        if region.get_global_name != "" then  # Root region: この Makefile 自身
    471452          f.print "\tcd #{region.get_global_name}; make clean\n"
    472453        end
     
    479460    f.print "\n"
    480461
    481     # tecs: ターゲット
     462    # tecs: ターゲット
    482463    if $generating_region == @@root_namespace then
    483464      f.print "tecs : $(PRE_TECSGEN_TARGET) $(TIMESTAMP) $(POST_TECSGEN_TARGET)\n\n"
     
    508489
    509490  def gen_makefile_tecsgen
    510     ### Makefile.tecsgen の生成
     491    ### Makefile.tecsgen の生成
    511492    f = AppFile.open( "#{$gen}/Makefile.tecsgen" )
    512493
     
    563544    domain_regions = nil
    564545    DomainType.get_domain_regions.each{ |dt, regions|
    565       # domain_type は一つのノードには、一つしかないので、このループは、å¿
    566 ãšä¸€å›žã—か回らない
     546      # domain_type は一つのノードには、一つしかないので、このループは、必ず一回しか回らない
    567547      domain_regions = regions
    568548      domain_type = dt
     
    687667  end
    688668
    689   #=== すべてのセルタイプの名前を出力
    690   #f::       FILE:   å‡ºåŠ›å
    691 ˆãƒ•ã‚¡ã‚¤ãƒ«
    692   #prepend:: string: 前置文字列
    693   #append::  string: 後置文字列
    694   #b_plguin::  bool:   plugin により生成されたセルタイプを出力
    695   ##b_inline_only::  bool:   true ならば inline の entry port のみのセルタイプを含める
    696   #b_inline_only_or_proc::  bool|Proc:   true ならば inline の entry port のみ、かつインアクティブなセルタイプを含める
    697   #                                      Proc ならば Proc を実行した結果 true ならば含める
    698   #  namespace "::" から呼出される
     669  #=== すべてのセルタイプの名前を出力
     670  #f::       FILE:   出力先ファイル
     671  #prepend:: string: 前置文字列
     672  #append::  string: 後置文字列
     673  #b_plguin::  bool:   plugin により生成されたセルタイプを出力
     674  ##b_inline_only::  bool:   true ならば inline の entry port のみのセルタイプを含める
     675  #b_inline_only_or_proc::  bool|Proc:   true ならば inline の entry port のみ、かつインアクティブなセルタイプを含める
     676  #                                      Proc ならば Proc を実行した結果 true ならば含める
     677  #  namespace "::" から呼出される
    699678  def gen_celltype_names( f, prepend, append, b_plugin, b_inline_only_or_proc = true )
    700679    dbgPrint "gen_celltype_names #{@name}\n"
     
    716695  end
    717696
    718   #=== すべてのセルタイプの名前を出力
     697  #=== すべてのセルタイプの名前を出力
    719698  #region:: Region:
    720   # gen_celltype_names とgen_celltype_names_domain の相違:
    721   #   region を domain_roots に含む場合、出力する.
    722   #   ã¾ãŸã¯ã€region を含まないが、domain_roots が複数かつルートリージョンの場合、出力する.
    723   # それ以外は、gen_celltype_names の説明を参ç
    724 §
     699  # gen_celltype_names とgen_celltype_names_domain の相違:
     700  #   region を domain_roots に含む場合、出力する.
     701  #   または、region を含まないが、domain_roots が複数かつルートリージョンの場合、出力する.
     702  # それ以外は、gen_celltype_names の説明を参照
    725703  def gen_celltype_names_domain( f, prepend, append, domain_type, region, b_plugin, b_inline_only = true )
    726704    dbgPrint "gen_celltype_names #{@name}\n"
     
    752730    }
    753731  end
    754   #== Namespace#すべてのセルタイプの名前を出力
    755   # セルタイプコードのための名前出力
    756   # gen_celltype_names_domain と gen_celltype_names_domain2 の相違
    757   # ・どれか一つのリージョンにしか出さない
    758   #     domain_roots が1つだけで、指定リージョンを含む
    759   #     domain_roots が2つ以上で、指定リージョンがルートリージョン
    760   # ・ドメイン名を付加しない
     732  #== Namespace#すべてのセルタイプの名前を出力
     733  # セルタイプコードのための名前出力
     734  # gen_celltype_names_domain と gen_celltype_names_domain2 の相違
     735  # ・どれか一つのリージョンにしか出さない
     736  #     domain_roots が1つだけで、指定リージョンを含む
     737  #     domain_roots が2つ以上で、指定リージョンがルートリージョン
     738  # ・ドメイン名を付加しない
    761739  def gen_celltype_names_domain2( f, prepend, append, domain_type, region, b_plugin, b_inline_only = true )
    762740    dbgPrint "gen_celltype_names #{@name}\n"
     
    885863  def gen_sh_func_tab f
    886864
    887     # シグニチャディスクリプタの出力
     865    # シグニチャディスクリプタの出力
    888866    f.printf TECSMsg.get(:SD_comment), "#_SD_#"
    889867    f.print "struct tag_#{@global_name}_VDES {\n"
     
    891869    f.print "};\n\n"
    892870
    893     # シグニチャ関数テーブルの出力
     871    # シグニチャ関数テーブルの出力
    894872    f.printf TECSMsg.get(:SFT_comment), "#_SFT_#"
    895873    f.print( "struct tag_#{@global_name}_VMT {\n" )
     
    906884        len = items.length
    907885      else
    908         # ここで nil になるのは、引数なしの時に void がなかった場合
     886        # ここで nil になるのは、引数なしの時に void がなかった場合
    909887        items = []
    910888        len = 0
     
    932910  end
    933911
    934   #=== Signature# 関数の ID の define を出力
     912  #=== Signature# 関数の ID の define を出力
    935913  def gen_sh_func_id f
    936914    f.print "/* function id */\n"
     
    951929  def generate
    952930
    953     if need_generate?    # セルのないセルタイプは生成しない
     931    if need_generate?    # セルのないセルタイプは生成しない
    954932
    955933      generate_private_header
     
    962940      generate_makefile
    963941
    964     elsif $generate_all_template   # テンプレートコード生成オプション
     942    elsif $generate_all_template   # テンプレートコード生成オプション
    965943
    966944      generate_template_code
    967945      generate_inline_template_code
    968946
    969       # generate_makefile_template は Makefile に追記するものだから、呼び出さない
     947      # generate_makefile_template は Makefile に追記するものだから、呼び出さない
    970948
    971949    end
     
    974952
    975953  def generate_post
    976     return if ! need_generate?    # セルのないセルタイプは生成しない
     954    return if ! need_generate?    # セルのないセルタイプは生成しない
    977955
    978956    generate_private_header_post
     
    994972    gen_ph_cell_cb_type f
    995973    gen_ph_INIB_as_CB f
    996     gen_ph_extern_cell f          # セルタイプグルコード以外は参ç
    997 §ã—ない
    998     gen_ph_typedef_idx f          # mikan 参ç
    999 §ã™ã‚‹ã‚‚のができていない
     974    gen_ph_extern_cell f          # セルタイプグルコード以外は参照しない
     975    gen_ph_typedef_idx f          # mikan 参照するものができていない
    1000976    gen_ph_ep_fun_prototype f
    1001977    end_extern_C f
     
    1005981
    1006982    if @n_entry_port_inline == 0 then
    1007       # inline がなければ CB_TYPE_ONLY とする
    1008       # inline ありの場合、いったん define しておいて、後ですべて undef する
     983      # inline がなければ CB_TYPE_ONLY とする
     984      # inline ありの場合、いったん define しておいて、後ですべて undef する
    1009985      ifndef_cb_type_only f
    1010986    end
     
    10281004#    gen_ph_cell_cb_type f
    10291005#    gen_ph_INIB_as_CB f
    1030 #    gen_ph_extern_cell f          # セルタイプグルコード以外は参ç
    1031 §ã—ない
    1032     # gen_ph_typedef_idx f          # mikan 参ç
    1033 §ã™ã‚‹ã‚‚のができていない
     1006#    gen_ph_extern_cell f          # セルタイプグルコード以外は参照しない
     1007    # gen_ph_typedef_idx f          # mikan 参照するものができていない
    10341008#    gen_ph_ep_fun_prototype f
    10351009    gen_ph_ep_skel_prototype f
     
    10371011    endif_macro_only f
    10381012
    1039     # 短縮形などのマクロ出力
     1013    # 短縮形などのマクロ出力
    10401014    if @n_entry_port_inline == 0 then
    10411015      ifndef_cb_type_only f
     
    10471021    gen_ph_test_optional_call_port_abbrev f
    10481022    gen_ph_ep_fun_macro f         if @n_entry_port > 0
    1049     gen_ph_foreach_cell f         # FOREACH マクロの出力
    1050     gen_ph_cb_initialize_macro f   # CB 初期化マクロの出力.消費しないので ram_initializer フラグに関わらず出力
     1023    gen_ph_foreach_cell f         # FOREACH マクロの出力
     1024    gen_ph_cb_initialize_macro f   # CB 初期化マクロの出力.消費しないので ram_initializer フラグに関わらず出力
    10511025    gen_ph_dealloc_code f, ""
    10521026    gen_ph_dealloc_code f, "_RESET"
     
    10951069        next if p.get_port_type != :CALL
    10961070
    1097         # is_...joined は omit するケースでも出力されるため、omit を検査する前に出力
     1071        # is_...joined は omit するケースでも出力されるため、omit を検査する前に出力
    10981072        if p.is_optional? then
    10991073          f.print( "#undef is_#{p.get_name}_joined\n" )
     
    11301104  end
    11311105
    1132   #=== CELLTYPE_tecsgen.c を生成
     1106  #=== CELLTYPE_tecsgen.c を生成
    11331107  def generate_cell_code
    11341108    fs = { }
     
    11651139    end
    11661140
    1167     # すべての _tecsgen.c に出力
     1141    # すべての _tecsgen.c に出力
    11681142    print_note f
    11691143    gen_cell_private_header f
     
    11711145    gen_cell_ep_des_type f
    11721146
    1173     # すべての _tecsgen.c に出力
     1147    # すべての _tecsgen.c に出力
    11741148    fs.each{ |r,f2|
    11751149      if f == f2 then
     
    11821156    }
    11831157
    1184     # 一つの _tecsgen.c に出力
     1158    # 一つの _tecsgen.c に出力
    11851159    gen_cell_skel_fun f
    11861160    gen_cell_fun_table f
    11871161    gen_cell_var_init f
    11881162
    1189     # セルごとに _tecsgen.c に出力
     1163    # セルごとに _tecsgen.c に出力
    11901164    gen_cell_ep_vdes fs
    11911165    gen_cell_ep_vdes_array fs
    1192     gen_cell_cb_out_init fs         # INITIALIZE_CB で参ç
    1193 §ã•ã‚Œã‚‹ãŸã‚ ram_initializer=false でも消せない
     1166    gen_cell_cb_out_init fs         # INITIALIZE_CB で参照されるため ram_initializer=false でも消せない
    11941167    gen_cell_cb fs
    11951168    gen_cell_extern_mt fs
    11961169    gen_cell_ep_des fs
    11971170
    1198     # 一つの _tecsgen.c に出力
     1171    # 一つの _tecsgen.c に出力
    11991172    gen_cell_cb_tab f
    12001173    if $ram_initializer then
     
    12511224
    12521225  def gen_ph_include f
    1253     # ランタイムヘッダの include
     1226    # ランタイムヘッダの include
    12541227#    f.printf TECSMsg.get( :IRTH_comment), "#_IRTH_#"
    12551228#    f.print "#include \"tecs.#{$h_suffix}\"\n\n"
    12561229
    1257     # グローバルヘッダの include
     1230    # グローバルヘッダの include
    12581231    f.printf TECSMsg.get( :IGH_comment ), "#_IGH_#"
    12591232    f.print "#include \"global_tecsgen.#{$h_suffix}\"\n\n"
    12601233
    1261     # シグニチャヘッダの include
     1234    # シグニチャヘッダの include
    12621235    f.printf TECSMsg.get( :ISH_comment ), "#_ISH_#"
    12631236    @port.each { |p|
     
    12771250    end
    12781251
    1279     # 最適化のため参ç
    1280 §ã™ã‚‹ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の CB 型の定義を取込む
    1281     # _CB_TYPE_ONLY を定義した上で include する
     1252    # 最適化のため参照するセルタイプの CB 型の定義を取込む
     1253    # _CB_TYPE_ONLY を定義した上で include する
    12821254    f.printf( TECSMsg.get( :ICT_comment ), "#_ICT_#" )
    12831255
     
    12921264
    12931265      if p.is_skelton_useless? || p.is_cell_unique? || p.is_VMT_useless? then
    1294         # 最適化コード (optimize) # スケルトン不要など
     1266        # 最適化コード (optimize) # スケルトン不要など
    12951267        p2 = p.get_real_callee_port
    12961268        if p2 then
     
    13011273          end
    13021274        # else
    1303           # optional で未結合
     1275          # optional で未結合
    13041276        end
    13051277      end
     
    13131285#      next if p.get_port_type != :CALL
    13141286#      if p.is_skelton_useless? || p.is_cell_unique? || p.is_VMT_useless? then
    1315 #        # 最適化コード (optimize) # スケルトン不要など
     1287#        # 最適化コード (optimize) # スケルトン不要など
    13161288#        p2 = p.get_real_callee_port
    13171289#        ct = p2.get_celltype
     
    13291301    return if @singleton
    13301302
    1331     # ID の基数および個数の define を出力
     1303    # ID の基数および個数の define を出力
    13321304    f.printf("#define %-20s %10s  /* %s #_NIDB_# */\n", "#{@global_name}_ID_BASE", "(#{@id_base})", TECSMsg.get(:NIDB_comment))
    13331305    f.printf("#define %-20s %10s  /* %s  #_NCEL_# */\n\n", "#{@global_name}_N_CELL", "(#{@n_cell_gen})", TECSMsg.get(:NCEL_comment))
     
    13371309    return if @singleton
    13381310
    1339     # mikan  最適化
    1340     # IDX 正当性チェックマクロの出力
     1311    # mikan  最適化
     1312    # IDX 正当性チェックマクロの出力
    13411313    f.printf( TECSMsg.get( :CVI_comment ), "#_CVI_#" )
    13421314    if @idx_is_id_act then
     
    13511323    return if @singleton
    13521324
    1353     # IDX 正当性チェックマクロ(短縮形)の出力
     1325    # IDX 正当性チェックマクロ(短縮形)の出力
    13541326    f.printf( TECSMsg.get( :CVIA_comment ), "#_CVIA_#")
    13551327    f.print("#define VALID_IDX(IDX)  #{@global_name}_VALID_IDX(IDX)\n\n")
     
    13571329  end
    13581330
    1359   #=== 呼び口é
    1360 åˆ—の大きさを得るマクロの出力
     1331  #=== 呼び口配列の大きさを得るマクロの出力
    13611332  #
    1362   #セルタイプヘッダへ呼び口の個数を出力
     1333  #セルタイプヘッダへ呼び口の個数を出力
    13631334  def gen_ph_n_cp f
    13641335
     
    13741345      end
    13751346
    1376       if p.get_array_size != "[]" then       # 固定長é
    1377 åˆ—
     1347      if p.get_array_size != "[]" then       # 固定長配列
    13781348        f.print( "#define N_CP_#{p.get_name}    (#{p.get_array_size})\n" )
    13791349        f.print( "#define NCP_#{p.get_name}     (#{p.get_array_size})\n" )
    1380       else                                   # 可変長é
    1381 åˆ—
     1350      else                                   # 可変長配列
    13821351        if @singleton then
    13831352          if has_INIB? then
     
    13881357          f.print( "#define N_CP_#{p.get_name}  (#{@global_name}_SINGLE_CELL_#{inib}.n_#{p.get_name})\n" )
    13891358          f.print( "#define NCP_#{p.get_name}   (#{@global_name}_SINGLE_CELL_#{inib}.n_#{p.get_name})\n" )
    1390           # mikan singleton ならば、固定長化できる
     1359          # mikan singleton ならば、固定長化できる
    13911360        else
    13921361          if has_CB? && has_INIB? then
     
    14021371  end
    14031372
    1404   #=== 受け口é
    1405 åˆ—の大きさを得るマクロの出力
     1373  #=== 受け口配列の大きさを得るマクロの出力
    14061374  #
    1407   #セルタイプヘッダへ受け口の個数を出力
     1375  #セルタイプヘッダへ受け口の個数を出力
    14081376  def gen_ph_n_ep f
    14091377
     
    14111379    @port.each { |p|
    14121380      next if p.get_port_type != :ENTRY
    1413       # next if p.is_omit?                       # 受け口é
    1414 åˆ—の個数は省略しない
     1381      # next if p.is_omit?                       # 受け口配列の個数は省略しない
    14151382      next if p.get_array_size == nil
    14161383
     
    14201387      end
    14211388
    1422       if p.get_array_size != "[]" then       # 固定長é
    1423 åˆ—
     1389      if p.get_array_size != "[]" then       # 固定長配列
    14241390        f.print( "#define NEP_#{p.get_name}     (#{p.get_array_size})\n" )
    1425       else                                   # 可変長é
    1426 åˆ—
     1391      else                                   # 可変長配列
    14271392        if @singleton then
    14281393          if has_INIB? then
     
    14321397          end
    14331398          f.print( "#define NEP_#{p.get_name}   (#{@global_name}_SINGLE_CELL_#{inib}.n_#{p.get_name})\n" )
    1434           # mikan singleton ならば、固定長化できる
     1399          # mikan singleton ならば、固定長化できる
    14351400        else
    14361401          if has_CB? && has_INIB? then
     
    14451410  end
    14461411
    1447   #=== optional な呼び口が結合されているかテストするコードの生成
     1412  #=== optional な呼び口が結合されているかテストするコードの生成
    14481413  def gen_ph_test_optional_call_port f
    14491414    b_comment = false
     
    14661431      next if p.get_port_type != :CALL
    14671432      next if ! p.is_optional?
    1468       # next if p.is_omit?  # omit でも test コードは生成する
     1433      # next if p.is_omit?  # omit でも test コードは生成する
    14691434
    14701435      if b_comment == false then
     
    14841449      end
    14851450
    1486       # 関数名の出力(標準:受け口ディスクリプタから VMT の関数名、最適化:受け口関数 or 受け口ディスクリプタ)
    1487       # mikan  å
    1488 ¨éƒ¨ã¤ãªãŒã£ã¦ã„るかどうかで (1) を判定する
     1451      # 関数名の出力(標準:受け口ディスクリプタから VMT の関数名、最適化:受け口関数 or 受け口ディスクリプタ)
     1452      # mikan  全部つながっているかどうかで (1) を判定する
    14891453      if ! p.is_VMT_useless? then
    1490         # 標準コード
     1454        # 標準コード
    14911455        if p.get_array_size == nil then
    14921456          if @singleton then
     
    14961460          end
    14971461        else
    1498           # é
    1499 åˆ—の場合
     1462          # 配列の場合
    15001463          if @singleton then
    15011464            f.print( "\t  ((#{@global_name}_SINGLE_CELL_#{inib}.#{p.get_name}!=0) \\\n" )
     
    15071470        end
    15081471      else
    1509         # 最適化コード (optimize) # VMT 不要(é
    1510 åˆ—要素すべて同じ)
     1472        # 最適化コード (optimize) # VMT 不要(配列要素すべて同じ)
    15111473        p2 = p.get_real_callee_port
    15121474        if p2 then
    15131475          ct = p2.get_celltype
    15141476          if p.is_skelton_useless? then
    1515             # 受け口関数を直接呼出す
     1477            # 受け口関数を直接呼出す
    15161478            f.print( "\t  (1)\n" )
    15171479          else
    1518             # 受け口スケルトン関数を直接呼出す
     1480            # 受け口スケルトン関数を直接呼出す
    15191481            f.print( "\t  (1)\n" )
    15201482          end
    15211483        else
    1522           # optional で未結合
     1484          # optional で未結合
    15231485          f.print( "\t  (0)    /* not joined */\n" )
    15241486        end
     
    15271489  end
    15281490
    1529   #=== optional な呼び口が結合されているかテストするコードの生成(短縮形)
     1491  #=== optional な呼び口が結合されているかテストするコードの生成(短縮形)
    15301492  def gen_ph_test_optional_call_port_abbrev f
    15311493    b_comment = false
     
    15341496      next if p.get_port_type != :CALL
    15351497      next if ! p.is_optional?
    1536       # next if p.is_omit?  # omit でも test コードは生成する
     1498      # next if p.is_omit?  # omit でも test コードは生成する
    15371499
    15381500      if b_comment == false then
     
    15501512  end
    15511513
    1552   #=== CELLCB へのポインタを得るマクロを出力
    1553   #   ã‚»ãƒ«ã‚¿ã‚¤ãƒ—ヘッダへ出力
     1514  #=== CELLCB へのポインタを得るマクロを出力
     1515  #   セルタイプヘッダへ出力
    15541516  def gen_ph_get_cellcb f
    15551517    f.printf( TECSMsg.get( :GCB_comment ), "#_GCB_#" )
    15561518    if ( ! has_CB? && ! has_INIB? ) || @singleton then
    15571519      f.print( "#define #{@global_name}_GET_CELLCB(idx) ((void *)0)\n" )
    1558     elsif @idx_is_id_act then   # mikan 単一のセルの場合の最適化, idx_is_id でない場合
     1520    elsif @idx_is_id_act then   # mikan 単一のセルの場合の最適化, idx_is_id でない場合
    15591521      f.print( "#define #{@global_name}_GET_CELLCB(idx) (#{@global_name}_CB_tab[(idx) - #{@global_name}_ID_BASE])\n" )
    15601522    else
     
    15631525  end
    15641526
    1565   #=== CELLCB へのポインタを得るマクロ(短縮形)を出力
    1566   #  セルタイプヘッダへ出力
     1527  #=== CELLCB へのポインタを得るマクロ(短縮形)を出力
     1528  #  セルタイプヘッダへ出力
    15671529  def gen_ph_get_cellcb_abbrev f
    15681530    f.printf( TECSMsg.get( :GCBA_comment ), "#_GCBA_#" )
     
    15801542  end
    15811543
    1582   #===  attribute, var をアクセスするマクロを出力
    1583   #    セルタイプヘッダへ出力
     1544  #===  attribute, var をアクセスするマクロを出力
     1545  #    セルタイプヘッダへ出力
    15841546  def gen_ph_attr_access f
    15851547    if @n_attribute_rw > 0 || @n_attribute_ro > 0 then
     
    15911553      next if a.is_omit?
    15921554
    1593       # mikan const_value の場合
     1555      # mikan const_value の場合
    15941556      f.print( "#define " )
    15951557      if @singleton then
     
    16011563        f.printf( "%-20s", "#{@global_name}_ATTR_#{a.get_name}" )
    16021564        f.print( "\t(#{@global_name}_SINGLE_CELL_#{inib}.#{a.get_name})\n" )
    1603         # mikan ここでは cell ではなく celltype の名前
     1565        # mikan ここでは cell ではなく celltype の名前
    16041566      else
    16051567        if ! a.is_rw? && has_CB? && has_INIB? then
     
    16321594      end
    16331595
    1634       # mikan const_value の場合
     1596      # mikan const_value の場合
    16351597      f.print( "#define " )
    16361598      if @singleton then
    16371599        f.printf( "%-20s", "#{@global_name}_GET_#{a.get_name}()" )
    16381600        f.print( "\t(#{@global_name}_SINGLE_CELL_#{inib}.#{a.get_name})\n" )
    1639         # mikan ここでは cell ではなく celltype の名前
     1601        # mikan ここでは cell ではなく celltype の名前
    16401602      else
    16411603        f.printf( "%-20s", "#{@global_name}_GET_#{a.get_name}(p_that)" )
     
    16481610          f.printf( "%-20s", "#{@global_name}_SET_#{a.get_name}(val)" )
    16491611          f.print( "\t(#{@global_name}_SINGLE_CELL_#{inib}.#{a.get_name} = (val))\n" )
    1650           # mikan ここでは cell ではなく celltype の名前
     1612          # mikan ここでは cell ではなく celltype の名前
    16511613        else
    16521614          f.printf( "%-20s", "#{@global_name}_SET_#{a.get_name}(p_that,val)" )
     
    16801642      end
    16811643
    1682       # mikan const_value の場合
     1644      # mikan const_value の場合
    16831645      f.print( "#define " )
    16841646      if @singleton then
    16851647        f.printf( "%-20s", "#{@global_name}_VAR_#{v.get_name}" )
    16861648        f.print( "\t(#{@global_name}_SINGLE_CELL_#{inib}.#{v.get_name})\n" )
    1687         # mikan ここでは cell ではなく celltype の名前
     1649        # mikan ここでは cell ではなく celltype の名前
    16881650      else
    16891651        f.printf( "%-20s", "#{@global_name}_VAR_#{v.get_name}(p_that)" )
     
    16961658      next if v.is_omit?
    16971659
    1698       # mikan const_value の場合
     1660      # mikan const_value の場合
    16991661      f.print( "#define " )
    17001662      if @singleton then
    17011663        f.printf( "%-20s", "#{@global_name}_GET_#{v.get_name}()" )
    17021664        f.print( "\t(#{@global_name}_SINGLE_CELL_CB.#{v.get_name})\n" )
    1703         # mikan ここでは cell ではなく celltype の名前
     1665        # mikan ここでは cell ではなく celltype の名前
    17041666      else
    17051667        f.printf( "%-20s", "#{@global_name}_GET_#{v.get_name}(p_that)" )
     
    17111673        f.printf( "%-20s", "#{@global_name}_SET_#{v.get_name}(val)" )
    17121674        f.print( "\t(#{@global_name}_SINGLE_CELL_CB.#{v.get_name}=(val))\n" )
    1713         # mikan ここでは cell ではなく celltype の名前
     1675        # mikan ここでは cell ではなく celltype の名前
    17141676      else
    17151677        f.printf( "%-20s", "#{@global_name}_SET_#{v.get_name}(p_that,val)" )
     
    17211683  end
    17221684
    1723   #===  attribute/var アクセスマクロ(短縮形)コードの生成
     1685  #===  attribute/var アクセスマクロ(短縮形)コードの生成
    17241686  def gen_ph_attr_access_abbrev f
    17251687    if @n_attribute_rw > 0 || @n_attribute_ro > 0 then
     
    17301692      next if a.is_omit?
    17311693
    1732       # mikan const_value の場合
     1694      # mikan const_value の場合
    17331695      f.print( "#define " )
    17341696      f.printf( "%-20s", "ATTR_#{a.get_name}" )
     
    17481710      next if v.is_omit?
    17491711
    1750       # mikan const_value の場合
     1712      # mikan const_value の場合
    17511713      f.print( "#define " )
    17521714      f.printf( "%-20s", "VAR_#{v.get_name}" )
     
    18091771        delim = ""
    18101772
    1811         # 関数名の出力(標準:受け口ディスクリプタから VMT の関数名、最適化:受け口関数 or 受け口ディスクリプタ)
     1773        # 関数名の出力(標準:受け口ディスクリプタから VMT の関数名、最適化:受け口関数 or 受け口ディスクリプタ)
    18121774        if ! p.is_VMT_useless? then
    1813           # 標準コード
     1775          # 標準コード
    18141776          if @singleton then
    18151777            f.print( "\t  #{@global_name}_SINGLE_CELL_#{inib}.#{p.get_name}" )
     
    18191781          f.print( "#{subsc}->VMT->#{fun.get_name}__T( \\\n" )
    18201782        else
    1821           # 最適化コード (optimize) # VMT 不要
     1783          # 最適化コード (optimize) # VMT 不要
    18221784          p2 = p.get_real_callee_port
    18231785          if p2 then
    18241786            ct = p2.get_celltype
    18251787            if p.is_skelton_useless? then
    1826               # 受け口関数を直接呼出す
     1788              # 受け口関数を直接呼出す
    18271789              f.print( "\t  #{ct.get_global_name}_#{p2.get_name}_#{fun.get_name}( \\\n" )
    18281790            else
    1829               # 受け口スケルトン関数を直接呼出す
     1791              # 受け口スケルトン関数を直接呼出す
    18301792              f.print( "\t  #{ct.get_global_name}_#{p2.get_name}_#{fun.get_name}_skel( \\\n" )
    18311793              # print "skelton: #{@name} #{ct.get_global_name}_#{p2.get_name}\n"
    18321794            end
    18331795          else
    1834             # optional で未結合
     1796            # optional で未結合
    18351797            f.print( "\t  ((#{fun.get_declarator.get_type.get_type.get_type_str} (*)()" )
    18361798            f.print( "#{fun.get_declarator.get_type.get_type.get_type_str_post})0)()\n" )
     
    18421804        end
    18431805
    1844         b_join = true    # optional で結合していない場合 false
    1845 
    1846         # 受け口æƒ
    1847 å ±ã®å‡ºåŠ›(標準:受け口ディスクリプタ、最適化:IDX など)
     1806        b_join = true    # optional で結合していない場合 false
     1807
     1808        # 受け口情報の出力(標準:受け口ディスクリプタ、最適化:IDX など)
    18481809        if ! p.is_skelton_useless? && ! p.is_cell_unique? then
    1849           # 標準コード
     1810          # 標準コード
    18501811          if @singleton then
    18511812            f.print( "\t  #{@global_name}_SINGLE_CELL_#{inib}.#{p.get_name}#{subsc}" )
     
    18561817          end
    18571818        else
    1858           # 最適化コード (optimize) # スケルトン不要
    1859           c2 = p.get_real_callee_cell               # 唯一のセル(でない場合もある、複数セルがある場合)
    1860           p2 = p.get_real_callee_port               # 唯一のポート(でない場合は、ない)
     1819          # 最適化コード (optimize) # スケルトン不要
     1820          c2 = p.get_real_callee_cell               # 唯一のセル(でない場合もある、複数セルがある場合)
     1821          p2 = p.get_real_callee_port               # 唯一のポート(でない場合は、ない)
    18611822          if p2 then
    1862             ct = p2.get_celltype                    # 呼びå
    1863 ˆã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—
     1823            ct = p2.get_celltype                    # 呼び先のセルタイプ
    18641824            if ! ct.is_singleton? then
    18651825              if ct.has_CB? || ct.has_INIB? then
     
    18681828                  f.print( "\t   #{name_array[7]}" )
    18691829                else
    1870                   # CELLCB IDX を渡す (標準コードと同じだが、扱う型は異なる)
    1871                   # p.is_skelton_useless? == true/false ともに同じ
     1830                  # CELLCB IDX を渡す (標準コードと同じだが、扱う型は異なる)
     1831                  # p.is_skelton_useless? == true/false ともに同じ
    18721832                  f.print( "\t   (p_that)#{inib}->#{p.get_name}#{subsc}" )
    18731833                end
     
    18801840            end
    18811841          else
    1882             # optional で未結合
     1842            # optional で未結合
    18831843            b_join = false
    18841844          end
     
    18971857  end
    18981858
    1899   #=== send/receive で受け取ったメモリ領域を dealloc するマクロコード
     1859  #=== send/receive で受け取ったメモリ領域を dealloc するマクロコード
    19001860  #f:: File
    1901   #b_undef:: bool : true = #undef コードの生成,  false = #define コードの生成
     1861  #b_undef:: bool : true = #undef コードの生成,  false = #define コードの生成
    19021862  def  gen_ph_dealloc_code( f, append_name, b_undef = false )
    19031863    b_msg = false
     
    19061866
    19071867      p.each_param{ |port, fd, par|
    1908         case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
     1868        case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
    19091869        when :SEND
    19101870          # next if port.get_port_type == :CALL
     
    19231883        end
    19241884
    1925         #                      ポート名         é–¢æ•°å         ãƒ‘ラメータ名
     1885        #                      ポート名         関数名         パラメータ名
    19261886        dealloc_func_name = "#{port.get_name}_#{fd.get_name}_#{par.get_name}_dealloc"
    19271887        dealloc_macro_name = dealloc_func_name.upcase
     
    19621922    @port.each { |p|
    19631923      next if p.get_port_type != :CALL
    1964       # next if p.is_omit?  呼び出すとエラーを起こすコードを生成
     1924      # next if p.is_omit?  呼び出すとエラーを起こすコードを生成
    19651925
    19661926      p.get_signature.get_function_head_array.each{ |fun|
     
    20672027        f.print( "struct tag_#{@global_name}_CB *" )
    20682028      elsif has_INIB? then
    2069         # f.print( "struct tag_#{@global_name}_INIB *" )  # const を出力していない
     2029        # f.print( "struct tag_#{@global_name}_INIB *" )  # const を出力していない
    20702030        f.print( "const struct tag_#{@global_name}_INIB *" )
    20712031      else
     
    21032063
    21042064        if p.get_array_size then
    2105           f.print( "#{delim} int_t subscript" )     # mikan singleton 時の ',' の始末
     2065          f.print( "#{delim} int_t subscript" )     # mikan singleton 時の ',' の始末
    21062066          delim = ","
    21072067        end
     
    21112071          len = items.length
    21122072        else
    2113           # ここで nil になるのは、引数なしの時に void がなかった場合
     2073          # ここで nil になるのは、引数なしの時に void がなかった場合
    21142074          items = []
    21152075          len = 0
     
    21322092
    21332093  def gen_ph_ep_skel_prototype f
    2134     # 受け口スケルトン関数のプロトタイプ宣言を出力
     2094    # 受け口スケルトン関数のプロトタイプ宣言を出力
    21352095    if @n_entry_port >0 then
    21362096      f.printf( TECSMsg.get( :EPSP_comment ), "#_EPSP_#" )
     
    21392099      next if p.get_port_type != :ENTRY
    21402100      next if p.is_omit?
    2141 #      if p.is_skelton_useless? || ! p.is_VMT_useless? then    # 受け口最適化
    2142       if p.is_skelton_useless? then    # 受け口最適化
     2101#      if p.is_skelton_useless? || ! p.is_VMT_useless? then    # 受け口最適化
     2102      if p.is_skelton_useless? then    # 受け口最適化
    21432103#        f.print( "/* #{p.get_name} : omitted by entry port optimize */\n" )
    21442104        next
     
    21592119          len = items.length
    21602120        else
    2161           # ここで nil になるのは、引数なしの時に void がなかった場合
     2121          # ここで nil になるのは、引数なしの時に void がなかった場合
    21622122          items = []
    21632123          len = 0
     
    21822142
    21832143    if ( $rom )then
    2184       # 定数部は ROM, 変数部は RAM
     2144      # 定数部は ROM, 変数部は RAM
    21852145
    21862146      if has_INIB? then
     
    22152175
    22162176    else
    2217       # å
    2218 ¨ã¦ RAM
     2177      # 全て RAM
    22192178      f.printf( TECSMsg.get( :CCTPO_comment ), "#_CCTPO_#" )
    22202179
     
    22302189
    22312190
    2232   #===   attribute の型宣言出力
    2233   #inib_cb::  :INIB または :CB
     2191  #===   attribute の型宣言出力
     2192  #inib_cb::  :INIB または :CB
    22342193  def gen_cell_cb_type_attribute( f, inib_cb )
    22352194    if inib_cb == :INIB && @n_attribute_ro > 0 then
     
    22642223      next if v.is_omit?
    22652224      next if v.get_size_is == nil
    2266       next if $rom && inib_cb == :CB      # size_is 指定されたものは INIB にのみ出力する
     2225      next if $rom && inib_cb == :CB      # size_is 指定されたものは INIB にのみ出力する
    22672226
    22682227      f.print "    "
     
    22732232
    22742233  def gen_cell_cb_type_var f
    2275     # 変数の出力
     2234    # 変数の出力
    22762235    if @n_var > 0 then
    22772236      f.print "    /* var #_VA_# */ \n"
     
    22812240
    22822241      next if v.is_omit?
    2283       next if v.get_size_is != nil    # size_is 指定された var は attribute へ出力する
     2242      next if v.get_size_is != nil    # size_is 指定された var は attribute へ出力する
    22842243
    22852244      f.print "    "
     
    22952254
    22962255  def gen_cell_cb_type_call_port f
    2297     # 呼び口
     2256    # 呼び口
    22982257    if @n_call_port >0 then
    22992258      f.print "    /* call port #_TCP_# */ \n"
     
    23082267      if ! p.is_cell_unique? then
    23092268        if ! p.is_skelton_useless? then
    2310           # 標準形
     2269          # 標準形
    23112270          f.print( "    struct tag_#{p.get_signature.get_global_name}_VDES #{ptr}const*#{p.get_name;};\n" )
    23122271          if p.get_array_size == "[]" then
     
    23142273          end
    23152274        else
    2316           # 最適化 skelton 関数を呼出さない(受け口関数を直接呼出す)
    2317           # 呼びå
    2318 ˆã‚»ãƒ«ã‚¿ã‚¤ãƒ—の CB の IDX 型
     2275          # 最適化 skelton 関数を呼出さない(受け口関数を直接呼出す)
     2276          # 呼び先セルタイプの CB の IDX 型
    23192277          if p.get_real_callee_cell then
    23202278            f.print( "    " )
    23212279            p.get_real_callee_cell.get_celltype.gen_ph_idx_type f
    23222280            f.print( " #{ptr}#{p.get_name;};\n" )
    2323             # 相互参ç
    2324 §ã«å‚™ãˆã¦ã€typedef した型を使わない
     2281            # 相互参照に備えて、typedef した型を使わない
    23252282            # f.print( "    #{p.get_real_callee_cell.get_celltype.get_global_name}_IDX #{ptr}#{p.get_name;};\n" )
    23262283            if p.get_array_size == "[]" then
     
    23282285            end
    23292286          #else
    2330           #  optional で未結合
     2287          #  optional で未結合
    23312288          end
    23322289        end
    23332290      # else
    2334         # 最適化 一つしかセルがない場合、受け口ディスクリプタまたは受け側の IDX は呼び口関数マクロに埋め込まれる
    2335       end
    2336     }
    2337   end
    2338 
    2339   #=== Celltype#受け口é
    2340 åˆ—添数を記憶する変数の定義
     2291        # 最適化 一つしかセルがない場合、受け口ディスクリプタまたは受け側の IDX は呼び口関数マクロに埋め込まれる
     2292      end
     2293    }
     2294  end
     2295
     2296  #=== Celltype#受け口配列添数を記憶する変数の定義
    23412297  def gen_cell_cb_type_entry_port f
    2342     # 呼び口
     2298    # 呼び口
    23432299    if @n_entry_port >0 then
    23442300      f.print "    /* call port #_NEP_# */ \n"
     
    23462302
    23472303    @port.each{ |p|
    2348       # next if p.is_omit?                       # 受け口é
    2349 åˆ—の個数は省略しない
     2304      # next if p.is_omit?                       # 受け口配列の個数は省略しない
    23502305      if p.get_port_type == :ENTRY && p.get_array_size == "[]"
    23512306        f.print( "    int_t n_#{p.get_name};\n" )
     
    23892344  end
    23902345
    2391   #===  イテレータコード (FOREACH_CELL)の生成
    2392   #      singleton では出力しない
     2346  #===  イテレータコード (FOREACH_CELL)の生成
     2347  #      singleton では出力しない
    23932348  def gen_ph_foreach_cell f
    23942349
     
    24312386
    24322387
    2433   #===  変数var初期化コード
     2388  #===  変数var初期化コード
    24342389  #
    24352390  def gen_ph_cb_initialize_macro f
     
    24422397        type = v.get_type
    24432398        if( type.kind_of? PtrType )then
    2444           # PtrType は ArrayType にすり替える
    2445 
    2446           # 初期化子の要素数とする (後は 0 である)
     2399          # PtrType は ArrayType にすり替える
     2400
     2401          # 初期化子の要素数とする (後は 0 である)
    24472402          t2 = ArrayType.new( Expression.create_integer_constant( init.length, nil ) )
    24482403          t2.set_type( type.get_type )
     
    25122467
    25132468    # else
    2514     #   ã‚»ãƒ«ãŒä¸€ã¤ã‚‚なければ出力しない
     2469    #   セルが一つもなければ出力しない
    25152470    end
    25162471
     
    25192474
    25202475  def gen_ph_inline f
    2521     # inline ポートが一つでもあれば、inline.h の include
     2476    # inline ポートが一つでもあれば、inline.h の include
    25222477    if @n_entry_port_inline > 0 then
    25232478      f.printf( TECSMsg.get( :INL_comment ), "#_INL_#" )
     
    25712526      next if p.get_port_type != :ENTRY
    25722527      next if p.is_omit?
    2573       if p.is_skelton_useless?    # 受け口最適化
     2528      if p.is_skelton_useless?    # 受け口最適化
    25742529        f.print( "/* #{p.get_name} : omitted by entry port optimize */\n\n" )
    25752530        next
     
    25822537        f.print( "    #{@name}_IDX  idx;\n" )
    25832538      else
    2584         # CB も INIB も存在しない (ので、idx として整数で初期化しておく)
     2539        # CB も INIB も存在しない (ので、idx として整数で初期化しておく)
    25852540        f.print( "    int           idx;\n" )
    25862541      end
     
    26002555      next if p.get_port_type != :ENTRY
    26012556      next if p.is_omit?
    2602       if p.is_skelton_useless? then    # 受け口最適化
     2557      if p.is_skelton_useless? then    # 受け口最適化
    26032558        f.print( "/* #{p.get_name} : omitted by entry port optimize */\n" )
    26042559        next
     
    26192574          len = items.length
    26202575        else
    2621           # ここで nil になるのは、引数なしの時に void がなかった場合
     2576          # ここで nil になるのは、引数なしの時に void がなかった場合
    26222577          items = []
    26232578          len = 0
     
    26412596        end
    26422597
    2643         if functype.get_type_str == "void" then # mikan "void" の typedef に未対応
     2598        if functype.get_type_str == "void" then # mikan "void" の typedef に未対応
    26442599          f.print "    "
    26452600        else
     
    26842639      next if p.get_port_type != :ENTRY
    26852640      next if p.is_omit?
    2686       if p.is_VMT_useless? then    # 受け口最適化
     2641      if p.is_VMT_useless? then    # 受け口最適化
    26872642        f.print "/* #{p.get_name} : omitted by entry port optimize */\n"
    26882643        next
     
    27102665    end
    27112666
    2712     # このセルタイプのすべてのセルについて
     2667    # このセルタイプのすべてのセルについて
    27132668    @ordered_cell_list.each{ |c|
    2714       if c.is_generate? then                           # 生成対象か?
     2669      if c.is_generate? then                           # 生成対象か?
    27152670
    27162671        f = fs[ c.get_region.get_domain_root ]
    27172672
    2718         # 結合のリスト (NamedList)
     2673        # 結合のリスト (NamedList)
    27192674        jl = c.get_join_list
    27202675
    2721         # å
    2722 ¨ã¦ã®çµåˆãƒªã‚¹ãƒˆã«ã¤ã„て
     2676        # 全ての結合リストについて
    27232677        jl.get_items.each{ |j|
    27242678
    2725           # 左辺の定義を得る
     2679          # 左辺の定義を得る
    27262680          definition = j.get_definition
    27272681
    2728           # 呼び口ではない? (属性)
     2682          # 呼び口ではない? (属性)
    27292683          next unless definition.instance_of? Port
    27302684
    2731           port = find j.get_name # celltype の Port (こちらに最適化æƒ
    2732 å ±ãŒã‚ã‚‹)
    2733           # port = definition    # definition は composite の Port が得られることがある
     2685          port = find j.get_name # celltype の Port (こちらに最適化情報がある)
     2686          # port = definition    # definition は composite の Port が得られることがある
    27342687          next if port.is_cell_unique?
    27352688          next if port.is_omit?
    27362689
    2737           # é
    2738 åˆ—要素を得る(受け口é
    2739 åˆ—でなければ nil が返る)
     2690          # 配列要素を得る(受け口配列でなければ nil が返る)
    27402691          am = j.get_array_member2
    27412692
    2742           # 呼び口é
    2743 åˆ—か?
     2693          # 呼び口配列か?
    27442694          if am  then
    27452695            i = 0
     
    27482698              if j then
    27492699                if am[i].get_cell.get_celltype == self then
    2750                   # 同じセルタイプへ結合している場合(VDES では type conflict になる)
     2700                  # 同じセルタイプへ結合している場合(VDES では type conflict になる)
    27512701                  p = am[i].get_rhs_port
    27522702                  des_type = "const struct tag_#{@global_name}_#{p.get_name}_DES"
     
    27552705                end
    27562706
    2757                 # 右辺は受け口é
    2758 åˆ—か?
     2707                # 右辺は受け口配列か?
    27592708                if j.get_rhs_subscript then
    27602709
    2761                   # 受け口のé
    2762 åˆ—添数
     2710                  # 受け口の配列添数
    27632711                  subscript = j.get_rhs_subscript
    27642712
     
    27732721                end
    27742722              #else if j == nil
    2775               #  optioanl でé
    2776 åˆ—要素が初期化されていない
     2723              #  optioanl で配列要素が初期化されていない
    27772724              end
    27782725              i += 1
     
    27802727          else
    27812728            if j.get_cell.get_celltype == self then
    2782               # 同じセルタイプへ結合している場合(VDES では type conflict になる)
     2729              # 同じセルタイプへ結合している場合(VDES では type conflict になる)
    27832730              p = j.get_rhs_port
    27842731              des_type = "const struct tag_#{@global_name}_#{p.get_name}_DES"
     
    27882735
    27892736            if j.get_rhs_subscript then
    2790               # 受け口é
    2791 åˆ—
     2737              # 受け口配列
    27922738              subscript = j.get_rhs_subscript
    27932739              f.printf( "extern %s %s%d;\n",
     
    28012747            end
    28022748          end
    2803           # mikan   cell の namespace 未対応、Join で Cell オブジェクトを引当ておくå¿
    2804 è¦ã‚ã‚Š
     2749          # mikan   cell の namespace 未対応、Join で Cell オブジェクトを引当ておく必要あり
    28052750        }
    28062751
     
    28122757  def gen_cell_ep_vdes_array fs
    28132758    if @n_cell_gen >0 then
    2814       fs.each{ |r, f| f.printf( TECSMsg.get( :CPA_comment ), "#_CPA_#" ) }  # mikan 呼び口é
    2815 åˆ—が無い場合も出てしまう
     2759      fs.each{ |r, f| f.printf( TECSMsg.get( :CPA_comment ), "#_CPA_#" ) }  # mikan 呼び口配列が無い場合も出てしまう
    28162760    end
    28172761
     
    28242768          definition = j.get_definition
    28252769          next unless definition.instance_of? Port
    2826           # port = definition    # definition は composite の Port が得られることがある
    2827           port = find j.get_name # celltype の Port (こちらに最適化æƒ
    2828 å ±ãŒã‚ã‚‹)
     2770          # port = definition    # definition は composite の Port が得られることがある
     2771          port = find j.get_name # celltype の Port (こちらに最適化情報がある)
    28292772          next if port.is_cell_unique?
    28302773          next if port.is_omit?
     
    28322775          am = j.get_array_member2
    28332776          if am  then
    2834             # 左辺はé
    2835 åˆ—
     2777            # 左辺は配列
    28362778
    28372779            if ! port.is_skelton_useless? then
     
    28422784            else
    28432785
    2844 #              スケルトン関数不要最適化の場合、このé
    2845 åˆ—は参ç
    2846 §ã•ã‚Œãªã„
    2847               # mikan このケースがテストされていない
     2786#              スケルトン関数不要最適化の場合、この配列は参照されない
     2787              # mikan このケースがテストされていない
    28482788              f.printf( "const %s_IDX  %s_%s[] = {\n",
    2849 #                        "#{j.get_celltype.get_global_name}",   # 右辺 composite に対応できない
     2789#                        "#{j.get_celltype.get_global_name}",   # 右辺 composite に対応できない
    28502790                        "#{j.get_rhs_cell.get_celltype.get_global_name}",
    28512791                        "#{c.get_global_name}",
     
    28642804
    28652805              if j then
    2866                 # 同一セルタイプの結合の場合、VDES 型へのキャストがå¿
    2867 è¦
     2806                # 同一セルタイプの結合の場合、VDES 型へのキャストが必要
    28682807                if j.get_rhs_cell.get_celltype == self then
    28692808                  definition = j.get_definition
     
    28752814               
    28762815                if j.get_rhs_subscript then
    2877                   # 右辺é
    2878 åˆ—の場合(最適化はない)
     2816                  # 右辺配列の場合(最適化はない)
    28792817                  subscript = j.get_rhs_subscript
    28802818                  f.printf( "    %s%d,\n",
     
    28852823
    28862824                else
    2887                   # 右辺非é
    2888 åˆ—の場合 */
     2825                  # 右辺非配列の場合 */
    28892826                  if ! port.is_skelton_useless? then
    28902827                    f.printf( "    %s,\n",
     
    28972834                end
    28982835              else
    2899                 # optional で呼び口é
    2900 åˆ—要素が初期化されていない
     2836                # optional で呼び口配列要素が初期化されていない
    29012837                f.printf( "    0,\n" )
    29022838              end
    29032839            # }
    29042840            end
    2905             # mikan   cell の namespace 未対応、Join で Cell オブジェクトを引当ておくå¿
    2906 è¦ã‚ã‚Š
     2841            # mikan   cell の namespace 未対応、Join で Cell オブジェクトを引当ておく必要あり
    29072842            f.print "};\n"
    29082843          end
     
    29142849  end
    29152850
    2916   #=== CB を初期化するプログラムの生成
     2851  #=== CB を初期化するプログラムの生成
    29172852  def gen_cell_cb_initialize_code f
    29182853    if ! need_CB_initializer?
     
    29462881  end
    29472882
    2948   # === CB/INIB の外で初期化される変数の出力
     2883  # === CB/INIB の外で初期化される変数の出力
    29492884  def gen_cell_cb_out_init fs
    29502885
    2951     # セルがなければ、出力しない
     2886    # セルがなければ、出力しない
    29522887    if @n_cell_gen == 0 then
    29532888      return
     
    29562891    fs.each{ |r, f| f.printf( TECSMsg.get( :AVAI_comment ), "#_AVAI_#" ) }
    29572892
    2958     # attribute, var のポインタ型の参ç
    2959 §ã™ã‚‹é
    2960 åˆ—を生成
     2893    # attribute, var のポインタ型の参照する配列を生成
    29612894    @ordered_cell_list.each{ |c|
    29622895      next if  ! c.is_generate?
     
    29682901      jl = c.get_join_list
    29692902
    2970       # attribute, var のポインタ変数がé
    2971 åˆ—により初期化される場合の、é
    2972 åˆ—を出力
     2903      # attribute, var のポインタ変数が配列により初期化される場合の、配列を出力
    29732904      av_list = ct.get_attribute_list + ct.get_var_list
    29742905      if av_list.length != 0 then
     
    29862917
    29872918            if size then
    2988               # 式を評価する(attribute, var に含まれる変数を参ç
    2989 §å¯èƒ½)
     2919              # 式を評価する(attribute, var に含まれる変数を参照可能)
    29902920              sz = size.eval_const( c.get_join_list, c.get_celltype.get_name_list )
    2991               # 式を生成しなおす (変数を含まない形にする)  不完å
    2992 ¨ãªå½¢ã§ Token を生成 (エラー発生しないから)
     2921              # 式を生成しなおす (変数を含まない形にする)  不完全な形で Token を生成 (エラー発生しないから)
    29932922              size = Expression.new( [:INTEGER_CONSTANT, Token.new(sz, nil, 0, 0)] )
    29942923              array_type = ArrayType.new( size )
     
    30042933                                                                # name_array[3]: cell_CB_INIT
    30052934              if !( $ram_initializer && a.get_kind == :VAR ) then
    3006                 # -R (ram initializer 使用) の場合 var は初期化コードを出力しない
     2935                # -R (ram initializer 使用) の場合 var は初期化コードを出力しない
    30072936                if( init )then
    30082937                  str = " = #{gen_cell_cb_init( f, c, name_array, array_type, init, a.get_identifier, 1, true )}"
     
    30222951  end
    30232952
    3024   #=== var の初期値の ROM 部への
     2953  #=== var の初期値の ROM 部への
    30252954  def gen_cell_var_init f
    3026     # var の{ }で囲まれた初期値指定があるか調べる
     2955    # var の{ }で囲まれた初期値指定があるか調べる
    30272956    n_init = 0
    30282957    @var.each { |v|
     
    30412970
    30422971          if( type.kind_of? PtrType )then
    3043             # PtrType は ArrayType にすり替える
    3044 
    3045             # 初期化子の要素数だけとする(後は 0)
     2972            # PtrType は ArrayType にすり替える
     2973
     2974            # 初期化子の要素数だけとする(後は 0)
    30462975            t2 = ArrayType.new( Expression.create_integer_constant( init.length, nil ) )
    30472976            t2.set_type( type.get_type )
     
    30492978          end
    30502979
    3051           c = @ordered_cell_list[0]   # 仮の cell (実際には使われない)
     2980          c = @ordered_cell_list[0]   # 仮の cell (実際には使われない)
    30522981          name_array = get_name_array( c )
    30532982          # f.print "const #{type0.get_type_str}\t#{@global_name}_#{v.get_name}_VAR_INIT#{type0.get_type_str_post} = "
    30542983          f.print "const #{type.get_type_str}\t#{@global_name}_#{v.get_name}_VAR_INIT#{type.get_type_str_post} = "
    30552984          if type.kind_of? StructType then
    3056             # celltype の default の初期値あり
     2985            # celltype の default の初期値あり
    30572986            str = gen_cell_cb_init( f, c, name_array, type, init, v.get_identifier, 1, true )
    30582987          elsif( type.kind_of?( PtrType ) || type.kind_of?( ArrayType ) ) then
    30592988            str = "{ "
    30602989            type = type.get_type
    3061             # mikan ポインタではなく、é
    3062 åˆ—型としないと、ポインタ変数の領域の分、損する
     2990            # mikan ポインタではなく、配列型としないと、ポインタ変数の領域の分、損する
    30632991            init.each { |i|
    30642992              str += gen_cell_cb_init( f, c, name_array, type, i, v.get_identifier, 1, true )
     
    31173045
    31183046        unless @singleton then
    3119           # 1 つの cell INIB の終わり
     3047          # 1 つの cell INIB の終わり
    31203048          if @idx_is_id_act then
    31213049            f.print( "};\n\n" )
     
    31353063      end
    31363064
    3137       # RAM initializer を使用しない、または ROM 化しない
     3065      # RAM initializer を使用しない、または ROM 化しない
    31383066      if $ram_initializer == false || $rom == false then
    31393067        if @singleton then
     
    31773105
    31783106          unless @singleton then
    3179             # 1 つの cell CB の終わり
     3107            # 1 つの cell CB の終わり
    31803108            if @idx_is_id_act then
    31813109              f.print( "};\n\n" )
     
    32153143        f.print "/* ID to INIB table #_INTAB_# */\n"
    32163144        @ordered_cell_list.each{ |c|
    3217           if c.is_generate? && ( c.get_region.get_domain_root != Region.get_root ) then # 生成対象かつ、ルート以外か
     3145          if c.is_generate? && ( c.get_region.get_domain_root != Region.get_root ) then # 生成対象かつ、ルート以外か
    32183146            name_array = get_name_array( c )
    32193147            print_indent( f, indent + 1 )
     
    32243152        f.print "#{@global_name}_INIB *#{@global_name}_INIB_tab[] ={\n"
    32253153        @ordered_cell_list.each{ |c|
    3226           if c.is_generate? then                           # 生成対象か?
     3154          if c.is_generate? then                           # 生成対象か?
    32273155            name_array = get_name_array( c )
    32283156            print_indent( f, indent + 1 )
     
    32353163        f.print "/* ID to CB table #_CBTAB_# */\n"
    32363164        @ordered_cell_list.each{ |c|
    3237           if c.is_generate? && ( c.get_region.get_domain_root != Region.get_root ) then # 生成対象かつ、ルート以外か
     3165          if c.is_generate? && ( c.get_region.get_domain_root != Region.get_root ) then # 生成対象かつ、ルート以外か
    32383166            name_array = get_name_array( c )
    32393167            print_indent( f, indent + 1 )
     
    32443172        f.print "#{@global_name}_CB *#{@global_name}_CB_tab[] ={\n"
    32453173        @ordered_cell_list.each{ |c|
    3246           if c.is_generate? then                           # 生成対象か?
     3174          if c.is_generate? then                           # 生成対象か?
    32473175            name_array = get_name_array( c )
    32483176            print_indent( f, indent + 1 )
     
    32563184
    32573185
    3258   #=== name_array を生成
     3186  #=== name_array を生成
    32593187  # IN:   cell  : Cell
    3260   #       index : CB, INIB é
    3261 åˆ—の添数
     3188  #       index : CB, INIB 配列の添数
    32623189  # RETURN: name_array
    32633190  #   name_array[0] = @name           # celltype name
    32643191  #   name_array[1] = cell.get_name   # cell name
    32653192  #   name_array[2] = cell_CB_name    # cell_CB_name
    3266   #   name_array[3] = cell_CB_INIT    # cell_CB_INIT # CB の外側で初期化がå¿
    3267 è¦ãªé
    3268 åˆ—の名前
     3193  #   name_array[3] = cell_CB_INIT    # cell_CB_INIT # CB の外側で初期化が必要な配列の名前
    32693194  #   name_array[4] = cell_CB_proto   # CB name for prototype
    32703195  #   name_array[5] = cell_INIB       # INIB name
     
    33053230
    33063231    if ! has_CB? && ! has_INIB? then
    3307       cell_CBP = "NULL"    # CB も INIB もなければ NULL に置換
     3232      cell_CBP = "NULL"    # CB も INIB もなければ NULL に置換
    33083233    else
    33093234      cell_CBP = "&#{cell_CB_name}"
     
    33263251  end
    33273252
    3328   #=== attribute と size_is 指定された var (ポインタ)の初期化データを出力
     3253  #=== attribute と size_is 指定された var (ポインタ)の初期化データを出力
    33293254  #
    3330   # ROM 化サポートの有無、および出力対象が CB か INIB かにより出力されるå†
    3331 å®¹ãŒç•°ãªã‚‹
     3255  # ROM 化サポートの有無、および出力対象が CB か INIB かにより出力される内容が異なる
    33323256  def gen_cell_cb_attribute( cell, indent, f, name_array, cb_inib )
    33333257    ct = self
     
    33393263      f.print "/* attribute(RO) */ \n"
    33403264    elsif $rom then  # && cb_inib == CB
    3341       # CB で rw と var
     3265      # CB で rw と var
    33423266      return if @n_attribute_rw == 0
    33433267      print_indent( f, indent + 1 )
    33443268      f.print "/* attribute(RW) */ \n"
    33453269    else  # cb_inib == CB && $rom == false
    3346       # CB にå
    3347 ¨éƒ¨
     3270      # CB に全部
    33483271      return if @n_attribute_rw == 0 && @n_attribute_ro == 0 && @n_var_size_is == 0
    33493272      print_indent( f, indent + 1 )
     
    33553278      next if a.is_omit?
    33563279      if cb_inib == :INIB && a.is_rw? == true then
    3357         # $rom == true でしか、ここへ来ない
     3280        # $rom == true でしか、ここへ来ない
    33583281        next
    33593282      elsif cb_inib == :CB && $rom && ! a.is_rw? then
     
    33633286      j = jl.get_item( a.get_identifier )
    33643287      if j then
    3365         # cell の初期値指定あり
     3288        # cell の初期値指定あり
    33663289        gen_cell_cb_init( f, cell, name_array, a.get_type, j.get_rhs, a.get_identifier, indent + 1 )
    33673290      elsif a.get_initializer then
    3368         # celltype の default の初期値あり
     3291        # celltype の default の初期値あり
    33693292        gen_cell_cb_init( f, cell, name_array, a.get_type, a.get_initializer, a.get_identifier, indent + 1 )
    33703293      else
    3371         # 初期値未指定
     3294        # 初期値未指定
    33723295        gen_cell_cb_init( f, cell, name_array, a.get_type, nil, a.get_identifier, indent + 1 )
    33733296      end
     
    33753298    @var.each{ |v|
    33763299      next if v.is_omit?
    3377       next if v.get_size_is == nil   # size_is 指定がある場合 attribute の一部として出力
     3300      next if v.get_size_is == nil   # size_is 指定がある場合 attribute の一部として出力
    33783301
    33793302      if v.get_initializer && $ram_initializer == false then
    33803303        gen_cell_cb_init( f, cell, name_array, v.get_type, v.get_initializer, v.get_identifier, indent + 1 )
    33813304      else
    3382         # 初期値未指定 または RAM initializer 使用
     3305        # 初期値未指定 または RAM initializer 使用
    33833306        gen_cell_cb_init( f, cell, name_array, v.get_type, nil, v.get_identifier, indent + 1 )
    33843307      end
     
    33863309  end
    33873310
    3388   #=== var の初期化データを出力
     3311  #=== var の初期化データを出力
    33893312  def gen_cell_cb_var( cell, indent, f, name_array )
    33903313    jl = cell.get_join_list
     
    33963319
    33973320        next if v.is_omit?
    3398         next if v.get_size_is      # size_is 指定がある場合 attribute の一部として出力
     3321        next if v.get_size_is      # size_is 指定がある場合 attribute の一部として出力
    33993322
    34003323        if v.get_initializer && $ram_initializer == false then
    34013324          gen_cell_cb_init( f, cell, name_array, v.get_type, v.get_initializer, v.get_identifier, indent + 1 )
    34023325        else
    3403           # 初期値未指定 または RAM initializer 使用
     3326          # 初期値未指定 または RAM initializer 使用
    34043327          gen_cell_cb_init( f, cell, name_array, v.get_type, nil, v.get_identifier, indent + 1 )
    34053328        end
     
    34133336  end
    34143337
    3415   #=== 呼び口の初期化コードの生成
     3338  #=== 呼び口の初期化コードの生成
    34163339  def gen_cell_cb_call_port( cell, indent, f, name_array )
    34173340    jl = cell.get_join_list
     
    34243347        next if p.get_port_type != :CALL
    34253348        next if p.is_omit?
    3426         next if p.is_cell_unique?        # 最適化(単一セルで呼び口マクロに埋め込まれる)
     3349        next if p.is_cell_unique?        # 最適化(単一セルで呼び口マクロに埋め込まれる)
    34273350
    34283351        j = jl.get_item( p.get_name )
     
    34313354        # debug
    34323355        if j == nil then
    3433           # optional 呼び口
     3356          # optional 呼び口
    34343357          # cdl_error( "H1003 internal error: cell \'$1\' port \'$2\': initializer not found\n" , cell.get_name, p.get_name )
    34353358          # exit( 1 )
    34363359          f.printf( "%-40s /* #_CCP5_# */\n",  "0," )
    34373360          if p.get_array_size == "[]" then
    3438             # 添数省略の呼び口é
    3439 åˆ—
     3361            # 添数省略の呼び口配列
    34403362            print_indent( f, indent + 1 )
    34413363            f.printf( "%-40s /* %s #_CCP6_# */\n", "0,", "length of #{p.get_name} (n_#{p.get_name})" )
     
    34463368        am = j.get_array_member2
    34473369        if am then
    3448           # 呼び口é
    3449 åˆ—の場合
     3370          # 呼び口配列の場合
    34503371          f.printf( "%-40s /* #_CCP3_# */\n",  "#{cell.get_global_name}_#{j.get_name}," )
    34513372          if p.get_array_size == "[]" then
    3452             # 添数省略の呼び口é
    3453 åˆ—
     3373            # 添数省略の呼び口配列
    34543374            print_indent( f, indent + 1 )
    34553375            f.printf( "%-40s /* %s #_CCP4_# */\n", "#{am.length},", "length of #{p.get_name} (n_#{p.get_name})" )
    34563376          end
    34573377        else
    3458           # 同一セルタイプの結合の場合、VDES 型へのキャストがå¿
    3459 è¦
     3378          # 同一セルタイプの結合の場合、VDES 型へのキャストが必要
    34603379          #print "CCP0/CCP1 #{p.get_name}, #{j.get_rhs_cell.get_celltype.get_name}, #{@name}\n"
    34613380          if j.get_rhs_cell.get_celltype == self then
     
    34673386
    34683387          if j.get_rhs_subscript then
    3469             # 受け口é
    3470 åˆ—の場合
     3388            # 受け口配列の場合
    34713389            subscript = j.get_rhs_subscript
    34723390            f.printf( "%-40s /* %s #_CCP0_# */\n",
     
    34753393                      p.get_name )
    34763394          else
    3477             # 呼び口é
    3478 åˆ—でも、受け口é
    3479 åˆ—でもない
     3395            # 呼び口配列でも、受け口配列でもない
    34803396            if ! p.is_skelton_useless? then
    34813397              f.printf( "%-40s /* %s #_CCP1_# */\n",
     
    34833399                        p.get_name )
    34843400            else
    3485               # スケルトン不要最適化(CB (INIB) へのポインタを埋め込む)
    3486               c = j.get_rhs_cell                    # 呼びå
    3487 ˆã‚»ãƒ«
    3488               ct = c.get_celltype                   # 呼びå
    3489 ˆã‚»ãƒ«ã‚¿ã‚¤ãƒ—
     3401              # スケルトン不要最適化(CB (INIB) へのポインタを埋め込む)
     3402              c = j.get_rhs_cell                    # 呼び先セル
     3403              ct = c.get_celltype                   # 呼び先セルタイプ
    34903404              if ct.has_INIB? || ct.has_CB? then
    3491                 name_array = ct.get_name_array( c )   # 呼びå
    3492 ˆã‚»ãƒ«ã‚¿ã‚¤ãƒ—で name_array を得る
     3405                name_array = ct.get_name_array( c )   # 呼び先セルタイプで name_array を得る
    34933406                f.printf( "%-40s /* %s #_CCP2_# */\n", "#{name_array[7]},", p.get_name )
    34943407              else
    3495                 # 呼びå
    3496 ˆã¯ CB も INIB も持たない(NULL に初期化)
     3408                # 呼び先は CB も INIB も持たない(NULL に初期化)
    34973409                f.printf( "%-40s /* %s #_CCP2_# */\n", "0,", p.get_name )
    34983410              end
     
    35053417  end
    35063418
    3507   #=== 受け口の初期化コードの生成
     3419  #=== 受け口の初期化コードの生成
    35083420  def gen_cell_cb_entry_port( cell, indent, f, name_array )
    35093421    jl = cell.get_join_list
     
    35143426      f.print "/* entry port #_EP_# */ \n"
    35153427      @port.each{ |p|
    3516         # next if p.is_omit?  # 受け口é
    3517 åˆ—の個数は省略しない
     3428        # next if p.is_omit?  # 受け口配列の個数は省略しない
    35183429        if p.get_port_type == :ENTRY && p.get_array_size == "[]"
    35193430          print_indent( f, indent + 1 )
     
    35243435  end
    35253436
    3526   #=== セルの attribute の初期値を出力
     3437  #=== セルの attribute の初期値を出力
    35273438  #
    3528   #f_get_str:: true の場合、文字列を返す、false の場合、ファイル f に出力する.
    3529   # 文字列を返すとき、末尾に ',' は含まれない.
    3530   # ファイルへ出力するとき、末尾に ',' が出力される.構造体要素、é
    3531 åˆ—要素の初期値を出力すると ',' が二重に出力される.
    3532   # ただし現状では、ファイルへ出力することはない
     3439  #f_get_str:: true の場合、文字列を返す、false の場合、ファイル f に出力する.
     3440  # 文字列を返すとき、末尾に ',' は含まれない.
     3441  # ファイルへ出力するとき、末尾に ',' が出力される.構造体要素、配列要素の初期値を出力すると ',' が二重に出力される.
     3442  # ただし現状では、ファイルへ出力することはない
    35333443  #
    35343444  def gen_cell_cb_init( f, cell, name_array, type, init, identifier, indent, f_get_str = false )
     
    35443454
    35453455      if f_get_str then
    3546         # 初期値未指定
     3456        # 初期値未指定
    35473457        if type.kind_of?( BoolType ) then
    35483458          str = "false"   # formerly tecs_false
     
    35683478        return str
    35693479      else
    3570         # 初期値未指定
     3480        # 初期値未指定
    35713481        if type.kind_of?( BoolType ) then
    35723482          f.print "    " * indent
     
    36023512    end   
    36033513
    3604     # このメソッドは Celltype のものであるå¿
    3605 è¦ã¯ç„¡ã„(上に続くのでここに置く)
    3606     # 初期値指定あり
     3514    # このメソッドは Celltype のものである必要は無い(上に続くのでここに置く)
     3515    # 初期値指定あり
    36073516    if type.kind_of?( BoolType ) then
    36083517      if init.instance_of?( C_EXP ) then
     
    36703579
    36713580      len.times {
    3672         next if ! init[i]        # mikan この処置は適切?
     3581        next if ! init[i]        # mikan この処置は適切?
    36733582        if f_get_str then
    36743583          str += gen_cell_cb_init( f, cell, name_array, at, init[i], "#{identifier}[#{i}]", indent + 1, f_get_str )
     
    37523661  end
    37533662
    3754   #== 関数テーブルの外部参ç
    3755 §
     3663  #== 関数テーブルの外部参照
    37563664  def gen_cell_extern_mt fs
    37573665    fs.each{ |r, f|
     
    37683676  end
    37693677
    3770   #=== 受け口ディスクリプタの定義を生成
     3678  #=== 受け口ディスクリプタの定義を生成
    37713679  def gen_cell_ep_des fs
    37723680    if @n_cell_gen >0 then
     
    37893697          next if p.get_port_type != :ENTRY
    37903698          next if p.is_omit?
    3791           if p.is_skelton_useless?       # 受け口最適化n ep_opt
     3699          if p.is_skelton_useless?       # 受け口最適化n ep_opt
    37923700            f.print( "/* #{p.get_name} : omitted by entry port optimize */\n" )
    37933701            next
     
    38003708
    38013709          if len != nil then
    3802             # 受け口é
    3803 åˆ—の場合
     3710            # 受け口配列の場合
    38043711            i = 0
    38053712            while i < len
     
    38823789    return if @b_reuse && ! $generate_all_template
    38833790    if ! ( @plugin && @plugin.gen_ep_func? ) then
    3884       return if $generate_no_template     # $generate_all_template より優å
    3885 ˆã•ã‚Œã‚‹
    3886 
    3887       # 参考として出力するテンプレートファイルであることを示すために "_templ" を付加する
     3791      return if $generate_no_template     # $generate_all_template より優先される
     3792
     3793      # 参考として出力するテンプレートファイルであることを示すために "_templ" を付加する
    38883794      fname = "#{$gen}/#{@global_name}_templ.#{$c_suffix}"
    38893795    else
    3890       # Plugin により生成されたセルタイプについては、原則的にテンプレートではなく、
    3891       # 修正不要なセルタイプの実è£
    3892 ã‚³ãƒ¼ãƒ‰ã‚’生成する.
    3893       # このため、ファイル名に _temp を付加しない
     3796      # Plugin により生成されたセルタイプについては、原則的にテンプレートではなく、
     3797      # 修正不要なセルタイプの実装コードを生成する.
     3798      # このため、ファイル名に _temp を付加しない
    38943799      fname = "#{$gen}/#{@global_name}.#{$c_suffix}"
    38953800    end
     
    39063811    gen_template_attr_access f
    39073812    gen_template_cp_fun f
    3908     # gen_template_types f     # 0805503 追加してみたが、やっぱりやめる
     3813    # gen_template_types f     # 0805503 追加してみたが、やっぱりやめる
    39093814    f.print( " *\n * #[</PREAMBLE>]# */\n\n" )
    39103815    f.printf TECSMsg.get( :PAC_comment ), "#_PAC_#"
     
    39123817    gen_template_private_header f
    39133818    if ( @plugin ) then
    3914       # このメソッドの引数は plugin.rb の説明を見よ
     3819      # このメソッドの引数は plugin.rb の説明を見よ
    39153820      @plugin.gen_preamble( f, @singleton, @name, @global_name )
    39163821    end
     
    39213826
    39223827    if ( @plugin ) then
    3923       # このメソッドの引数は plugin.rb の説明を見よ
     3828      # このメソッドの引数は plugin.rb の説明を見よ
    39243829      @plugin.gen_postamble( f, @singleton, @name, @global_name )
    39253830    end
     
    40753980      next if p.get_port_type != :ENTRY
    40763981      next if p.is_omit?
    4077       next if b_inline && ! p.is_inline?  # inline ポート
    4078       next if ! b_inline && p.is_inline?  # 非 inline ポート
     3982      next if b_inline && ! p.is_inline?  # inline ポート
     3983      next if ! b_inline && p.is_inline?  # 非 inline ポート
    40793984
    40803985      inline_prefix = ""
     
    41334038          len = items.length
    41344039        else
    4135           # ここで nil になるのは、引数なしの時に void がなかった場合
     4040          # ここで nil になるのは、引数なしの時に void がなかった場合
    41364041          items = []
    41374042          len = 0
     
    41534058
    41544059        if ( @plugin && @plugin.gen_ep_func? ) then
    4155           # このメソッドの引数は plugin.rb の説明を見よ
     4060          # このメソッドの引数は plugin.rb の説明を見よ
    41564061          @plugin.gen_ep_func_body( f, @singleton, @name, @global_name, p.get_signature.get_global_name, p.get_name, fun.get_name, "#{@global_name}_#{p.get_name}_#{fun.get_name}", functype, items )
    41574062
     
    42004105    if ! ( @plugin && @plugin.gen_ep_func? ) then
    42014106      return if @b_reuse && ! $generate_all_template
    4202       return if $generate_no_template     # $generate_all_template より優å
    4203 ˆã•ã‚Œã‚‹
    4204 
    4205       # 参考として出力するテンプレートファイルであることを示すために "_templ" を付加する
     4107      return if $generate_no_template     # $generate_all_template より優先される
     4108
     4109      # 参考として出力するテンプレートファイルであることを示すために "_templ" を付加する
    42064110      fname = "#{$gen}/#{@global_name}_inline_templ.#{$h_suffix}"
    42074111    else
    4208       # Plugin により生成されたセルタイプについては、原則的にテンプレートではなく、
    4209       # 修正不要なセルタイプの実è£
    4210 ã‚³ãƒ¼ãƒ‰ã‚’生成する.
    4211       # このため、ファイル名に _temp を付加しない
     4112      # Plugin により生成されたセルタイプについては、原則的にテンプレートではなく、
     4113      # 修正不要なセルタイプの実装コードを生成する.
     4114      # このため、ファイル名に _temp を付加しない
    42124115      fname = "#{$gen}/#{@global_name}_inline.#{$h_suffix}"
    42134116    end
     
    42324135
    42334136    if ( @plugin ) then
    4234       # このメソッドの引数は plugin.rb の説明を見よ
     4137      # このメソッドの引数は plugin.rb の説明を見よ
    42354138      @plugin.gen_postamble( f, @singleton, @name, @global_name )
    42364139    end
     
    42494152      if fa.get_name == :write then
    42504153
    4251         # 前後の " を取り除く
     4154        # 前後の " を取り除く
    42524155        # file_name = fa.get_file_name.sub( /^\"(.*)\"$/, "\\1" )
    42534156        file_name = CDLString.remove_dquote fa.get_file_name
    42544157        format = CDLString.remove_dquote fa.get_format
    4255         # format    = fa.get_format.sub( /^\"(.*)/, "\\1" )        # 前の " を取り除く
    4256         # format    = format.sub( /(.*)\"\z/, "\\1" )              # 後の " を取り除く
     4158        # format    = fa.get_format.sub( /^\"(.*)/, "\\1" )        # 前の " を取り除く
     4159        # format    = format.sub( /(.*)\"\z/, "\\1" )              # 後の " を取り除く
    42574160        format    = format.gsub( /\\\n/, "\n" )                  # \\\n => \n
    42584161
    42594162
    4260         # mikan 以下は subst_name で置換するように変更すべき
    4261         file_name = file_name.gsub( /(^|[^\$])\$ct\$/, "\\1#{@name}" )   # $ct$ をセルタイプ名に置換
    4262         file_name = file_name.gsub( /(^|[^\$])\$ct_global\$/, "\\1#{@global_name}" )   # $ct$ をセルタイプ名に置換
    4263         format    = format.gsub( /(^|[^\$])\$ct\$/, "\\1#{@name}" )   # $ct$ をセルタイプ名に置換
    4264         format    = format.gsub( /(^|[^\$])\$ct_global\$/, "\\1#{@global_name}" )   # $ct$ をセルタイプ名に置換
    4265         format    = format.gsub( /\$\$/, "\$" )                # $$ を $ に置換
     4163        # mikan 以下は subst_name で置換するように変更すべき
     4164        file_name = file_name.gsub( /(^|[^\$])\$ct\$/, "\\1#{@name}" )   # $ct$ をセルタイプ名に置換
     4165        file_name = file_name.gsub( /(^|[^\$])\$ct_global\$/, "\\1#{@global_name}" )   # $ct$ をセルタイプ名に置換
     4166        format    = format.gsub( /(^|[^\$])\$ct\$/, "\\1#{@name}" )   # $ct$ をセルタイプ名に置換
     4167        format    = format.gsub( /(^|[^\$])\$ct_global\$/, "\\1#{@global_name}" )   # $ct$ をセルタイプ名に置換
     4168        format    = format.gsub( /\$\$/, "\$" )                # $$ を $ に置換
    42664169
    42674170        if file_name[0] != ?/ then
     
    42754178            puts( format )
    42764179          end
    4277           # format 中の \n, \r, \t, \f と \" などを置換
     4180          # format 中の \n, \r, \t, \f と \" などを置換
    42784181          fmt = CDLString.escape format
    42794182          cfg_file.print( fmt )
     
    42924195    @ordered_cell_list.each{ |c|
    42934196
    4294       # cell のプロトタイプ宣言なら無視
     4197      # cell のプロトタイプ宣言なら無視
    42954198      next if ! c.is_generate?
    42964199
     
    43014204        if fa.get_name == :write then
    43024205
    4303           # 前後の " を取り除く
     4206          # 前後の " を取り除く
    43044207          # file_name = fa.get_file_name.sub( /^\"(.*)\"$/, "\\1" )
    43054208          file_name = CDLString.remove_dquote fa.get_file_name
    43064209          file_name = subst_name( file_name, name_array )
    4307           # format    = fa.get_format.sub( /^\"(.*)\"$/, "\\1" )        # 前後の "" を取り除く
     4210          # format    = fa.get_format.sub( /^\"(.*)\"$/, "\\1" )        # 前後の "" を取り除く
    43084211          format    = CDLString.remove_dquote fa.get_format
    4309           # format    = fa.get_format.sub( /^\"(.*)/, "\\1" )        # 前の " を取り除く
    4310           # format    = format.sub( /(.*)\"\z/, "\\1" )              # 後の " を取り除く
     4212          # format    = fa.get_format.sub( /^\"(.*)/, "\\1" )        # 前の " を取り除く
     4213          # format    = format.sub( /(.*)\"\z/, "\\1" )              # 後の " を取り除く
    43114214          format    = format.gsub( /\\\n/, "\n" )                  # \\\n => \n
    43124215
     
    43194222          end
    43204223
    4321           na = []     # シンボルを attribute の値に置き換えた後の引数
     4224          na = []     # シンボルを attribute の値に置き換えた後の引数
    43224225          if arg_list then
    43234226            arg_list.each { |a|
    43244227              case a[0]
    4325               when :STRING_LITERAL   # 文字列定数
    4326                 # s = a[1].sub( /^\"(.*)\"$/, "\\1" )            # 前後の "" を取り除く
     4228              when :STRING_LITERAL   # 文字列定数
     4229                # s = a[1].sub( /^\"(.*)\"$/, "\\1" )            # 前後の "" を取り除く
    43274230                s = CDLString.remove_dquote a[1]
    43284231                s = subst_name( s, name_array )
     
    43314234                na << s
    43324235              when :IDENTIFIER
    4333                 param_name = a[1]    # 識別子(属性の名前)
     4236                param_name = a[1]    # 識別子(属性の名前)
    43344237                attr = self.find( param_name )
    4335                 init = attr.get_initializer      # celltype で指定された初期値
    4336 
    4337                 # cell の join のリストから名前を探す
     4238                init = attr.get_initializer      # celltype で指定された初期値
     4239
     4240                # cell の join のリストから名前を探す
    43384241                j = c.get_join_list.get_item( param_name )
    4339                 if j then    # param_name の cell のジョインがあるか
    4340                   init = j.get_rhs                    # cell で指定された初期値を優å
    4341 ˆ
     4242                if j then    # param_name の cell のジョインがあるか
     4243                  init = j.get_rhs                    # cell で指定された初期値を優先
    43424244                end
    43434245
     
    43454247                                      # file,cell, name_array, type,          init, identifier,       indent, f_get_str
    43464248
    4347                 # str = str.sub( /^\"(.*)\"$/, "\\1" )            # 前後の "" を取り除く mikan ここで置換でよい?
     4249                # str = str.sub( /^\"(.*)\"$/, "\\1" )            # 前後の "" を取り除く mikan ここで置換でよい?
    43484250                str = CDLString.remove_dquote str
    43494251                na << str
     
    43634265            end
    43644266
    4365             # format 中の \n, \r, \t, \f と \" などを置換
     4267            # format 中の \n, \r, \t, \f と \" などを置換
    43664268            fmt = CDLString.escape format
    43674269            cfg_file.printf( fmt, *na )
     
    43874289    return if $generate_no_template
    43884290
    4389     # Makefile.templ の生成(追記)
     4291    # Makefile.templ の生成(追記)
    43904292
    43914293    f = AppFile.open( "#{$gen}/Makefile.templ" )
     
    43954297 
    43964298EOT
    4397 # この生成規則は2点で意味がない
    4398 ãƒ»$(GEN_DIR) に .o を生成するルールがない
    4399 ãƒ»ãƒ†ãƒ³ãƒ—レートコードをそのままビルドするのは紛らわしい
     4299# この生成規則は2点で意味がない
     4300・$(GEN_DIR) に .o を生成するルールがない
     4301・テンプレートコードをそのままビルドするのは紛らわしい
    44004302# # Celltype: #{@name}
    44014303# $(GEN_DIR)/#{@global_name}_tecsgen.o : $(GEN_DIR)/#{@global_name}_tecsgen.#{$c_suffix}
     
    44144316    headers = [ "$(GEN_DIR)/#{@global_name}_tecsgen.#{$h_suffix}", "$(GEN_DIR)/#{@global_name}_factory.#{$h_suffix}", "$(GEN_DIR)/global_tecsgen.#{$h_suffix}" ]
    44154317
    4416     # inline 受け口を持つか?
     4318    # inline 受け口を持つか?
    44174319    if @n_entry_port_inline > 0 then
    44184320      headers << "#{@global_name}_inline.#{$h_suffix}"
    44194321    end
    44204322
    4421     # 呼び口または受け口のシグニチャのヘッダ
     4323    # 呼び口または受け口のシグニチャのヘッダ
    44224324    @port.each { |p|
    44234325      next if p.is_omit?
     
    44444346  end
    44454347
    4446   #=== decl 用の dealloc コードを生成
    4447   #b_reset:: Bool:  リセット用の dealloc コードの生成 (NULL ポインタの場合 dealloc しない)
    4448   # mikan string 修飾されたポインタのå
    4449 ˆã«ãƒã‚¤ãƒ³ã‚¿ãŒæ¥ãªã„と仮定。ポインタ型を持つ構造体の可能性を排除していない
    4450   # このメソッドでは、行を出力する直前に " \\\n" を出力し、行末で改行文字を出力しない
     4348  #=== decl 用の dealloc コードを生成
     4349  #b_reset:: Bool:  リセット用の dealloc コードの生成 (NULL ポインタの場合 dealloc しない)
     4350  # mikan string 修飾されたポインタの先にポインタが来ないと仮定。ポインタ型を持つ構造体の可能性を排除していない
     4351  # このメソッドでは、行を出力する直前に " \\\n" を出力し、行末で改行文字を出力しない
    44514352  def gen_dealloc_code_for_type( f, type, dealloc_func_name, pre, name, post, level, b_reset, count_str = nil )
    44524353    type = type.get_original_type
     
    44774378        post2 = ""
    44784379        type2 = md.get_type.get_original_type
    4479         if type2.kind_of? PtrType then   # mikan typedef された型
     4380        if type2.kind_of? PtrType then   # mikan typedef された型
    44804381          if type2.get_count then
    44814382            count_str = type2.get_count.to_str( members_decl, pre2, post2 )
     
    45504451    end
    45514452
    4552     # 呼び口の結合å
    4553 ˆã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—のヘッダ(最適化の場合のみ)
    4554     # 結合å
    4555 ˆã®å—け口が inline の場合、inline ヘッダも
     4453    # 呼び口の結合先のセルタイプのヘッダ(最適化の場合のみ)
     4454    # 結合先の受け口が inline の場合、inline ヘッダも
    45564455    @port.each { |p|
    45574456      next if p.get_port_type != :CALL
     
    45594458
    45604459      if p.is_skelton_useless? || p.is_cell_unique? || p.is_VMT_useless? then
    4561         # 最適化コード (optimize) # スケルトン不要など
     4460        # 最適化コード (optimize) # スケルトン不要など
    45624461        p2 = p.get_real_callee_port
    45634462        if p2 then
     
    45694468          headers += ct.get_depend_header_list_( celltype_list )
    45704469        #else
    4571         #  optional で未結合 
     4470        #  optional で未結合 
    45724471        end
    45734472      end
     
    45774476
    45784477
    4579   #=== $id$, $ct$, $cb$, $idx$ 置換
     4478  #=== $id$, $ct$, $cb$, $idx$ 置換
    45804479  #
    4581   #  str に以下の置換を行う
    4582   #-   $ct$ ⇒ セルタイプ名(ct)
    4583   #-   $cell$ ⇒ セル名(cell)   cell が nil ならば3つの置換は行われない
    4584   #-   $cb$ ⇒ CB の C 言語名(cb)
    4585   #-   $cbp$ ⇒ CB へのポインタ(cbp)
    4586   #-   $cb_proto$ ⇒ CB の C 言語名プロトタイプ宣言用(cb_proto)
    4587   #-   $id$ ⇒ ct_cell
    4588   #-   $idx$ ⇒ idx
    4589   #-   $ID$ ⇒ id (整数の番号)
    4590   #-   $ct_global$ ⇒ セルタイプ名(ct)
    4591   #-   $cell_global$ ⇒ セル名(cell)   cell が nil ならば3つの置換は行われない
    4592   #-   $$   â‡’ $
     4480  #  str に以下の置換を行う
     4481  #-   $ct$ ⇒ セルタイプ名(ct)
     4482  #-   $cell$ ⇒ セル名(cell)   cell が nil ならば3つの置換は行われない
     4483  #-   $cb$ ⇒ CB の C 言語名(cb)
     4484  #-   $cbp$ ⇒ CB へのポインタ(cbp)
     4485  #-   $cb_proto$ ⇒ CB の C 言語名プロトタイプ宣言用(cb_proto)
     4486  #-   $id$ ct_cell
     4487  #-   $idx$ idx
     4488  #-   $ID$ ⇒ id (整数の番号)
     4489  #-   $ct_global$ ⇒ セルタイプ名(ct)
     4490  #-   $cell_global$ ⇒ セル名(cell)   cell が nil ならば3つの置換は行われない
     4491  #-   $$    $
    45934492  def subst_name( str, name_array )
    45944493    ct   = name_array[0]    # celltype name
    45954494    cell = name_array[1]    # cell name
    45964495    cb   = name_array[2]    # cell CB name
    4597     cb_init = name_array[3] # cell CB INIT, これは置換に使われない
     4496    cb_init = name_array[3] # cell CB INIT, これは置換に使われない
    45984497    cb_proto = name_array[4] # cell CB name for prototype
    45994498    id   = name_array[6]    # cell ID
     
    46154514      str = str.gsub( /(^|[^\$])\$cell_global\$/, "\\1#{cell_global}" )
    46164515    end
    4617     str = str.gsub( /\$\$/, "\$" )                       # $$ を $ に置換
     4516    str = str.gsub( /\$\$/, "\$" )                       # $$ を $ に置換
    46184517
    46194518    return str
     
    46224521end
    46234522
    4624 # Appendable File(追記可能ファイル)
     4523# Appendable File(追記可能ファイル)
    46254524class AppFile
    4626   # 開いたファイルのリスト
     4525  # 開いたファイルのリスト
    46274526  @@file_name_list = {}
    46284527
     
    46414540    end
    46424541
    4643     # 既に開いているか?
     4542    # 既に開いているか?
    46444543    if @@file_name_list[ name ] then
    46454544#2.0
    46464545      mode = "a" + mode
    4647       # 追記モードで開く
     4546      # 追記モードで開く
    46484547      file = File.open( real_name, mode )
    46494548    else
    46504549#2.0
    46514550      mode = "w" + mode
    4652       # 新規モードで開く(既にあれば、サイズを0にする)
     4551      # 新規モードで開く(既にあれば、サイズを0にする)
    46534552      file = File.open( real_name, mode )
    46544553      @@file_name_list[ name ] = true
    46554554    end
    4656     # File クラスのオブジェクトを返す
     4555    # File クラスのオブジェクトを返す
    46574556    return file
    46584557  end
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/location.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: location.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
     
    7762
    7863#==  Cell_location
    79   # tecscde の位置æƒ
    80 å ±
     64  # tecscde の位置情報
    8165  class  Cell_location
    8266
     
    10589
    10690  #==  Join_location
    107   # tecscde の位置æƒ
    108 å ±
     91  # tecscde の位置情報
    10992  class  Join_location
    11093    @@join_location_list = []
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/messages.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: messages.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
    55 #== TECS の生成する各国語化å¿
    56 è¦ãªæ–‡å­—列
    57 # 現状、エラーメッセージは英語のみ
    58 # 生成ファイルのコメントとして出力される文字列
     40#== TECS の生成する各国語化必要な文字列
     41# 現状、エラーメッセージは英語のみ
     42# 生成ファイルのコメントとして出力される文字列
    5943class TECSMsg
    6044
    61   #=== TECSMsg#生成するヘッダやテンプレートなどに含めるコメントの取得
    62   # CDL の文字コードに合わせて、文字コード変換を行う
     45  #=== TECSMsg#生成するヘッダやテンプレートなどに含めるコメントの取得
     46  # CDL の文字コードに合わせて、文字コード変換を行う
    6347  def self.get( msg )
    6448    str = @@comment[ msg ]
     
    7155  end
    7256
    73  #=== TECSMsg#ローカライズされたエラーメッセージを得る
    74  #body::String   : "S0001 error message body"  の形式
    75  # S0001 の部分が使用される
    76  # Generator.error2 から呼び出される
     57 #=== TECSMsg#ローカライズされたエラーメッセージを得る
     58 #body::String   : "S0001 error message body"  の形式
     59 # S0001 の部分が使用される
     60 # Generator.error2 から呼び出される
    7761 def self.get_error_message( body )
    78    body =~ /^[A-Z0-9]+/    # エラー番号を取り出す
     62   body =~ /^[A-Z0-9]+/    # エラー番号を取り出す
    7963   num = $&
    8064   if num then
     
    9175 end
    9276
    93  #=== TECSMsg#ローカライズされたウォーニングメッセージを得る
    94  # Generator.warning2 から呼び出される
     77 #=== TECSMsg#ローカライズされたウォーニングメッセージを得る
     78 # Generator.warning2 から呼び出される
    9579 def self.get_warning_message( body )
    96    body =~ /^[A-Z0-9]+/    # ウォーニング番号を取り出す
     80   body =~ /^[A-Z0-9]+/    # ウォーニング番号を取り出す
    9781   num = $&
    9882   msg = @@warning_message[ num.to_sym ]
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/optimize.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: optimize.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
     
    5843Other processes are setting ID for each cell and setting domain information
    5944
    60 ã“のファイルには、意味解析からコード生成の間で行うべき処理が含まれる.
    61 æœ€é©åŒ–もその一つである.
    62 ãã®ä»–に、セル毎の ID 付け、ドメインわけを行う.
    63 ã‚³ãƒ¼ãƒ‰ç”Ÿæˆå¯¾è±¡ã¨ãªã‚‹ã‚»ãƒ«ã‚’対象に処理を行うものが含まれる.
     45このファイルには、意味解析からコード生成の間で行うべき処理が含まれる.
     46最適化もその一つである.
     47その他に、セル毎の ID 付け、ドメインわけを行う.
     48コード生成対象となるセルを対象に処理を行うものが含まれる.
    6449=end
    6550
    6651class Namespace
    6752
    68   #===  各セルに ID (整数値)を割付ける
     53  #===  各セルに ID (整数値)を割付ける
    6954  def set_cell_id_and_domain
    70     # celltype の各セルに ID を割付ける
     55    # celltype の各セルに ID を割付ける
    7156    @celltype_list.each { |t|
    7257      t.set_cell_id_and_domain
    7358    }
    7459
    75     # サブネームスペースの各セルに ID を割付ける
     60    # サブネームスペースの各セルに ID を割付ける
    7661    @namespace_list.each { |n|
    7762      n.set_cell_id_and_domain
     
    8065
    8166  def optimize
    82     # celltype の最適化
     67    # celltype の最適化
    8368    @celltype_list.each { |t|
    8469      t.optimize
    8570    }
    8671
    87     # サブネームスペースの最適化
     72    # サブネームスペースの最適化
    8873    @namespace_list.each { |n|
    8974      n.optimize
     
    9277
    9378  def reset_optimize
    94     # celltype の最適化
     79    # celltype の最適化
    9580    @celltype_list.each { |t|
    9681      t.reset_optimize
    9782    }
    9883
    99     # サブネームスペースの最適化
     84    # サブネームスペースの最適化
    10085    @namespace_list.each { |n|
    10186      n.reset_optimize
     
    10691class Celltype
    10792
    108   ID_BASE = 1               # reset_optimize でリセットする
     93  ID_BASE = 1               # reset_optimize でリセットする
    10994  @@ID_BASE = ID_BASE
    11095
     
    11499  end
    115100
    116   #=== 各セルに ID (整数値)を割付ける
     101  #=== 各セルに ID (整数値)を割付ける
    117102  def set_cell_id
    118103
     
    122107
    123108    if $unique_id then
    124       @id_base = @@ID_BASE   # id をシステムå
    125 ¨ä½“で連番にする
     109      @id_base = @@ID_BASE   # id をシステム全体で連番にする
    126110    else
    127       @id_base = 1           # base を常に 1 から始める
     111      @id_base = 1           # base を常に 1 から始める
    128112    end
    129113
     
    131115    no_id_specified_cells = []
    132116
    133     # プロトタイプを除いた数を求める
     117    # プロトタイプを除いた数を求める
    134118    @cell_list.each{ |c|
    135119      if c.is_generate? then
     
    148132    }
    149133
    150     @ordered_cell_list = []   # id = 1 が添数 0 に格納される
    151     # ID 指定されているセルに id 番号を与える
     134    @ordered_cell_list = []   # id = 1 が添数 0 に格納される
     135    # ID 指定されているセルに id 番号を与える
    152136    id_specified_cells.each{ |c|
    153137      id = c.get_specified_id
     
    169153      end
    170154      @ordered_cell_list[ id - 1 ] = c
    171       # 通し番号とする場合のため @id_base を加える
     155      # 通し番号とする場合のため @id_base を加える
    172156      c.set_id( @id_base - 1 + id )
    173157      if $verbose then
     
    176160    }
    177161
    178     # ID 指定されていないセルに id 番号を与える
     162    # ID 指定されていないセルに id 番号を与える
    179163    i = 0
    180164    no_id_specified_cells.each{ |c|
     
    226210
    227211    @domain_roots.each{ |dn, regions|
    228       # domain_type は一つのノードに一つしかないので、一つの要素を無条件で取り出す
     212      # domain_type は一つのノードに一つしかないので、一つの要素を無条件で取り出す
    229213      if regions.length > 1 then
    230214        cdl_info( "celltype:#{@name} has cells in multi domain.\n" )
     
    239223  def optimize
    240224
    241     # port の参ç
    242 §ã™ã‚‹ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の数、セルの数を求める
     225    # port の参照するセルタイプの数、セルの数を求める
    243226    if $verbose then
    244227      print "=== optimizing celltype #{get_namespace_path.to_s} ===\n"
     
    248231      next if port.get_port_type != :CALL
    249232      if port.is_omit? then
    250         # 呼び口最適化実施
     233        # 呼び口最適化実施
    251234        @b_cp_optimized = true
    252         @n_call_port_omitted_in_CB += 1               # CB で省略する呼び口
    253         port.set_skelton_useless                      # スケルトン関数不要最適化
    254         port.set_VMT_useless                          # VMT 不要最適化 (直接受け口関数を呼出す)
     235        @n_call_port_omitted_in_CB += 1               # CB で省略する呼び口
     236        port.set_skelton_useless                      # スケルトン関数不要最適化
     237        port.set_VMT_useless                          # VMT 不要最適化 (直接受け口関数を呼出す)
    255238        if $verbose then
    256239          print "optimized by omit: port: #{port.get_name} : o\n"
     
    263246      end
    264247
    265       port_cells = []    # 呼びå
    266 ˆã‚»ãƒ«
    267       port_ports = []    # 呼びå
    268 ˆã®ãƒãƒ¼ãƒˆ
    269 
    270       # セルの参ç
    271 §ã™ã‚‹ã‚»ãƒ«ã‚’集める(ポートも一緒に集める)
     248      port_cells = []    # 呼び先セル
     249      port_ports = []    # 呼び先のポート
     250
     251      # セルの参照するセルを集める(ポートも一緒に集める)
    272252      @cell_list.each{ |cell|
    273253
     
    281261        if j then
    282262          if j.get_array_member2 then
    283             # 呼び口é
    284 åˆ—の場合、å
    285 ¨éƒ¨ã®çµåˆå
    286 ˆã‚’集める
     263            # 呼び口配列の場合、全部の結合先を集める
    287264            j.get_array_member2.each { |j2|
    288265              if j2 then
    289266                port_cells << j2.get_rhs_cell
    290                 port_ports << j2.get_rhs_port   # 右辺のポート
     267                port_ports << j2.get_rhs_port   # 右辺のポート
    291268              else
    292                 # optional で、ある添数のみ初期化されていない(すべて初期化されない場合は、下)
     269                # optional で、ある添数のみ初期化されていない(すべて初期化されない場合は、下)
    293270                port_cells << nil
    294271                port_ports << nil
     
    296273            }
    297274          else
    298             # å
    299 ¨ã¦ã®çµåˆå
    300 ˆã‚’集める
     275            # 全ての結合先を集める
    301276            port_cells << j.get_rhs_cell
    302             port_ports << j.get_rhs_port   # 右辺のポート
     277            port_ports << j.get_rhs_port   # 右辺のポート
    303278          end
    304279        else
    305           # optional で初期化されていない(nil を要素に加えておく)
     280          # optional で初期化されていない(nil を要素に加えておく)
    306281          port_cells << nil
    307           port_ports << nil   # 右辺のポート
     282          port_ports << nil   # 右辺のポート
    308283        end
    309284      }
    310285
    311       # 重複要素を取り除く
     286      # 重複要素を取り除く
    312287      port_cells.uniq!
    313288      port_ports.uniq!
    314289
    315       # 呼び口の呼びå
    316 ˆãŒä¸€ã¤ã®ãƒãƒ¼ãƒˆã ã‘か?
     290      # 呼び口の呼び先が一つのポートだけか?
    317291      if port_ports.length == 1 then
    318292
    319         # 呼び口é
    320 åˆ—が可変長の場合、最適化しない
    321              # mikan 呼び口é
    322 åˆ—要素数マクロ不å
    323 ·åˆæš«å®šå¯¾ç­–
    324              # より望ましい修正は、受け口へのポインタは省略するが、é
    325 åˆ—個数は出力する(#_CP_#, #_TCP_#)
    326              # さらにé
    327 åˆ—個数が定数化できるのであれば、定数マクロを出力 (#_NCPA_#)
     293        # 呼び口配列が可変長の場合、最適化しない
     294             # mikan 呼び口配列要素数マクロ不具合暫定対策
     295             # より望ましい修正は、受け口へのポインタは省略するが、配列個数は出力する(#_CP_#, #_TCP_#)
     296             # さらに配列個数が定数化できるのであれば、定数マクロを出力 (#_NCPA_#)
    328297        next if port.get_array_size == "[]"
    329298
    330         # 呼び口最適化実施
     299        # 呼び口最適化実施
    331300        @b_cp_optimized = true
    332301
    333         # 呼びå
    334 ˆãŒä¸€ã¤ã®ã‚»ãƒ«ã ã‘か?
     302        # 呼び先が一つのセルだけか?
    335303        if port_cells.length == 1 then
    336304
    337           # 呼び口は optional で初期化されていない、または受け口はé
    338 åˆ—ではないか?
     305          # 呼び口は optional で初期化されていない、または受け口は配列ではないか?
    339306          if port_ports[0] == nil || port_ports[0].get_array_size == nil then
    340307
    341             @n_call_port_omitted_in_CB += 1               # CB で省略する呼び口
    342             port.set_cell_unique                          # セル一つだけ最適化
    343             port.set_skelton_useless                      # スケルトン関数不要最適化
    344             port.set_VMT_useless                          # VMT 不要最適化 (直接受け口関数を呼出す)
     308            @n_call_port_omitted_in_CB += 1               # CB で省略する呼び口
     309            port.set_cell_unique                          # セル一つだけ最適化
     310            port.set_skelton_useless                      # スケルトン関数不要最適化
     311            port.set_VMT_useless                          # VMT 不要最適化 (直接受け口関数を呼出す)
    345312
    346313            if $verbose then
     
    348315            end
    349316          else
    350             port.set_VMT_useless                          # VMT 不要最適化 (スケルトン関数を呼出す)
     317            port.set_VMT_useless                          # VMT 不要最適化 (スケルトン関数を呼出す)
    351318
    352319            if $verbose then
     
    355322          end
    356323
    357         else  # 呼びå
    358 ˆãŒè¤‡æ•°ã®ã‚»ãƒ«ï¼ˆå˜ä¸€ã®ãƒãƒ¼ãƒˆï¼‰
    359 
    360           # 呼び口は optional で初期化されていない、または受け口はé
    361 åˆ—ではないか?
     324        else  # 呼び先が複数のセル(単一のポート)
     325
     326          # 呼び口は optional で初期化されていない、または受け口は配列ではないか?
    362327          if port_ports[0] == nil || port_ports[0].get_array_size == nil then
    363328            if ! @singleton then
    364               port.set_skelton_useless                    # スケルトン関数不要最適化
    365               port.set_VMT_useless                        # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す)
     329              port.set_skelton_useless                    # スケルトン関数不要最適化
     330              port.set_VMT_useless                        # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す)
    366331
    367332              if $verbose then
     
    369334              end
    370335            else
    371               port.set_VMT_useless                           # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す)
     336              port.set_VMT_useless                           # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す)
    372337
    373338              if $verbose then
     
    379344
    380345        port.set_only_callee( port_ports[0], port_cells[0] )
    381            # set_cell_unique でない場合 cell は意味がない
     346           # set_cell_unique でない場合 cell は意味がない
    382347
    383348      end
     
    387352    }
    388353
    389     # 受け口最適化の設定
     354    # 受け口最適化の設定
    390355    @port.each{ |port|
    391356      next if port.get_port_type != :CALL
    392357
    393       # 呼び口側の最適化状æ
    394 ‹
     358      # 呼び口側の最適化状態
    395359      b_VMT_useless     = port.is_VMT_useless?
    396360      b_skelton_useless = port.is_skelton_useless?
    397361
    398       # セルの参ç
    399 §ã™ã‚‹ã‚»ãƒ«ã‚’集める(ポートも一緒に集める)
     362      # セルの参照するセルを集める(ポートも一緒に集める)
    400363      @cell_list.each{ |cell|
    401364
     
    407370        j = jl.get_item( port.get_name )
    408371
    409         if j then    # optional で結合されていない場合 nil
     372        if j then    # optional で結合されていない場合 nil
    410373          if j.get_array_member2 then
    411             # 呼び口é
    412 åˆ—
     374            # 呼び口配列
    413375            j.get_array_member2.each { |j2|
    414376              if j2 then
    415                 port2 = j2.get_rhs_port   # 右辺のポート
    416                 # 受け口側の最適化可能性を設定
     377                port2 = j2.get_rhs_port   # 右辺のポート
     378                # 受け口側の最適化可能性を設定
    417379                port2.set_entry_VMT_skelton_useless( b_VMT_useless, b_skelton_useless )
    418380              #else
    419               #  optional で呼び口é
    420 åˆ—要素が初期化されていない
     381              #  optional で呼び口配列要素が初期化されていない
    421382              end
    422383            }
    423384          else
    424             port2 = j.get_rhs_port      # 右辺のポート
    425             # 受け口側の最適化可能性を設定
     385            port2 = j.get_rhs_port      # 右辺のポート
     386            # 受け口側の最適化可能性を設定
    426387            port2.set_entry_VMT_skelton_useless( b_VMT_useless, b_skelton_useless )
    427388          end
     
    431392  end
    432393
    433   #Celltype# リセットする
     394  #Celltype# リセットする
    434395  def reset_optimize
    435     @@ID_BASE = ID_BASE      # 本当は一回だけでよい
    436     @id_base = 1             # set_cell_id でリセットされるので不要
    437 
    438     @b_cp_optimized = false  # 呼び口最適化
    439     @n_call_port_omitted_in_CB = 0 # 呼び口最適化により不生成となったポートの数
    440     @n_cell_gen = 0          # 生成セル個数
     396    @@ID_BASE = ID_BASE      # 本当は一回だけでよい
     397    @id_base = 1             # set_cell_id でリセットされるので不要
     398
     399    @b_cp_optimized = false  # 呼び口最適化
     400    @n_call_port_omitted_in_CB = 0 # 呼び口最適化により不生成となったポートの数
     401    @n_cell_gen = 0          # 生成セル個数
    441402    @port.each{ |p|
    442403      p.reset_optimize
     
    446407  end
    447408
    448   #Celltype# ヘッダは include されているか
    449   #hname::Symbol : ヘッダ名
    450   #RETURN:: bool_t: false インクルードされていない、true インクルードされている
    451   # #_ISH_#, #_ICT_# でヘッダが取り込まれているかチェックする
    452   # false が返った場合、hname は登録されて、次回の呼び出しでは true が返る
     409  #Celltype# ヘッダは include されているか
     410  #hname::Symbol : ヘッダ名
     411  #RETURN:: bool_t: false インクルードされていない、true インクルードされている
     412  # #_ISH_#, #_ICT_# でヘッダが取り込まれているかチェックする
     413  # false が返った場合、hname は登録されて、次回の呼び出しでは true が返る
    453414  def header_included?( hname )
    454415    if @included_header[ hname ] == nil then
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/plugin.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: plugin.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
    55 #== class モジュール
    56 # ThroughPlugin, SignaturePlugin, CelltypePlugin に include する
     40#== class モジュール
     41# ThroughPlugin, SignaturePlugin, CelltypePlugin に include する
    5742class Plugin < Node
    58 #@error_backlog:: [msg1, msg2, ... ]   @locale が設定される前に発生したエラー
     43#@error_backlog:: [msg1, msg2, ... ]   @locale が設定される前に発生したエラー
    5944
    6045  PluginArgProc = {
     
    6550    super
    6651    @b_silent = false
    67     @locale = nil       # set_locale が呼び出されるまで nil となる
     52    @locale = nil       # set_locale が呼び出されるまで nil となる
    6853    @error_backlog = []
    6954  end
    7055
    7156  #=== Plugin#cdl_error
    72   # set_locale が呼び出されるまで @error_backlog に保存し保留する
     57  # set_locale が呼び出されるまで @error_backlog に保存し保留する
    7358  def cdl_error *arg
    7459    if @locale then
     
    7964  end
    8065
    81   #=== locale を設定する
    82   # Node は initialize で locale を設定するが、plugin は parse とは
    83   # 異なるタイミング new されるため、locale を再設定する
    84   # このメソッドを2度呼び出すと @error_backlog のエラーが2度出力されてしまう
     66  #=== locale を設定する
     67  # Node は initialize で locale を設定するが、plugin は parse とは
     68  # 異なるタイミング new されるため、locale を再設定する
     69  # このメソッドを2度呼び出すと @error_backlog のエラーが2度出力されてしまう
    8570  def set_locale locale
    8671    @locale = locale
     
    9075  end
    9176
    92 ### 意味解析段階で呼び出されるメソッド ###
    93   #===  CDL ファイルの生成
    94   #      typedef, signature, celltype, cell のコードを生成
    95   #      重複して生成してはならない
    96   #      すでに生成されている場合は出力しないこと。
    97   #      もしくは同名の import により、重複を避けること。
    98   #file::        FILE       ç”Ÿæˆã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«
     77### 意味解析段階で呼び出されるメソッド ###
     78  #===  CDL ファイルの生成
     79  #      typedef, signature, celltype, cell のコードを生成
     80  #      重複して生成してはならない
     81  #      すでに生成されている場合は出力しないこと。
     82  #      もしくは同名の import により、重複を避けること。
     83  #file::        FILE       生成するファイル
    9984  def gen_cdl_file file
    10085  end
    10186
    10287
    103 ### コード生段階で呼び出されるメソッド ###
    104   #=== プラグインは gen_ep_func を提供するか
    105   # gen_ep_func 定義   â‡’ テンプレートではない、セルタイプコード(tCelltype.c)を生成
    106   # gen_ep_func 未定義 ⇒ テンプレート(tCelltype_templ.c)を生成
     88### コード生段階で呼び出されるメソッド ###
     89  #=== プラグインは gen_ep_func を提供するか
     90  # gen_ep_func 定義   ⇒ テンプレートではない、セルタイプコード(tCelltype.c)を生成
     91  # gen_ep_func 未定義 ⇒ テンプレート(tCelltype_templ.c)を生成
    10792  def gen_ep_func?
    10893    self.class.method_defined?( :gen_ep_func_body )
    10994  end
    11095
    111   #===  受け口関数の本体(C言語)を生成する
    112   #     ãƒ—ラグインの場合、変更するå¿
    113 è¦ã®ãªã„セルタイプコードを生成する
    114   #     ã“のメソッドが未定義であれば、プラグインはセルタイプコードを生成しない (通常通りテンプレートを生成する)
    115   #      gen_cdl_file の中で生成されたセルタイプに対して呼び出される
    116   #file::           FILE        出力å
    117 ˆãƒ•ã‚¡ã‚¤ãƒ« (tCelltype.c)
     96  #===  受け口関数の本体(C言語)を生成する
     97  #     プラグインの場合、変更する必要のないセルタイプコードを生成する
     98  #     このメソッドが未定義であれば、プラグインはセルタイプコードを生成しない (通常通りテンプレートを生成する)
     99  #      gen_cdl_file の中で生成されたセルタイプに対して呼び出される
     100  #file::           FILE        出力先ファイル (tCelltype.c)
    118101  #b_singleton::    bool        true if singleton
    119102  #ct_name::        Symbol
     
    127110#  end
    128111
    129   #===  受け口関数の preamble (C言語)を生成する
    130   #     å¿
    131 è¦ãªã‚‰ preamble 部に出力する
    132   #      gen_cdl_file の中でで生成されたセルタイプに対して呼び出される
    133   #file::           FILE        出力å
    134 ˆãƒ•ã‚¡ã‚¤ãƒ«
     112  #===  受け口関数の preamble (C言語)を生成する
     113  #     必要なら preamble 部に出力する
     114  #      gen_cdl_file の中でで生成されたセルタイプに対して呼び出される
     115  #file::           FILE        出力先ファイル
    135116  #b_singleton::    bool        true if singleton
    136117  #ct_name::        Symbol
    137118  #global_ct_name:: string
    138119  def gen_preamble( file, b_singleton, ct_name, global_ct_name )
    139     # デフォルトでは何も出力しない
    140   end
    141 
    142   #===  受け口関数の postamble (C言語)を生成する
    143   #     å¿
    144 è¦ãªã‚‰ postamble 部に出力する
    145   #      gen_cdl_file の中で生成されたセルタイプに対して呼び出される
    146   #file::           FILE        出力å
    147 ˆãƒ•ã‚¡ã‚¤ãƒ«
     120    # デフォルトでは何も出力しない
     121  end
     122
     123  #===  受け口関数の postamble (C言語)を生成する
     124  #     必要なら postamble 部に出力する
     125  #      gen_cdl_file の中で生成されたセルタイプに対して呼び出される
     126  #file::           FILE        出力先ファイル
    148127  #b_singleton::    bool        true if singleton
    149128  #ct_name::        Symbol
    150129  #global_ct_name:: string
    151130  def gen_postamble( file, b_singleton, ct_name, global_ct_name )
    152     # デフォルトでは何も出力しない
    153   end
    154 
    155   #=== gen_cdl_file の中で生成されたセルタイプに新しいセルが生成された
    156   # どのセルタイプかは cell.get_celltype で分かる
     131    # デフォルトでは何も出力しない
     132  end
     133
     134  #=== gen_cdl_file の中で生成されたセルタイプに新しいセルが生成された
     135  # どのセルタイプかは cell.get_celltype で分かる
    157136  #
    158   #file::           FILE        出力å
    159 ˆãƒ•ã‚¡ã‚¤ãƒ«
     137  #file::           FILE        出力先ファイル
    160138  #b_singleton::    bool        true if singleton
    161139  #ct_name::        Symbol
    162140  #global_ct_name:: string
    163141  def new_cell cell
    164     # デフォルトでは何もしない
    165   end
    166 
    167 ### プラグイン引数の解釈 ###
     142    # デフォルトでは何もしない
     143  end
     144
     145### プラグイン引数の解釈 ###
    168146  def parse_plugin_arg
    169147    arg = @plugin_arg_str.dup
    170148
    171     # 改行を消す
     149    # 改行を消す
    172150    arg.gsub!( /\\\n/, "" )
    173151
    174152    while arg != ""
    175153
    176       # 前の空白読み飛ばす
     154      # 前の空白読み飛ばす
    177155      arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1')
    178156
    179       #  識別子取得
     157      #  識別子取得
    180158      if arg =~ /\A[a-zA-Z_]\w*/ then
    181159        ident = $~
     
    186164      end
    187165     
    188       # 前の空白読み飛ばす
     166      # 前の空白読み飛ばす
    189167      arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1')
    190168
     
    196174      end
    197175
    198       # 前の空白読み飛ばす
     176      # 前の空白読み飛ばす
    199177      arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1')
    200178
    201       # 右辺文字列
    202       if arg =~ /\A\\"(.*?)\\"\s*,/ then      # \"  \" で囲まれている場合
    203         rhs = $1
    204         remain = $'
    205       elsif arg =~ /\A%(.*?)%\s*,/ then      # %   % で囲まれている場合
    206         rhs = $1
    207         remain = $'
    208       elsif arg =~ /\A!(.*?)!\s*,/ then    # $   $ で囲まれている場合
    209         rhs = $1
    210         remain = $'
    211       elsif arg =~ /\A'(.*?)'\s*,/ then    # $   $ で囲まれている場合
    212         rhs = $1
    213         remain = $'
    214       elsif  arg =~ /\A\\"(.*?)\\"\s*,/ then  # || にも [,$] にもできなかった
     179      # 右辺文字列
     180      if arg =~ /\A\\"(.*?)\\"\s*,/ then      # \"  \" で囲まれている場合
     181        rhs = $1
     182        remain = $'
     183      elsif arg =~ /\A%(.*?)%\s*,/ then      # %   % で囲まれている場合
     184        rhs = $1
     185        remain = $'
     186      elsif arg =~ /\A!(.*?)!\s*,/ then    # $   $ で囲まれている場合
     187        rhs = $1
     188        remain = $'
     189      elsif arg =~ /\A'(.*?)'\s*,/ then    # $   $ で囲まれている場合
     190        rhs = $1
     191        remain = $'
     192      elsif  arg =~ /\A\\"(.*?)\\"\s*,/ then  # || にも [,$] にもできなかった
    215193        rhs = $1
    216194        remain = $'
    217195      # elsif arg =~ /\A(.*?)\s*$/ then
    218       elsif arg =~ /\A\\"(.*?)\\"\s*\z/ then      # \"  \" で囲まれている場合
    219         rhs = $1
    220         remain = $'
    221       elsif arg =~ /\A%(.*?)%\s*\z/ then      # %   % で囲まれている場合
    222         rhs = $1
    223         remain = $'
    224       elsif arg =~ /\A!(.*?)!\s*\z/ then    # $   $ で囲まれている場合
    225         rhs = $1
    226         remain = $'
    227       elsif arg =~ /\A'(.*?)'\s*\z/ then    # $   $ で囲まれている場合
    228         rhs = $1
    229         remain = $'
    230       elsif  arg =~ /\A\\"(.*?)\\"\s*\z/ then  # || にも [,$] にもできなかった
     196      elsif arg =~ /\A\\"(.*?)\\"\s*\z/ then      # \"  \" で囲まれている場合
     197        rhs = $1
     198        remain = $'
     199      elsif arg =~ /\A%(.*?)%\s*\z/ then      # %   % で囲まれている場合
     200        rhs = $1
     201        remain = $'
     202      elsif arg =~ /\A!(.*?)!\s*\z/ then    # $   $ で囲まれている場合
     203        rhs = $1
     204        remain = $'
     205      elsif arg =~ /\A'(.*?)'\s*\z/ then    # $   $ で囲まれている場合
     206        rhs = $1
     207        remain = $'
     208      elsif  arg =~ /\A\\"(.*?)\\"\s*\z/ then  # || にも [,$] にもできなかった
    231209        rhs = $1
    232210        remain = $'
     
    234212        rhs = $1
    235213        remain = $'
    236         # 前の空白読み飛ばす
     214        # 前の空白読み飛ばす
    237215        rhs.sub!( /\A\s*(.*)\s*\z/, '\1')
    238216      elsif arg =~ /\A(.*?)\s*\z/ then
     
    244222      end
    245223
    246       # 0文字の文字列を to_sym すると例外発生するので空白文字とする
     224      # 0文字の文字列を to_sym すると例外発生するので空白文字とする
    247225      if rhs == "" then
    248226        rhs = " "
    249227      end
    250228
    251       arg = remain         # arg の残りの部分
    252       arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1')      # 前の空白読み飛ばす
    253 
    254       # \ を外す
    255       rhs = rhs.gsub( /\\(.)/, "\\1" )   # ここで $' が変わることに注意!
     229      arg = remain         # arg の残りの部分
     230      arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1')      # 前の空白読み飛ばす
     231
     232      # \ を外す
     233      rhs = rhs.gsub( /\\(.)/, "\\1" )   # ここで $' が変わることに注意!
    256234      # print "parse_plugin_arg:  #{ident} #{rhs}\n"
    257235      @plugin_arg_list[ ident ] = rhs
     
    262240  end
    263241
    264   #=== プラグイン引数をチェックする
    265   # @plugin_arg_check_proc_tab に従ってプラグイン引数をチェックすする
    266   # 古い用法:子クラスでオーバーライドし、引数識別子が正しいかチェックする
    267   #ident:: string: 引数識別子
    268   #rhs:: string: 右辺文字列
     242  #=== プラグイン引数をチェックする
     243  # @plugin_arg_check_proc_tab に従ってプラグイン引数をチェックすする
     244  # 古い用法:子クラスでオーバーライドし、引数識別子が正しいかチェックする
     245  #ident:: string: 引数識別子
     246  #rhs:: string: 右辺文字列
    269247  def check_plugin_arg( ident, rhs )
    270248
     
    291269  end
    292270
    293   #=== プラグインのメッセージ出力
     271  #=== プラグインのメッセージ出力
    294272  def print_msg( msg )
    295273    if @b_silent == true then
     
    299277  end
    300278
    301   #=== プラグイン引数 silent
     279  #=== プラグイン引数 silent
    302280  def set_silent rhs
    303281    if rhs == "true" || rhs == nil then
     
    307285end
    308286
    309 #== 出力文字列を EUC から出力ファイルに convert する
    310 # tecsgen のソースコードは EUC で記述されている
    311 # これを、出力ファイルの文字コードに変換して出力する
     287#== 出力文字列を EUC から出力ファイルに convert する
     288# tecsgen のソースコードは EUC で記述されている
     289# これを、出力ファイルの文字コードに変換して出力する
    312290#
    313 # generate.rb で出力するものは message.rb で変換している
    314 # generate.rb で出力するものは APPFile クラスを使用している
    315 # mikan: CFile で出力したものに factory で追記できない (cdl ファイルの場合、追記できても意味がない)
     291# generate.rb で出力するものは message.rb で変換している
     292# generate.rb で出力するものは APPFile クラスを使用している
     293# mikan: CFile で出力したものに factory で追記できない (cdl ファイルの場合、追記できても意味がない)
    316294class CFile
    317295  def self.open( path, mode )
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/pluginModule.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: pluginModule.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
    55 #== プラグインをロードする側のモジュール
     40#== プラグインをロードする側のモジュール
    5641# @@loaded_plugin_list:: {Symbol=>Integer}
    5742module PluginModule
     
    5944  @@loaded_plugin_list = {}
    6045
    61   #=== プラグインをロードする
    62   #return:: true : 成功、 false : 失敗
     46  #=== プラグインをロードする
     47  #return:: true : 成功、 false : 失敗
    6348  #
    64   # すでにロードされているものは、重複してロードしない
    65   # load 時の例外はこのメソッドの中でキャッチされて false が返される
     49  # すでにロードされているものは、重複してロードしない
     50  # load 時の例外はこのメソッドの中でキャッチされて false が返される
    6651  def load_plugin( plugin_name, superClass )
    6752
     
    7358          print( "load '#{plugin_name}.rb'\n" )
    7459        end
    75         # "#{plugin_name}.rb" をロード(システム用ではないので、fatal エラーにしない)
     60        # "#{plugin_name}.rb" をロード(システム用ではないので、fatal エラーにしない)
    7661        if require_tecsgen_lib( "#{plugin_name}.rb", false ) == false
    7762          cdl_error( "P2001 $1.rb : fail to load plugin" , plugin_name )
     
    10186  end
    10287
    103   #=== プラグインの gen_cdl_file を呼びして cdl ファイルを生成させ、解釈を行う
     88  #=== プラグインの gen_cdl_file を呼びして cdl ファイルを生成させ、解釈を行う
    10489  def generate_and_parse plugin_object
    105     if plugin_object == nil     # プラグインのロードに失敗している(既にエラー)
     90    if plugin_object == nil     # プラグインのロードに失敗している(既にエラー)
    10691      return
    10792    end
     
    10994    if @@loaded_plugin_list[ plugin_name ] == nil
    11095      raise "#{plugin_name} might have different name "
    111       # プラグインのファイル名と、プラグインのクラス名が相違する場合
     96      # プラグインのファイル名と、プラグインのクラス名が相違する場合
    11297    end
    11398    count = @@loaded_plugin_list[ plugin_name ]
     
    141126  end
    142127
    143   #=== プラグインが CDL の POST コードを生成
    144   # tmp_plugin_post_code.cdl への出力
     128  #=== プラグインが CDL の POST コードを生成
     129  # tmp_plugin_post_code.cdl への出力
    145130  def self.gen_plugin_post_code file
    146131    dbgPrint "PluginModule #{@@loaded_plugin_list}\n"
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/syntaxobj.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2016 by TOPPERS Project
    77#--
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: syntaxobj.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
    55 # mikan ruby の symbol と文字列の使い分けがどうしてもうまくいかないことが時ã€
    56 ã‚るので name.to_sym をå
    57 ¥ã‚Œã‚‹ã“とにした
     40# mikan ruby の symbol と文字列の使い分けがどうしてもうまくいかないことが時々あるので name.to_sym を入れることにした
    5841
    5942#== Node
    6043#
    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
    6446#
    65 # owner を持たないものが Node となる
    66 # エラーは、cdl_error を通じて報告する (意味解析が構文解析後に行われる場合には、行番号が正しく出力できる
     47# owner を持たないものが Node となる
     48# エラーは、cdl_error を通じて報告する (意味解析が構文解析後に行われる場合には、行番号が正しく出力できる
    6749#
    6850
     
    7456  end
    7557
    76   #=== エラーを出力する
     58  #=== エラーを出力する
    7759  def cdl_error( message, *arg )
    7860    Generator.error2( @locale, message, *arg )
    7961  end
    8062
    81   #=== エラーを出力する
    82   #locale:: Array(locale info) : 構文解析中は無視される
     63  #=== エラーを出力する
     64  #locale:: Array(locale info) : 構文解析中は無視される
    8365  def cdl_error2( locale, message, *arg )
    8466    Generator.error2( locale, message, *arg )
    8567  end
    8668
    87   #=== エラーを出力する
     69  #=== エラーを出力する
    8870  #locale:: Array(locale info)
    89   # 構文解析中 cdl_error2 では locale が無視されるため、別に locale を出力する
     71  # 構文解析中 cdl_error2 では locale が無視されるため、別に locale を出力する
    9072  def cdl_error3( locale, message, *arg )
    9173    Generator.error(  message, *arg )
     
    9375  end
    9476
    95   #=== ウォーニング出力する
     77  #=== ウォーニング出力する
    9678  def cdl_warning( message, *arg )
    9779    Generator.warning2( @locale, message, *arg )
    9880  end
    9981
    100   #=== ウォーニング出力する
     82  #=== ウォーニング出力する
    10183  def cdl_warning2( locale, message, *arg )
    10284    Generator.warning2( locale, message, *arg )
    10385  end
    10486
    105   #=== æƒ
    106 å ±ã‚’表示する
     87  #=== 情報を表示する
    10788  def cdl_info( message )
    10889    Console.puts "info: #{message}"
     
    122103end
    123104
    124 #== 双方向 Node (Bi Direction Node)
     105#== 双方向 Node (Bi Direction Node)
    125106#
    126 #  Node の子クラス
    127 #  owner Node から参ç
    128 §ã•ã‚Œã¦ã„るもの (owner へのリンクも取り出せる)
     107#  Node の子クラス
     108#  owner Node から参照されているもの (owner へのリンクも取り出せる)
    129109#
    130 #  get_owner で得られるもの
     110#  get_owner で得られるもの
    131111#    FuncHead => Signature
    132112#    Decl => Namespace(const), Typedef(typedef),
     
    134114#            Struct(member), ParamDecl(parameter), FuncHead(funchead)
    135115#    Signature, Celltype, CompositeCelltype, Typedef => Namespace
    136 #,   Namespace => Namespace, Generator.class (root Namespace の場合)
     116#,   Namespace => Namespace, Generator.class (root Namespace の場合)
    137117#    Cell => Region, CompositeCelltype(in_composite)
    138118#    Port => Celltype, Composite
     
    144124#    ParamList => FuncHead
    145125#    Expression => Namespace
    146 #    大半のものは new_* メソッドで owner Node に伝達される
    147 #    そのメソッドが呼び出されたときに owner Node が記録される
    148 #    new_* がないもの:
     126#    大半のものは new_* メソッドで owner Node に伝達される
     127#    そのメソッドが呼び出されたときに owner Node が記録される
     128#    new_* がないもの:
    149129#            Decl(parameter), ParamDecl, ParamList, FuncHead, Expression
    150130#
    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 を持たない
    154134#
    155135class BDNode < Node
     
    167147  end
    168148
    169   #=== owner を設定する
     149  #=== owner を設定する
    170150  def set_owner owner
    171151    dbgPrint "set_owner: #{owner.class.name}\n"
     
    173153  end
    174154
    175   #=== owner を得る
    176   # class の説明を参ç
    177 §
     155  #=== owner を得る
     156  # class の説明を参照
    178157  def get_owner
    179158    if @owner == nil
     
    184163end
    185164
    186 #== Namespace 名を持つ BDNode
     165#== Namespace 名を持つ BDNode
    187166# Namespace(Region), Signature, Celltype, CompositeCelltype, Cell
    188167class NSBDNode < BDNode
     
    192171  end
    193172
    194   #=== 属する namespace を得る
    195   # owner を namespace にたどり着くまで上にたどる
     173  #=== 属する namespace を得る
     174  # owner を namespace にたどり着くまで上にたどる
    196175  def get_namespace
    197176    if @owner.kind_of? Namespace
     
    200179      return @owner.get_namespace
    201180    else
    202       # @owner == nil なら "::"
     181      # @owner == nil なら "::"
    203182      if @name != "::" then
    204183        raise "non-root namespace has no owner #{self.class.name}##{@name} #{self}"
     
    217196  end
    218197
    219   #=== NamespacePath を得る
     198  #=== NamespacePath を得る
    220199  def get_namespace_path
    221200    return @NamespacePath
     
    226205      return @import.is_imported?
    227206    else
    228       return false    # mikan: ä»® @import が nil になるケースが追求できていない
     207      return false    # mikan: 仮 @import が nil になるケースが追求できていない
    229208    end
    230209  end
     
    233212class NamedList
    234213#  @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       エラーメッセージ
    239217
    240218  def initialize( item, type )
     
    245223  end
    246224
    247   #=== 要素を加える
    248   # parse した時点で加えること(場所を記憶する)
     225  #=== 要素を加える
     226  # parse した時点で加えること(場所を記憶する)
    249227  def add_item( item )
    250228
     
    305283  end
    306284
    307   #=== composite cell を clone した時に要素(JOIN) の clone する
     285  #=== composite cell を clone した時に要素(JOIN) の clone する
    308286  #
    309   # mikan このメソッドは Join に特化されているので NamedList から分離すべき
     287  # mikan このメソッドは Join に特化されているので NamedList から分離すべき
    310288  def clone_for_composite( ct_name, cell_name, locale )
    311289    cl = self.clone
     
    314292  end
    315293
    316   #=== clone された NamedList インスタンスの参ç
    317 §ã™ã‚‹ã‚‚の(item)を clone
     294  #=== clone された NamedList インスタンスの参照するもの(item)を clone
    318295  #
    319   # mikan このメソッドは Join に特化されているので NamedList から分離すべき
     296  # mikan このメソッドは Join に特化されているので NamedList から分離すべき
    320297  def set_cloned( ct_name, cell_name, locale )
    321298    items = []
     
    379356end
    380357
    381 #== 関数頭部
    382 # signature に登録される関数
     358#== 関数頭部
     359# signature に登録される関数
    383360class FuncHead <BDNode
    384361#  @declarator:: Decl
     
    425402  end
    426403
    427   #=== FuncHead# 関数の名前を返す
     404  #=== FuncHead# 関数の名前を返す
    428405  def get_name
    429406    return @declarator.get_name
    430407  end
    431408
    432   #=== FuncHead# 関数の戻り値の型を返す
    433   # types.rb に定義されている型
    434   # 関数ヘッダの定義として不完å
    435 ¨ãªå ´åˆ nil を返す
     409  #=== FuncHead# 関数の戻り値の型を返す
     410  # types.rb に定義されている型
     411  # 関数ヘッダの定義として不完全な場合 nil を返す
    436412  def get_return_type
    437413    if is_function? then
     
    440416  end
    441417
    442   #=== FuncHead# 関数の引数のリストを返す
    443   # ParamList を返す
    444   # 関数ヘッダの定義として不完å
    445 ¨ãªå ´åˆ nil を返す
     418  #=== FuncHead# 関数の引数のリストを返す
     419  # ParamList を返す
     420  # 関数ヘッダの定義として不完全な場合 nil を返す
    446421  def get_paramlist
    447422    if is_function? then
     
    457432end
    458433
    459 #=== 宣言
    460 # @kind で示される各種の宣言
     434#=== 宣言
     435# @kind で示される各種の宣言
    461436class Decl < BDNode
    462437
    463438# @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 にて設定される
    466441# @type:: ArrayType, FuncType, PtrType, IntType, StructType
    467442#         VoidType, FloatType, DefinedType, BoolType
    468443# @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の関数定義)
    470445# @b_referenced:: bool
    471446#
    472 # 以下は、@kind が :VAR, :ATTRIBUTE のときに有効
    473 # @rw:: bool     # 古い文法では attr に指定可能だった(消すには generate の修正もå¿
    474 è¦ï¼‰
     447# 以下は、@kind が :VAR, :ATTRIBUTE のときに有効
     448# @rw:: bool     # 古い文法では attr に指定可能だった(消すには generate の修正も必要)
    475449# @omit:: bool
    476 # @choice_list:: [String]  attr 初期値の選択肢
    477 # 以下は、@kind が :VAR, :ATTRIBUTE, :MEMBER のときに有効
     450# @choice_list:: [String]  attr 初期値の選択肢
     451# 以下は、@kind が :VAR, :ATTRIBUTE, :MEMBER のときに有効
    478452# @size_is:: Expression or nil unless specified
    479 # 以下は、@kind が :MEMBER のときに有効
     453# 以下は、@kind が :MEMBER のときに有効
    480454# @count_is:: Expression or nil unless specified
    481 #             attr, var の場合、count_is は指定できない
     455#             attr, var の場合、count_is は指定できない
    482456# @string:: Expression, -1 (length not specified) or nil (not specified)
    483457#
    484 # mikan  ParamDecl だけ別に設けたが、MemberDecl, AttrDecl なども分けるべきか(?)
     458# mikan  ParamDecl だけ別に設けたが、MemberDecl, AttrDecl なども分けるべきか(?)
    485459
    486460  def initialize( identifier )
     
    512486  end
    513487
    514   #== Decl の意味的誤りをチェックする
     488  #== Decl の意味的誤りをチェックする
    515489  def check
    516490    # return nil if @type == nil
    517491
    518     # 構造体タグチェック(ポインタ型から構造体が参ç
    519 §ã•ã‚Œã¦ã„る場合は、タグの存在をチェックしない)
     492    # 構造体タグチェック(ポインタ型から構造体が参照されている場合は、タグの存在をチェックしない)
    520493    @type.check_struct_tag @kind
    521494
    522     # 型のチェックを行う
     495    # 型のチェックを行う
    523496    res = @type.check
    524497    if res then
     
    526499    end
    527500
    528     # 不要の初期化子をチェックする
     501    # 不要の初期化子をチェックする
    529502    if @initializer then
    530503      case @kind
     
    532505        cdl_error( "S2003 $1: $2 cannot have initializer" , @identifier, @kind.to_s.downcase )
    533506      when :VAR, :ATTRIBUTE, :CONSTANT
    534         # p @initializer  ここでは代å
    535 ¥å¯èƒ½ã‹ã©ã†ã‹ã€ãƒã‚§ãƒƒã‚¯ã—ない
    536         # :VAR, :ATTRIBUTE, :CONSTANT はそれぞれでチェックする
     507        # p @initializer  ここでは代入可能かどうか、チェックしない
     508        # :VAR, :ATTRIBUTE, :CONSTANT はそれぞれでチェックする
    537509        # return @type.check_init( @identifier, @initializer, @kind )
    538510      else
     
    552524  end
    553525
    554   #== ポインタレベルを得る
    555   # 戻り値:
    556   #   éžãƒã‚¤ãƒ³ã‚¿å¤‰æ•°   = 0
    557   #   ãƒã‚¤ãƒ³ã‚¿å¤‰æ•°     = 1
    558   #   äºŒé‡ãƒã‚¤ãƒ³ã‚¿å¤‰æ•° = 2
     526  #== ポインタレベルを得る
     527  # 戻り値:
     528  #   非ポインタ変数   = 0
     529  #   ポインタ変数     = 1
     530  #   二重ポインタ変数 = 2
    559531  def get_ptr_level
    560532    level = 0
     
    564536        level += 1
    565537        type = type.get_referto
    566 #      elsif type.kind_of?( ArrayType ) then  # 添数なしé
    567 åˆ—はポインタとみなす
     538#      elsif type.kind_of?( ArrayType ) then  # 添数なし配列はポインタとみなす
    568539#        if type.get_subscript == nil then
    569540#          level += 1
     
    572543#          break
    573544#        end
    574         # mikan ポインタの添数ありé
    575 åˆ—のポインタレベルは0でよい?
     545        # mikan ポインタの添数あり配列のポインタレベルは0でよい?
    576546      elsif type.kind_of?( DefinedType ) then
    577547        type = type.get_type
     
    596566      @type = type
    597567    else
    598       @type.set_type( type )             # 葉に設定
     568      @type.set_type( type )             # 葉に設定
    599569    end
    600570  end
     
    731701end
    732702
    733 # 関数パラメータの宣言
     703# 関数パラメータの宣言
    734704class ParamDecl < BDNode
    735705
    736706# @declarator:: Decl:  Token, ArrayType, FuncType, PtrType
    737707# @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 の第二引数)
    741711# @b_nullable:: Bool : nullable
    742 # @string:: Expr or -1(if size not specified) (string 引数)
     712# @string:: Expr or -1(if size not specified) (string 引数)
    743713# @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 引数として参照されている
    746715#
    747 # 1. 関数型でないこと
    748 # 2. 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. ポインタレベルが適切なこと
    754720
    755721  def initialize( declarator, specifier, param_specifier )
     
    818784        end
    819785      when :MAX_IS
    820         # max_is は、å†
    821 éƒ¨çš„なもの bnf.y.rb 参ç
    822 §
    823         # size_is で重複チェックされる
     786        # max_is は、内部的なもの bnf.y.rb 参照
     787        # size_is で重複チェックされる
    824788        @max = i[1]
    825789      when :NULLABLE
     
    841805    end
    842806
    843     # mikan ポインタのé
    844 åˆ—(添数有)のレベルが0
     807    # mikan ポインタの配列(添数有)のレベルが0
    845808    ptr_level = @declarator.get_ptr_level
    846809
     
    885848      cdl_error( "S2014 $1 need pointer or more pointer" , @declarator.get_identifier )
    886849    elsif ptr_level > max_level then
    887       # note: 構文解析段階で実行のため get_current 可
     850      # note: 構文解析段階で実行のため get_current 可
    888851      if Signature.get_current == nil || Signature.get_current.is_deviate? == false then
    889852        cdl_warning( "W3003 $1 pointer level mismatch" , @declarator.get_identifier )
     
    897860
    898861    if ptr_level > 0 then
    899       # size_is, count_is, string をセット
     862      # size_is, count_is, string をセット
    900863      if @direction == :RECEIVE && ptr_level > 1 then
    901864        type.get_type.set_scs( @size, @count, @string, @max, @b_nullable )
     
    907870#type.show_tree 1
    908871
    909       # ポインタが指しているå
    910 ˆã®ãƒ‡ãƒ¼ã‚¿åž‹ã‚’å¾—ã‚‹
     872      # ポインタが指している先のデータ型を得る
    911873      i = 0
    912874      t2 = type
     
    923885# p t2.is_const?
    924886
    925       # const 修飾が適切かチェック
     887      # const 修飾が適切かチェック
    926888      if @direction == :IN then
    927889        if ! t2.is_const? then
     
    934896      end
    935897    else
    936       # 非ポインタタイプ
     898      # 非ポインタタイプ
    937899      if @size != nil || @count != nil || @string != nil || @max != nil || @b_nullable then
    938900        type.set_scs( @size, @count, @string, @max, @b_nullable )
     
    1006968  end
    1007969
    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 が必要
    1016974  def need_PPAllocator?( b_opaque = false )
    1017975    if ! b_opaque then
     
    10601018end
    10611019
    1062 # 関数パラメータリスト
     1020# 関数パラメータリスト
    10631021class ParamList < BDNode
    10641022# @param_list:: NamedList : item: ParamDecl
     
    10731031
    10741032  def add_param( paramdecl )
    1075     return if paramdecl == nil    # 既にエラー
     1033    return if paramdecl == nil    # 既にエラー
    10761034
    10771035    @param_list.add_item( paramdecl )
     
    10831041  end
    10841042
    1085   #=== size_is, count_is, string の引数の式をチェック
    1086   # 変数は前方参ç
    1087 §å¯èƒ½ãªãŸã‚ã€é–¢æ•°é ­éƒ¨ã®æ§‹æ–‡è§£é‡ˆãŒçµ‚わった後にチェックする
     1043  #=== size_is, count_is, string の引数の式をチェック
     1044  # 変数は前方参照可能なため、関数頭部の構文解釈が終わった後にチェックする
    10881045  def check_param
    10891046    @param_list.get_items.each { |i|
    1090       next if i == nil                      # i == nil : エラー時
     1047      next if i == nil                      # i == nil : エラー時
    10911048
    10921049      if i.get_type.class == VoidType then
    1093         # 単一の void 型はここにはこない
     1050        # 単一の void 型はここにはこない
    10941051        cdl_error( "S2027 '$1' parameter cannot be void type", i.get_name )
    10951052      end
     
    10981055      if size then
    10991056        val = size.eval_const( @param_list )
    1100         if val == nil then                      # 定数式でないか?
    1101           # mikan 変数を含む式:単一の変数のみ OK
     1057        if val == nil then                      # 定数式でないか?
     1058          # mikan 変数を含む式:単一の変数のみ OK
    11021059          type = size.get_type( @param_list )
    11031060          unless type.kind_of?( IntType ) then
     
    11371094      if count then
    11381095        val = count.eval_const( @param_list )
    1139         if val == nil then                      # 定数式でないか?
    1140           # mikan 変数を含む式:単一の変数のみ OK
     1096        if val == nil then                      # 定数式でないか?
     1097          # mikan 変数を含む式:単一の変数のみ OK
    11411098          type = count.get_type( @param_list )
    11421099          unless type.kind_of?( IntType ) then
     
    11571114      if string != -1 && string then
    11581115        val = string.eval_const( @param_list )
    1159         if val == nil then                      # 定数式でないか?
    1160           # mikan 変数を含む式:単一の変数のみ OK
     1116        if val == nil then                      # 定数式でないか?
     1117          # mikan 変数を含む式:単一の変数のみ OK
    11611118          type = string.get_type( @param_list )
    11621119          unless type.kind_of?( IntType ) then
     
    11821139  end
    11831140
    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 のいずれかで修飾)がある
    11881143  def need_PPAllocator?( b_opaque = false )
    11891144    @param_list.get_items.each { |i|
     
    11991154  end
    12001155
    1201   #== ParamList# 文字列化
    1202   #b_name:: Bool: パラメータ名を含める
     1156  #== ParamList# 文字列化
     1157  #b_name:: Bool: パラメータ名を含める
    12031158  def to_str( b_name )
    12041159    str = "("
     
    12231178end
    12241179
    1225 #== CDL の文字列リテラルを扱うためのクラス
    1226 # CDL の文字列リテラルそのものではない
     1180#== CDL の文字列リテラルを扱うためのクラス
     1181# CDL の文字列リテラルそのものではない
    12271182class CDLString
    1228   # エスケープ文字を変換
     1183  # エスケープ文字を変換
    12291184  def self.escape str
    12301185    str = str.dup
     
    12381193    str.gsub!( /(\\[Xx][0-9A-Fa-f]{1,2})/, '{printf \"\\1\"}' )
    12391194    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 では警告が出される)
    12411196    return str
    12421197  end
    12431198
    1244   #=== CDLString#前後の " を取り除く
     1199  #=== CDLString#前後の " を取り除く
    12451200  def self.remove_dquote str
    12461201    s = str.sub( /\A"/, "" )
     
    12501205end
    12511206
    1252 #== CDL の初期化子を扱うためのクラス
    1253 # CDL の初期化子そのものではない
     1207#== CDL の初期化子を扱うためのクラス
     1208# CDL の初期化子そのものではない
    12541209class CDLInitializer
    1255   #=== 初期化子のクローン
    1256   # 初期化子は Expression, C_EXP, Array のいずれか
     1210  #=== 初期化子のクローン
     1211  # 初期化子は Expression, C_EXP, Array のいずれか
    12571212  def self.clone_for_composite( rhs, ct_name, cell_name, locale )
    12581213    if rhs.instance_of? C_EXP then
    1259       # C_EXP の clone を作るとともに置換
     1214      # C_EXP の clone を作るとともに置換
    12601215      rhs = rhs.clone_for_composite( ct_name, cell_name, locale )
    12611216    elsif rhs.instance_of? Expression then
     
    12691224  end
    12701225
    1271   #=== 初期化子(é
    1272 åˆ—)のクローン
    1273   # 要素は clone_for_composite を持つものだけ
     1226  #=== 初期化子(配列)のクローン
     1227  # 要素は clone_for_composite を持つものだけ
    12741228  def self.clone_for_compoiste_array( array, ct_name, cell_name, locale )
    1275     # "compoiste.identifier" の場合 (CDL としては誤り)
     1229    # "compoiste.identifier" の場合 (CDL としては誤り)
    12761230    if array[0] == :COMPOSITE then
    12771231      return array.clone
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/tecs_lang.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: tecs_lang.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
    55 #== 言語に関する変数を設定
    56 # メッセージファイルの読み込みも行う (読み込みに失敗した場合、デフォルトの文字コードに変更する)
     40#== 言語に関する変数を設定
     41# メッセージファイルの読み込みも行う (読み込みに失敗した場合、デフォルトの文字コードに変更する)
    5742class TECS_LANG
    58   # ハッシュのタグは case insensitive のため、大文字の文字列とする
     43  # ハッシュのタグは case insensitive のため、大文字の文字列とする
    5944  CHARSET_ALIAS = {
    6045    "UJIS" => :eucJP,
    6146    "UTF-8" => :utf8,
    62     "EUCJP" => :eucJP,   # 以下 case insensitive にするため
     47    "EUCJP" => :eucJP,   # 以下 case insensitive にするため
    6348    "SJIS" => :sjis,
    6449    "UTF8" => :utf8,
     
    6752  LANG_ALIAS = {
    6853    "C" => :en_US,
    69     "EN_US" => :en_US,   # 以下 case insensitive にするため
     54    "EN_US" => :en_US,   # 以下 case insensitive にするため
    7055    "JA_JP" => :ja_JP
    7156  }
     
    7560  }
    7661
    77   #=== LANG のパース
    78   #lang::String  "ja_JP.eucJP@cjknarrow", "C" など
     62  #=== LANG のパース
     63  #lang::String  "ja_JP.eucJP@cjknarrow", "C" など
    7964  #RETURN:: [ :ja_JP, :eucJP, :cjknarrow ]
    8065  def self.parse_lang( lang )
     
    8267
    8368    lang_terri = $1.to_sym if $1 != nil && $1 != ""
    84     # set_kcode_binary により、C.UTF-8 のみを特別扱いするå¿
    85 è¦ãŒãªããªã£ãŸ
    86     # if lang_terri == :C then    # LANG=C.* は、すべて 1 byte 文字コードとして扱う
     69    # set_kcode_binary により、C.UTF-8 のみを特別扱いする必要がなくなった
     70    # if lang_terri == :C then    # LANG=C.* は、すべて 1 byte 文字コードとして扱う
    8771    #  codeset = nil
    8872    #  modifier = nil
     
    9478  end
    9579
    96   #=== lang, charset の別明解決および妥当性のチェック
    97   #lang::Symbol    : :en_US, :ja_JP など
    98   #charset::Symbol : :eucJP, :utf8 など
     80  #=== lang, charset の別明解決および妥当性のチェック
     81  #lang::Symbol    : :en_US, :ja_JP など
     82  #charset::Symbol : :eucJP, :utf8 など
    9983  #RETURN:
    100   #  [ lang, charset, result ]::  result = false の場合 lang, charset は不適切
     84  #  [ lang, charset, result ]::  result = false の場合 lang, charset は不適切
    10185  def self.resolve_alias_and_check( lang, charset )
    10286    if LANG_ALIAS[ lang.to_s.upcase ] then
     
    122106  end
    123107
    124   #=== codepage を取り出す
    125   #codepage は3~5桁の整数として仮定
     108  #=== codepage を取り出す
     109  #codepage は3~5桁の整数として仮定
    126110  def self.get_win_codepage
    127111    cmd_pipe = IO.popen('cmd /c chcp','r')
     
    132116  end
    133117
    134   #=== codepage から LANG の設定文字列に変換
     118  #=== codepage から LANG の設定文字列に変換
    135119  def self.codepage_to_lang cp
    136120    if cp == "932" then
     
    141125  end
    142126
    143   #=== 言語、文字コードに関する変数を設定
    144   # 以下の順にチェックされ、一番最後に設定された値が採用される
    145   #   ãƒ»ãƒ‡ãƒ•ã‚©ãƒ«ãƒˆ
    146   #   ãƒ»codepage  (exerb 版で TERM 未設定または TERM=cygwin の場合のみ)
    147   #   ãƒ»LANG 環境変数
    148   #   ãƒ»TECSGEN_LANG 環境変数
    149   #   ãƒ»TECSGEN_FILE_LANG 環境変数 (ファイルの文字コードのみ)
    150   #   ãƒ»-k オプション (ファイルの文字コードのみ)
     127  #=== 言語、文字コードに関する変数を設定
     128  # 以下の順にチェックされ、一番最後に設定された値が採用される
     129  #   ・デフォルト
     130  #   ・codepage  (exerb 版で TERM 未設定または TERM=cygwin の場合のみ)
     131  #   ・LANG 環境変数
     132  #   ・TECSGEN_LANG 環境変数
     133  #   ・TECSGEN_FILE_LANG 環境変数 (ファイルの文字コードのみ)
     134  #   ・-k オプション (ファイルの文字コードのみ)
    151135  def self.set_lang_var
    152136
    153137    if $IN_EXERB && ( ENV[ 'TERM' ] == nil || ENV[ 'TERM' ] == "cygwin" ) then
    154       # exerb 版で端末 cygwin の時は codepage のみを見る
     138      # exerb 版で端末 cygwin の時は codepage のみを見る
    155139      cp = get_win_codepage
    156140      lang = codepage_to_lang cp
     
    160144
    161145    elsif ENV[ 'LANG' ]then
    162       # 非 exerb 版では LANG 環境変数を見る
    163       # cygwin console では codepage に従って出力した方が平和なため
     146      # 非 exerb 版では LANG 環境変数を見る
     147      # cygwin console では codepage に従って出力した方が平和なため
    164148
    165149      $LANG_FILE, $CHARSET_FILE, *dum = self.parse_lang( ENV[ 'LANG' ] )
     
    181165  end
    182166
    183   #=== -k オプションからファイル用の言語、文字コード変数を設定
     167  #=== -k オプションからファイル用の言語、文字コード変数を設定
    184168  def self.set_lang_by_option
    185169    if $kcode == nil
     
    211195  end
    212196
    213   #=== Kconv クラス用の変数を設定
    214   # 言語æƒ
    215 å ±ã‹ã‚‰ Kconv に関する変数を設定
     197  #=== Kconv クラス用の変数を設定
     198  # 言語情報から Kconv に関する変数を設定
    216199  def self.set_kconv_var
    217200
    218     # 文字コードの設定
     201    # 文字コードの設定
    219202    case $CHARSET_FILE           # string: "EUC" | "SJIS" | "NONE" | "UTF8"
    220203    when :eucJP
     
    251234    end
    252235
    253     $KCODE_TECSGEN = "UTF8"      # string: "EUC"  このファイルの文字コード(オプションではなく定数)
     236    $KCODE_TECSGEN = "UTF8"      # string: "EUC"  このファイルの文字コード(オプションではなく定数)
    254237    $KCONV_TECSGEN = Kconv::UTF8 # const:
    255     set_kcode $KCODE_TECSGEN     # このファイルの文字コードを設定
    256   end
    257 
    258   #=== 一時的に KCODE を BINARY に変更する
    259   # EUC を UTF8 で読み込んだ場合に文字区切りを誤る問題の対応
    260   # コメントの読み飛ばしを誤る点が問題
    261   # ただし、SJIS の場合は、エスケープ文字の問題があるため、変更しない
     238    set_kcode $KCODE_TECSGEN     # このファイルの文字コードを設定
     239  end
     240
     241  #=== 一時的に KCODE を BINARY に変更する
     242  # EUC を UTF8 で読み込んだ場合に文字区切りを誤る問題の対応
     243  # コメントの読み飛ばしを誤る点が問題
     244  # ただし、SJIS の場合は、エスケープ文字の問題があるため、変更しない
    262245  def self.set_kcode_binary
    263246
     
    273256  end
    274257
    275   #=== 一時的なあ KCODE の変更をå
    276 ƒã«æˆ»ã™
     258  #=== 一時的なあ KCODE の変更を元に戻す
    277259  def self.reset_kcode
    278260    set_kcode $KCODE_BACK
     
    280262
    281263  #####
    282   # $LANG_FILE        言語 (C は en_US に変換される)
    283   # $LANG_CONSOLE     è¨€èªž (C は en_US に変換される)
    284   # $CHARSET_FILE     ãƒ•ã‚¡ã‚¤ãƒ«ã®æ–‡å­—コード
    285   # $CHARSET_CONSOLE  コンソール文字コード
    286 
    287   # デフォルトの設定(正規化済みのこと)
     264  # $LANG_FILE        言語 (C は en_US に変換される)
     265  # $LANG_CONSOLE     言語 (C は en_US に変換される)
     266  # $CHARSET_FILE     ファイルの文字コード
     267  # $CHARSET_CONSOLE  コンソール文字コード
     268
     269  # デフォルトの設定(正規化済みのこと)
    288270  $LANG_FILE_DEFAULT  = :en_US
    289271  $CHARSET_FILE_DEFAULT = nil
     
    296278  $CHARSET_CONSOLE = $CHARSET_CONSOLE_DEFAULT
    297279
    298   # -k で指定可能なコード
     280  # -k で指定可能なコード
    299281  $CODE_TYPE_ARRAY = [ "euc", "sjis", "none", "utf8" ]
    300282
    301   # 言語を決定する
     283  # 言語を決定する
    302284  self.set_lang_var
    303285
    304   # 言語、コードのチェックと正規化
     286  # 言語、コードのチェックと正規化
    305287  lang_file, charset_file, res =
    306288    self.resolve_alias_and_check( $LANG_FILE, $CHARSET_FILE )
     
    316298  end
    317299
    318   # メッセージモジュールをロード
     300  # メッセージモジュールをロード
    319301  if require_tecsgen_lib( "tecslib/messages/messages_console_#{lang_console}.rb", false ) == false then
    320302    require_tecsgen_lib( "tecslib/messages/messages_console_#{$LANG_CONSOLE_DEFAULT}.rb" )
     
    330312  end
    331313
    332   # Kconv クラスのための変数を設定
     314  # Kconv クラスのための変数を設定
    333315  self.set_kconv_var
    334316
     
    337319  dbgPrint "Ruby19_File_Encode=#{$Ruby19_File_Encode}\n"
    338320
    339   #=== 単体テスト実行
     321  #=== 単体テスト実行
    340322  if $unit_test then
    341323    print "unit test: set_lang_var\n"
     
    350332end
    351333
    352 #= Console クラス
    353 # 文字コードを変換する
     334#= Console クラス
     335# 文字コードを変換する
    354336class Console
    355337  def self.print str
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/tecsgen.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: tecsgen.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
     
    5641class TECSGEN
    5742
    58   #=== import パス (-I) を末尾に追加
    59   # 既に登録済みであれば、追加しない
     43  #=== import パス (-I) を末尾に追加
     44  # 既に登録済みであれば、追加しない
    6045  def self.add_import_path path
    6146    if $import_path.index( path ) == nil then
     
    6550  end
    6651
    67   #=== EXEB 版のパスの調整
    68   # 環境変数 TECSPATH が cygwin スタイルだと、exerb 版では扱えない
    69   # $import_path と $TECSPATH を調整する
     52  #=== EXEB 版のパスの調整
     53  # 環境変数 TECSPATH が cygwin スタイルだと、exerb 版では扱えない
     54  # $import_path と $TECSPATH を調整する
    7055  def self.adjust_exerb_path
    7156    if $IN_EXERB then
     
    7459      paths = []
    7560      $import_path.each{ |path|
    76         # cygpath は '..' を簡約してしまうので、new_tecspath で置換する
     61        # cygpath は '..' を簡約してしまうので、new_tecspath で置換する
    7762        # paths << cygpath( path, path )
    7863        paths << path.sub( pattern, new_tecspath )
     
    8570  end
    8671
    87   #=== $(TECSPATH) への置換
    88   #path::String   : ENV[ 'TECSPATH' ] に一致する部分があれば、 "$(TECSPATH)" に置換
    89   #b_global::Bool : true なら gsub で置換。false なら sub で置換
     72  #=== $(TECSPATH) への置換
     73  #path::String   : ENV[ 'TECSPATH' ] に一致する部分があれば、 "$(TECSPATH)" に置換
     74  #b_global::Bool : true なら gsub で置換。false なら sub で置換
    9075  def self.subst_tecspath( path, b_global = false )
    9176    tp = $tecspath.dup
     
    10287  end
    10388
    104   #=== path は絶対パスか?
     89  #=== path は絶対パスか?
    10590  #path:: String   :
    106   # '/' または '$' で始まる場合、絶対パスと判定する
     91  # '/' または '$' で始まる場合、絶対パスと判定する
    10792  def self.is_absolute_path?( path )
    10893    pa = path[0..0]; pa2 = path[0..1]
     
    116101  end
    117102
    118   #=== tecsgen のデフォルトを設定
     103  #=== tecsgen のデフォルトを設定
    119104  def self.set_default_config
    120105    Makefile::set_default_config
     
    122107
    123108  ###
    124   #== Makefile.templ の出力å†
    125 å®¹ã‚’追加、変更するための操作
     109  #== Makefile.templ の出力内容を追加、変更するための操作
    126110  module Makefile
    127     # 固定されている変数(add_var で変更できない)
     111    # 固定されている変数(add_var で変更できない)
    128112    @@fixed_vars = { :INCLUDES => nil, :DEFINES => nil, :TARGET_BASE => nil, :BASE_DIR => nil }
    129113    @@config_mode = false
     
    140124    @@lines = []
    141125
    142     #=== OTHER_OBJS に追加する
     126    #=== OTHER_OBJS に追加する
    143127    def self.add_obj obj
    144128      @@objs << obj
    145129    end
    146     #=== 追加する変数
    147     # プラグインからは、デフォルト値を変更できる
    148     # config により
     130    #=== 追加する変数
     131    # プラグインからは、デフォルト値を変更できる
     132    # config により
    149133    def self.add_var( var, val, comment = nil )
    150134      if @@fixed_vars[ var ]
     
    159143      end
    160144    end
    161     #=== LDFLAGS に追加する
     145    #=== LDFLAGS に追加する
    162146    def self.add_ldflag ldflag
    163147      @@ldflags += " " + ldflag
    164148    end
    165     #=== サーチパスを追加する
    166     # CFLAGS, vpath に追加する
     149    #=== サーチパスを追加する
     150    # CFLAGS, vpath に追加する
    167151    def self.add_search_path path
    168152      @@search_path << path
    169153    end
    170     #=== PRE_TECSGEN_TARGET に追加する
    171     # PRE_TECSGEN_TARGET に target を追加する
     154    #=== PRE_TECSGEN_TARGET に追加する
     155    # PRE_TECSGEN_TARGET に target を追加する
    172156    def self.add_pre_tecsgen_target target
    173157      @@pre_tecsgen_target << pre_tecsgen_target
    174158    end
    175     #=== POST_TECSGEN_TARGET に追加する
    176     # POST_TECSGEN_TARGET に target を追加する
     159    #=== POST_TECSGEN_TARGET に追加する
     160    # POST_TECSGEN_TARGET に target を追加する
    177161    def self.add_post_tecsgen_target target
    178162      @@post_tecsgen_target << pre_tecsgen_target
    179163    end
    180     #=== 追加する変数
     164    #=== 追加する変数
    181165    def self.add_line( line )
    182166      @@lines << line.to_s + "\n"
    183167    end
    184168
    185     def self.get_objs  # Array を返す
     169    def self.get_objs  # Array を返す
    186170      return @@objs.uniq
    187171    end
    188     def self.get_vars  # Array を返す
     172    def self.get_vars  # Array を返す
    189173      if RUBY_VERSION >= '1.9' then
    190174        return (@@vars.keys + @@vars_default.keys).sort.uniq
    191175      else
    192         # V1.8 では、Symbol の sort ができないので、一旦 String に置換する
     176        # V1.8 では、Symbol の sort ができないので、一旦 String に置換する
    193177        return (@@vars.keys + @@vars_default.keys).map{|s| s.to_s }.sort.uniq.map!{|s| s.to_sym }
    194178      end
     
    200184      return @@var_comments[ var ]
    201185    end
    202     def self.get_ldflags  # String を返す
     186    def self.get_ldflags  # String を返す
    203187      return @@ldflags
    204188    end
    205     def self.get_search_path  # Array を返す
     189    def self.get_search_path  # Array を返す
    206190      return @@search_path.uniq
    207191    end
    208     def self.get_pre_tecsgen_target  # Array を返す
     192    def self.get_pre_tecsgen_target  # Array を返す
    209193      return @@pre_tecsgen_target.uniq
    210194    end
    211     def self.get_post_tecsgen_target  # Array を返す
     195    def self.get_post_tecsgen_target  # Array を返す
    212196      return @@post_tecsgen_target.uniq
    213197    end
    214     def self.get_lines  # 付加する行を得る
     198    def self.get_lines  # 付加する行を得る
    215199      return @@lines.uniq
    216200    end
    217201
    218     #=== TECSGEN のデフォルト設定を行う
     202    #=== TECSGEN のデフォルト設定を行う
    219203    # Makefile
    220     # @@fixed_vars で定義されている変数は、変更できず、定数定義されている
     204    # @@fixed_vars で定義されている変数は、変更できず、定数定義されている
    221205    def self.set_default_config
    222206      add_var( "TARGET", "$(TARGET_BASE).exe", "default target name"  )
     
    235219
    236220  def syntax_analisys argv
    237     # ルート namespace (region) を生成
     221    # ルート namespace (region) を生成
    238222    @root_namespace = Region.new("::")
    239223
    240     ####  構文解析 (post コードを除く) ####
    241     # すべての cdl を import する
     224    ####  構文解析 (post コードを除く) ####
     225    # すべての cdl を import する
    242226    argv.each{ |f|
    243227      dbgPrint( "## Import: #{f}\n")
     
    245229    }
    246230
    247     # すべての構文解釈が完了したことの報告
    248     #   å®Ÿéš›ã«ã¯ã€å¾Œã‹ã‚‰ãƒ—ラグインの生成する CDL のパースが行われる
    249     #   ã‚¨ãƒ©ãƒ¼è¡Œæ•°ã®æ±ºå®šæ–¹æ³•ã®å¤‰æ›´ã®ãŸã‚ã«è¡Œã†
     231    # すべての構文解釈が完了したことの報告
     232    #   実際には、後からプラグインの生成する CDL のパースが行われる
     233    #   エラー行数の決定方法の変更のために行う
    250234    Generator.end_all_parse
    251235    dbgPrint( "## End all parse (except Post Code)\n")
     
    253237
    254238  def semantics_analisys_1
    255     ####  意味解析1 (post コードを除く) ####
     239    ####  意味解析1 (post コードを除く) ####
    256240    dbgPrint( "## Creating reverse join \n")
    257241    Cell.create_reverse_join
    258242
    259     #0 set_definition_join は2回呼び出される(1回目)
     243    #0 set_definition_join は2回呼び出される(1回目)
    260244    dbgPrint( "## Checking all join\n")
    261245    @root_namespace.set_definition_join
    262     # @root_namespace.set_require_join                   ### いったん見合わせ。重複エラーを見逃す
    263     # through プラグインで生成されたセルにも require も生成できる (set_definition_join の後ろで実施)
    264 
    265     ####  post コードの生成と構文解析 ####
    266     # 引数がなければ、プラグインのポストコードを出力しない
     246    # @root_namespace.set_require_join                   ### いったん見合わせ。重複エラーを見逃す
     247    # through プラグインで生成されたセルにも require も生成できる (set_definition_join の後ろで実施)
     248
     249    ####  post コードの生成と構文解析 ####
     250    # 引数がなければ、プラグインのポストコードを出力しない
    267251    if ARGV.length > 0 then
    268252      dbgPrint( "## Generating Post Code\n")
    269       # プラグインのポストコードの出力と import
     253      # プラグインのポストコードの出力と import
    270254      tmp_file_name = "#{$gen}/tmp_plugin_post_code.cdl"
    271255      file = nil
     
    277261
    278262      if file then
    279         # through プラグインのポストコード生成
     263        # through プラグインのポストコード生成
    280264        PluginModule.gen_plugin_post_code file
    281265
     
    290274    end
    291275
    292     ####  意味解析1 (post コード) ####
     276    ####  意味解析1 (post コード) ####
    293277    dbgPrint( "## Creating reverse join (for post code) \n")
    294278    Cell.create_reverse_join
    295279
    296     # Join の定義の設定とチェック
    297     #0 # 前方参ç
    298 §å¯¾å¿œ
    299     #0 set_definition_join は2回呼び出される(2回目)  post_code で生成された
     280    # Join の定義の設定とチェック
     281    #0 # 前方参照対応
     282    #0 set_definition_join は2回呼び出される(2回目)  post_code で生成された
    300283    dbgPrint( "## Checking all join (for cells generated by Post Code\n")
    301284    @root_namespace.set_definition_join
    302285
    303286    dbgPrint( "## Set require join\n")
    304     @root_namespace.set_require_join   # mikan post の前にも
    305     # ポストコードで生成されたセルの require のjoin を生成
    306     # mikan require で through が適用されて、ポストコードがå¿
    307 è¦ã¨ãªã£ã¦ã‚‚出力されない
     287    @root_namespace.set_require_join   # mikan post の前にも
     288    # ポストコードで生成されたセルの require のjoin を生成
     289    # mikan require で through が適用されて、ポストコードが必要となっても出力されない
    308290  end # semantics_analisys_1
    309291
    310292  def semantics_analisys_2
    311     ####  意味解析2 ####
     293    ####  意味解析2 ####
    312294    Cell.make_cell_list2
    313295    dbgPrint( "## Set fixed join\n")
    314296    Cell.create_reverse_require_join
    315     # create_reverse_require_join は set_detinition_join に埋め込むことができない
    316         # namespace に依存しない出現順で行う
    317         # mikan through プラグインが適用されポストコードに影響を与える場合が考æ
    318 ®ã§ãã¦ã„ない
    319         # mikan post code に影響のあるものであれば、早くに reverse_require_join の結合がå¿
    320 è¦
     297    # create_reverse_require_join は set_detinition_join に埋め込むことができない
     298        # namespace に依存しない出現順で行う
     299        # mikan through プラグインが適用されポストコードに影響を与える場合が考慮できていない
     300        # mikan post code に影響のあるものであれば、早くに reverse_require_join の結合が必要
    321301    dbgPrint( "## Setting port reference count\n")
    322302    @root_namespace.set_port_reference_count
     
    325305    @root_namespace.check_join
    326306
    327     # mikan プラグインで生成されたコンポーネントの set_def_and_check_join
     307    # mikan プラグインで生成されたコンポーネントの set_def_and_check_join
    328308
    329309    dbgPrint( "## Checking referenced but undefined cell\n")
     
    332312
    333313  def optimize_and_generate
    334     #### Region link root ごとにオプティマイズおよび生成 ####
     314    #### Region link root ごとにオプティマイズおよび生成 ####
    335315    Region.get_link_roots.each { |region|
    336316
     
    354334      end
    355335
    356       # セルが一つもなければ生成しない
    357       # セルの生成がない場合
     336      # セルが一つもなければ生成しない
     337      # セルの生成がない場合
    358338      if region.get_n_cells == 0 then
    359339        if $region_list.length > 0 then
     
    385365
    386366      dbgPrint( "## Unset optimize variables\n")
    387       @root_namespace.reset_optimize   # 最適化をリセットする
     367      @root_namespace.reset_optimize   # 最適化をリセットする
    388368
    389369      if Generator.get_n_error == 0 then
    390         # エラーが発生していたら、設定しない
     370        # エラーが発生していたら、設定しない
    391371        dbgPrint( "## Set cell id\n")
    392         @root_namespace.set_cell_id_and_domain      # セルの ID とドメインæƒ
    393 å ±ã‚’設定(linkunit 毎に0からつける)
    394 
    395         # エラーが発生していたら、最適化は実施しない
     372        @root_namespace.set_cell_id_and_domain      # セルの ID とドメイン情報を設定(linkunit 毎に0からつける)
     373
     374        # エラーが発生していたら、最適化は実施しない
    396375        if ! $unopt then
    397376          dbgPrint( "## Optimizing: Link Region=#{@root_namespace.get_name}\n")
     
    401380
    402381      if $show_tree then
    403         # エラーが発生していても表示(エラー発生時は最適化されていないので注意)
     382        # エラーが発生していても表示(エラー発生時は最適化されていないので注意)
    404383        print "##### show_tree LinkRegion=#{region.get_name} #####\n"
    405384        @root_namespace.show_tree(0)
     
    407386      end
    408387
    409       # 構文解釈、意味解析でエラー発生していたら、コード生成をしない
     388      # 構文解釈、意味解析でエラー発生していたら、コード生成をしない
    410389      if Generator.get_n_error != 0 then
    411390        print_report
     
    413392      end
    414393
    415       #### コード生成 ####
     394      #### コード生成 ####
    416395      begin
    417396        dbgPrint( "## Generating: Link Region=#{@root_namespace.get_name}\n")
     
    420399        @root_namespace.generate_post
    421400      rescue
    422         # 通常ここへは来ない (generate, generate_post で処置される)
     401        # 通常ここへは来ない (generate, generate_post で処置される)
    423402        Generator.error( "G9999 fail to generate" )
    424403      end
     
    438417    }
    439418
    440     # update する
    441     # APPFile で生成されたファイルは、もし変化があれば、ここで更新する
    442     # コード生成段階でエラーが発生すれば、更新しない
    443     # CFile で生成されたものは、更新されている
     419    # update する
     420    # APPFile で生成されたファイルは、もし変化があれば、ここで更新する
     421    # コード生成段階でエラーが発生すれば、更新しない
     422    # CFile で生成されたものは、更新されている
    444423    if Generator.get_n_error == 0 then
    445424      begin
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/types.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2015 by TOPPERS Project
    77#-- 
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: types.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
    55 #= HasType: @type をå†
    56 éƒ¨ã«æŒã¤åž‹ã®ãŸã‚ã®ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«
     40#= HasType: @type を内部に持つ型のためのモジュール
    5741#  @b_cloned::Bool  : true if @type is cloned
    5842#
    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 すると別の型を参照してしまう)
    6447#
    65 # initialize で clone しても、å
    66 ±æœ‰ã•ã‚Œã¦ã„るときに clone されない
     48# initialize で clone しても、共有されているときに clone されない
    6749#
    6850module HasType
     
    7153  end
    7254
    73   #=== HasType# @type をクローンする
     55  #=== HasType# @type をクローンする
    7456  def clone_type
    7557#    if @b_cloned == false then
     
    131113  end
    132114
    133   #=== size_is, count_is, string を設定
    134   # 派生クラスでオーバーライドする(デフォルトではエラー)
     115  #=== size_is, count_is, string を設定
     116  # 派生クラスでオーバーライドする(デフォルトではエラー)
    135117  def set_scs( size, count, string, max = nil, b_nullable = false )
    136118    str = ""
     
    170152  end
    171153
    172   #=== 型をチェック
    173   #    正当な型定義かどうか、チェックする
     154  #=== 型をチェック
     155  #    正当な型定義かどうか、チェックする
    174156  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 を参照
    182163  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                被代入変数命
    195173  #initialize::   Expression, Array of initializer or C_EXP
    196   #               ä»£å
    197 ¥å€¤ã€C_EXP が与えられるのは IntType の場合のみ
     174  #               代入値、C_EXP が与えられるのは IntType の場合のみ
    198175  #kind::         symbol (:ATTRIBUTE, :VAR, :CONSTNAT )
    199   #attribute::    NameList              kind == :VAR のとき参ç
    200 §ã§ãã‚‹ attribute
     176  #attribute::    NameList              kind == :VAR のとき参照できる attribute
    201177  #
    202   #     locale を第一引数として取るのは、以下の理由による。
    203   #     ã“のメソッドは、変数への代å
    204 ¥ãŒè¡Œã‚ã‚Œã‚‹ã€Œè¡Œã€ã«å¯¾ã—て呼び出されるが、
    205   #     Type クラスのインスタンスは、変数が定義された「行」を記憶している。
     178  #     locale を第一引数として取るのは、以下の理由による。
     179  #     このメソッドは、変数への代入が行われる「行」に対して呼び出されるが、
     180  #     Type クラスのインスタンスは、変数が定義された「行」を記憶している。
    206181  #
    207182  # STAGE: S
     
    210185  end
    211186
    212   #=== const_val を指定の型にキャストする
    213   # 派生クラスでオーバーライドしていないとエラー
     187  #=== const_val を指定の型にキャストする
     188  # 派生クラスでオーバーライドしていないとエラー
    214189  def cast( const_val )
    215190    cdl_error( "T1004 cannot cast to $1" , self.class )
    216191  end
    217192
    218   #=== 型が一致するかのチェック
    219   # 型名の字面でチェック.
    220   # typedef された型も字面で一致を見るため、å
    221 ƒã®åž‹ãŒåŒã˜ã§ã‚‚型名が異なれば不一致となる
     193  #=== 型が一致するかのチェック
     194  # 型名の字面でチェック.
     195  # typedef された型も字面で一致を見るため、元の型が同じでも型名が異なれば不一致となる
    222196  def equal? type2
    223197    return ( get_type_str == type2.get_type_str ) && ( get_type_str_post == type2.get_type_str_post )
    224198  end
    225199
    226   #=== bit size を得る
    227   # IntType, FloatType 以外は0
     200  #=== bit size を得る
     201  # IntType, FloatType 以外は0
    228202  def get_bit_size
    229203    return 0
    230204  end
    231205
    232   #=== å
    233 ƒã®åž‹ã‚’å¾—ã‚‹
    234   # typedef された型の場合、そのå
    235 ƒã®åž‹ã‚’返す.
    236   # それ以外は、自分自身を返す.
    237   # (DefinedType では本メソッドがオーバーライドされる)
     206  #=== 元の型を得る
     207  # typedef された型の場合、その元の型を返す.
     208  # それ以外は、自分自身を返す.
     209  # (DefinedType では本メソッドがオーバーライドされる)
    238210  def get_original_type
    239211    return self
    240212  end
    241213
    242   #=== å†
    243 éƒ¨ã«ãƒã‚¤ãƒ³ã‚¿åž‹ã‚’持つ
    244   # ポインタ型、またはポインタ型メンバを持つ構造体、または要素がポインタ型を持つé
    245 åˆ—
     214  #=== 内部にポインタ型を持つ
     215  # ポインタ型、またはポインタ型メンバを持つ構造体、または要素がポインタ型を持つ配列
    246216  def has_pointer?
    247217    false
    248218  end
    249219
    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 指定されたポインタ型、またはそれをメンバに持つ構造体、またはそれをを要素に持つ配列
    253222  def has_sized_pointer?
    254223    false
    255224  end
    256225 
    257   #=== 長さ指定のない string を持つ
    258   # なさ指定のない string 指定されたポインタ型、またはそれをメンバに持つ構造体、またはそれを要素に持つé
    259 åˆ—
     226  #=== 長さ指定のない string を持つ
     227  # なさ指定のない string 指定されたポインタ型、またはそれをメンバに持つ構造体、またはそれを要素に持つ配列
    260228  def has_unsized_string?
    261229    false
     
    281249    @type_name = type_name
    282250
    283     # mikan type_name が path になっていないため暫定
     251    # mikan type_name が path になっていないため暫定
    284252    @typedef = Namespace.find( [ type_name ] )  #1
    285253
     
    317285  end
    318286
    319   #=== qualifier(const, volatile) の設定
     287  #=== qualifier(const, volatile) の設定
    320288  def set_qualifier( qualifier )
    321289    clone_type
     
    338306  end
    339307
    340   def check     # 意味的誤りがあれば、文字列を返す
    341     nil    # typedef の段階で意味チェックされている
     308  def check     # 意味的誤りがあれば、文字列を返す
     309    nil    # typedef の段階で意味チェックされている
    342310  end
    343311
     
    346314  end
    347315
    348   #=== å†
    349 éƒ¨ã«ãƒã‚¤ãƒ³ã‚¿åž‹ã‚’持つ
    350   # ポインタ型、またはポインタ型メンバを持つ構造体、または要素がポインタ型を持つé
    351 åˆ—
     316  #=== 内部にポインタ型を持つ
     317  # ポインタ型、またはポインタ型メンバを持つ構造体、または要素がポインタ型を持つ配列
    352318  def has_pointer?
    353319    @type.has_pointer?
    354320  end
    355321
    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 指定されたポインタ型、またはそれをメンバに持つ構造体、またはそれをを要素に持つ配列
    359324  def has_sized_pointer?
    360325    @type.has_sized_pointer?
    361326  end
    362327 
    363   #=== 長さ指定のない string を持つ
    364   # なさ指定のない string 指定されたポインタ型、またはそれをメンバに持つ構造体、またはそれを要素に持つé
    365 åˆ—
     328  #=== 長さ指定のない string を持つ
     329  # なさ指定のない string 指定されたポインタ型、またはそれをメンバに持つ構造体、またはそれを要素に持つ配列
    366330  def has_unsized_string?
    367331    @type.has_unsized_string?
     
    383347class VoidType < Type
    384348
    385   def check     # 意味的誤りがあれば、文字列を返す
     349  def check     # 意味的誤りがあれば、文字列を返す
    386350    nil
    387351  end
     
    408372class BoolType < Type
    409373
    410   def check     # 意味的誤りがあれば、文字列を返す
     374  def check     # 意味的誤りがあれば、文字列を返す
    411375    nil
    412376  end
     
    458422  end
    459423
    460   def check     # 意味的誤りがあれば、文字列を返す
     424  def check     # 意味的誤りがあれば、文字列を返す
    461425    nil
    462426  end
     
    466430    if val.instance_of?( Expression ) then
    467431      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)
    474437      cdl_error2( locale, "T1009 $1: $2: not integer" , ident, val )
    475438      return
    476439    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 の場合も
    480442      return
    481443    elsif val.kind_of? FloatVal then
     
    521483  end
    522484
    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 の場合は最大値でクリップ
    527489  def check_and_clip( in_val, from_type = :IntType )
    528490    bit_size = get_bit_size
     
    533495    if get_max && val > get_max then
    534496      if from_type == :IntType then
    535         rval = ((1 << bit_size)-1) & val   # bit 数でクリップ
     497        rval = ((1 << bit_size)-1) & val   # bit 数でクリップ
    536498      else
    537         rval = get_max                         # 最大値でクリップ (FloatType)
     499        rval = get_max                         # 最大値でクリップ (FloatType)
    538500      end
    539501      cdl_warning( "W2003 $1: too large to cast to $2, clipped($3)" , in_val, get_type_str, rval )
     
    546508      if @sign == :SIGNED || @sign == nil then
    547509        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 の場合)
    549511        cdl_warning( "W2005 $1: negative value for unsigned: convert to $2" , in_val, rval )
    550512      end
     
    558520    if @sign == :SIGNED || @sign == nil then
    559521      if @bit_size == -1 then
    560         bit_sz = 8   # char_t は、有符号に扱う
     522        bit_sz = 8   # char_t は、有符号に扱う
    561523      else
    562524        bit_sz = @bit_size
     
    576538    if @bit_size == -1 then
    577539      if @sign == nil then
    578         return 255   # char_t は、無符号に扱う
     540        return 255   # char_t は、無符号に扱う
    579541      else
    580542        bit_sz = 8
     
    600562  end
    601563
    602   #=== IntType# C 言語における型名(修飾子付き)
     564  #=== IntType# C 言語における型名(修飾子付き)
    603565  def get_type_str
    604566    str = super
     
    620582
    621583    case @bit_size
    622     when -1      # char_t 型
     584    when -1      # char_t
    623585      if @sign == :SIGNED then
    624586        sign = "s"
    625587      end
    626588      str = "#{str}#{sign}char_t"
    627     when -11     # char 型(obsolete)
     589    when -11     # char (obsolete)
    628590      str = "#{str}#{signL}char"
    629     when -2      # short 型
     591    when -2      # short
    630592      str = "#{str}#{signL}short"
    631     when -3      # int 型
     593    when -3      # int
    632594      str = "#{str}#{signL}int"
    633     when -4      # long 型
     595    when -4      # long
    634596      str = "#{str}#{signL}long"
    635     when -5      # long long 型
     597    when -5      # long long
    636598      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
    638600      str = "#{str}#{sign}int#{@bit_size}_t"
    639601    end
     
    642604  end
    643605
    644   #=== IntType# C 言語における型名(後置文字列)
     606  #=== IntType# C 言語における型名(後置文字列)
    645607  def get_type_str_post
    646608    ""
    647609  end
    648610
    649   #=== IntType#bit_size を得る
    650   #    返される値は @bit_size の仕様を参ç
    651 §
     611  #=== IntType#bit_size を得る
     612  #    返される値は @bit_size の仕様を参照
    652613  def get_bit_size
    653614    return @bit_size
    654615  end
    655616
    656   #=== IntType# sign を得る
    657   # @sign の説明を参ç
    658 §
     617  #=== IntType# sign を得る
     618  # @sign の説明を参照
    659619  def get_sign
    660620    @sign
     
    676636  end
    677637
    678   def check     # 意味的誤りがあれば、文字列を返す
     638  def check     # 意味的誤りがあれば、文字列を返す
    679639    nil
    680640  end
    681641
    682   # mikan Float 型の C_EXP 対応 (generate.rb にも変更å¿
    683 è¦)
     642  # mikan Float 型の C_EXP 対応 (generate.rb にも変更必要)
    684643  def check_init( locale, ident, initializer, kind, attribute = nil )
    685     # 型に対する初期値に誤りがあれば、エラー文字列を返す
     644    # 型に対する初期値に誤りがあれば、エラー文字列を返す
    686645    val = initializer
    687646    if val.instance_of?( Expression ) then
    688647      val = val.eval_const2( nil, attribute )
    689       # 評価の結果 C_EXP や Array となる可能性がある
     648      # 評価の結果 C_EXP や Array となる可能性がある
    690649    end
    691650
    692651    if val.instance_of? Token then
    693       # val が Token の場合 == の右辺が String だとエラーを起こす
     652      # val が Token の場合 == の右辺が String だとエラーを起こす
    694653      cdl_error2( locale, "T1018 $1: $2: not number" , ident, val )
    695654      return
     
    772731#  @members_decl:: NamedList
    773732#  @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)
    778737
    779738  @@structtype_current_stack = []
    780739  @@structtype_current_sp = -1
    781740
    782   # tag なし struct
     741  # tag なし struct
    783742  @@no_struct_tag_num = 0
    784743  @@no_tag_struct_list = {}
     
    803762    if @b_define then
    804763      @members_decl = NamedList.new( nil, "in struct #{@tag}" )
    805       # if @tag then    登録タイミングを終わりに変更 V1.0.2.19
     764      # if @tag then    登録タイミングを終わりに変更 V1.0.2.19
    806765      #  Namespace.new_structtype( self )
    807766      # end
    808767    else
    809768      @definition = Namespace.find_tag( @tag )
    810       # check_struct_tag に移す V1.0.2.19
     769      # check_struct_tag に移す V1.0.2.19
    811770      # if @definition == nil then
    812771      #  cdl_error( "T1021 \'$1\': struct not defined" , @tag )
     
    833792  end
    834793
    835   def check     # 意味的誤りがあれば、文字列を返す
     794  def check     # 意味的誤りがあれば、文字列を返す
    836795    nil
    837796  end
    838797
    839   #=== 構造体のタグをチェック
    840   #  declarator の時点でチェックする
    841   #kind:: Decl の @kind を参ç
    842 §
     798  #=== 構造体のタグをチェック
     799  #  declarator の時点でチェックする
     800  #kind:: Decl の @kind を参照
    843801  def check_struct_tag kind
    844802    if @tag == nil
     
    852810  end
    853811
    854   # mikan Float 型の C_EXP 対応 (generate.rb にも変更å¿
    855 è¦)
     812  # mikan Float 型の C_EXP 対応 (generate.rb にも変更必要)
    856813  def check_init( locale, ident, initializer, kind, attribute = nil )
    857814
     
    862819    end
    863820
    864     # 初期化子が式の場合、型(タグ)が一致するかチェック
     821    # 初期化子が式の場合、型(タグ)が一致するかチェック
    865822    if initializer.instance_of?( Expression ) then
    866823      t = initializer.get_type( attribute )
     
    898855
    899856  def end_of_parse()
    900     if @members_decl == nil   # @b_define = false またはメンバーのない構造体(エラー)
     857    if @members_decl == nil   # @b_define = false またはメンバーのない構造体(エラー)
    901858      return
    902859    end
     
    924881      string = md.get_string
    925882      if string == -1 then
    926         # 長さ指定なし
     883        # 長さ指定なし
    927884      elsif string then
    928885        val = string.eval_const( @members_decl )
     
    962919
    963920    if @tag then
    964       # typedef struct tag StructType; の形式の場合
    965       # struct の本体は、別に生成される
     921      # typedef struct tag StructType; の形式の場合
     922      # struct の本体は、別に生成される
    966923      return "#{str}struct #{@tag} "
    967924
    968925    else
    969       # typedef struct { int a; } StructType; の形式の場合
     926      # typedef struct { int a; } StructType; の形式の場合
    970927      str += "struct {\n"
    971928      @members_decl.get_items.each{ |i|
     
    1018975  end
    1019976
    1020   #=== 同じ構造体かどうかチェックする
    1021   # tag のチェックは行わない
    1022   # すべてのメンバの名前と型が一致することを確認する
     977  #=== 同じ構造体かどうかチェックする
     978  # tag のチェックは行わない
     979  # すべてのメンバの名前と型が一致することを確認する
    1023980  def same? another
    1024981    md = another.get_members_decl
     
    11101067  end
    11111068
    1112   def check     # 意味的誤りがあれば、文字列を返す
    1113     if @type.class == ArrayType then    # é
    1114 åˆ—を返す関数
     1069  def check     # 意味的誤りがあれば、文字列を返す
     1070    if @type.class == ArrayType then    # 配列を返す関数
    11151071      return "function returning array"
    1116     elsif @type.class == FuncType then  # 関数を返す関数
     1072    elsif @type.class == FuncType then  # 関数を返す関数
    11171073      return "function returning function"
    11181074    end
    1119     return @type.check   # 関数の return する型のチェック
    1120 
    1121     # パラメータの型のチェックは ParamList#check_param で行う
     1075    return @type.check   # 関数の return する型のチェック
     1076
     1077    # パラメータの型のチェックは ParamList#check_param で行う
    11221078  end
    11231079
    11241080  def check_struct_tag kind
    11251081    @type.check_struct_tag kind
    1126     # ParamDecl でもチェックされるので、ここではチェックしない
     1082    # ParamDecl でもチェックされるので、ここではチェックしない
    11271083    # @paramlist.check_struct_tag kind
    11281084  end
     
    11411097  end
    11421098
    1143   #=== return type を返す
     1099  #=== return type を返す
    11441100  #
    1145   # return type を返す
    1146   # get_return_type とすべきだった
     1101  # return type を返す
     1102  # get_return_type とすべきだった
    11471103  def get_type
    11481104    @type
     
    11541110
    11551111  def get_type_str_post
    1156     # 型だけを返す (仮引数の名前を含めない)
     1112    # 型だけを返す (仮引数の名前を含めない)
    11571113    @paramlist.to_str( false )
    11581114  end
     
    11821138  end
    11831139
    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 のいずれかで修飾)がある
    11881142  def need_PPAllocator?( b_opaque = false )
    11891143    if @b_oneway || b_opaque then
     
    11941148  end
    11951149
    1196   #=== パラメータが in, inout, out, send, receive を持つか
     1150  #=== パラメータが in, inout, out, send, receive を持つか
    11971151  def has_in?
    11981152    @has_in
     
    12111165  end
    12121166
    1213   #=== å
    1214 ¥åŠ›æ–¹å‘のパラメータを持つか
     1167  #=== 入力方向のパラメータを持つか
    12151168  def has_inward?
    12161169    @has_in || @has_inout || @has_send
    12171170  end
    1218   #=== 出力方向のパラメータを持つか
     1171  #=== 出力方向のパラメータを持つか
    12191172  def has_outward?
    12201173    @has_inout || @has_out || @has_receive
     
    12581211  end
    12591212
    1260   #=== Array#qualifier(const, volatile) の設定
     1213  #=== Array#qualifier(const, volatile) の設定
    12611214  def set_qualifier( qualifier )
    12621215    clone_type
     
    12651218  end
    12661219
    1267   # é
    1268 åˆ—要素が const なら const
     1220  # 配列要素が const なら const
    12691221  def is_const?
    12701222    @type.is_const?
    12711223  end
    12721224
    1273   # é
    1274 åˆ—要素が volatile なら volatile
     1225  # 配列要素が volatile なら volatile
    12751226  def is_volatile?
    12761227    @type.is_volatile?
     
    12981249  end
    12991250
    1300   def check     # 意味的誤りがあれば、文字列を返す
    1301     if @type.class == FuncType then             # 関数のé
    1302 åˆ—
     1251  def check     # 意味的誤りがあれば、文字列を返す
     1252    if @type.class == FuncType then             # 関数の配列
    13031253      return "array of function"
    1304     elsif @type.class == ArrayType then # 添数なしé
    1305 åˆ—のé
    1306 åˆ—
     1254    elsif @type.class == ArrayType then # 添数なし配列の配列
    13071255      unless @type.get_subscript then
    13081256        return "subscript not specified"
     
    13101258    end
    13111259
    1312     return @type.check    # é
    1313 åˆ—要素の型をチェック
     1260    return @type.check    # 配列要素の型をチェック
    13141261  end
    13151262
     
    13641311#  @size:: Expr, or nil if not specified
    13651312#  @count:: Expr, or nil if not specified
    1366 #  @string:: Expr or -1(if size not specified) (string 引数), or nil if not specified
     1313#  @string:: Expr or -1(if size not specified) (string 引数), or nil if not specified
    13671314
    13681315  include HasType
     
    13811328      @type = type
    13821329    else
    1383       @type.set_type( type )    # 枝å
    1384 ˆã® type を設定
     1330      @type.set_type( type )    # 枝先の type を設定
    13851331    end
    13861332  end
     
    14041350  end
    14051351
    1406   def check     # 意味的誤りがあれば、文字列を返す
     1352  def check     # 意味的誤りがあれば、文字列を返す
    14071353    return nil if @type == nil
    14081354    @type.check
     
    14101356
    14111357  def check_struct_tag kind
    1412     if kind != :MEMBER  # 構造体メンバーの場合、ポインタのå
    1413 ˆã®æ§‹é€ ä½“タグをチェックしない
     1358    if kind != :MEMBER  # 構造体メンバーの場合、ポインタの先の構造体タグをチェックしない
    14141359      @type.check_struct_tag kind
    14151360    end
     
    14281373          if ( t1.class == t2.class ) && ( t1.get_bit_size == t2.get_bit_size ) then
    14291374          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 に定義されているケース
    14311376          else
    14321377            cdl_error2( locale, "T1032 $1: incompatible pointer type" , ident )
     
    14391384        end
    14401385      elsif val.kind_of? StringVal then
    1441         # 文字列定数
     1386        # 文字列定数
    14421387        # mikan L"wide string"
    14431388        if @type.get_bit_size != -1 && @type.get_bit_size != -11 then  # -1: char_t
     
    14831428    @b_nullable = b_nullable
    14841429
    1485     # string は最も左側の ptr に作用する
     1430    # string は最も左側の ptr に作用する
    14861431    if @type.kind_of?( PtrType ) then
    1487       # ptr_level が 2 以上であることは ParamDecl#initializer でチェックされる
     1432      # ptr_level が 2 以上であることは ParamDecl#initializer でチェックされる
    14881433      clone_type
    14891434      @type.set_scs( nil, nil, string, nil, false )
     
    15321477  end
    15331478
    1534   #=== PtrType# size_is の最大値
     1479  #=== PtrType# size_is の最大値
    15351480  def get_max
    15361481    @max
     
    15951540end
    15961541
    1597 #==  DescriptorType クラス
    1598 # 動的結合で渡すデスクリプタ型
     1542#==  DescriptorType クラス
     1543# 動的結合で渡すデスクリプタ型
    15991544class DescriptorType < Type
    16001545# @sinagure_nsp::NamespacePath
     
    16301575    case kind
    16311576    when :PARAMETER
    1632       # 引数は初期化できない
     1577      # 引数は初期化できない
    16331578    else
    16341579      cdl_error2( locale, "T9999 Descriptor cannot be used for $1", kind)
     
    16371582
    16381583  #== DescriptorType#
    1639   # 意味解析段階では nil が返される可能性に注意
     1584  # 意味解析段階では nil が返される可能性に注意
    16401585  def get_signature
    16411586    Namespace.find @signature_nsp
     
    16431588end
    16441589
    1645 # 以下単体テストコード
     1590# 以下単体テストコード
    16461591if $unit_test then
    16471592  puts( "===== Unit Test: IntType ===== (types.rb)")
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/value.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    66#   Copyright (C) 2008-2014 by TOPPERS Project
    77#--
    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#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    52 #   $Id: value.rb 1011 2016-07-11 02:20:01Z coas-nagasima $
     37#   $Id$
    5338#++
    5439
    55 #= BaseVal 整数、浮動小数などの値を扱うクラスの基底クラス
     40#= BaseVal 整数、浮動小数などの値を扱うクラスの基底クラス
    5641#
    57 # TECS の CDL で扱う値は、以下に分類される
    58 # ・整数
    59 # ・浮動小数
    60 # ・文字列
    61 # ・ブール値
    62 # 集成型(構造体、é
    63 åˆ—)と C_EXP はここでは扱わない
     42# TECS の CDL で扱う値は、以下に分類される
     43# ・整数
     44# ・浮動小数
     45# ・文字列
     46# ・ブール値
     47# 集成型(構造体、配列)と C_EXP はここでは扱わない
    6448#
    65 # このクラスで定義済みの演算子は、エラーとなる
    66 # 型により演算可能な場合、演算子をオーバーライドする
     49# このクラスで定義済みの演算子は、エラーとなる
     50# 型により演算可能な場合、演算子をオーバーライドする
    6751#
    6852class BaseVal < Node
     
    160144end
    161145
    162 #= Pointer 値 (IntegerVal の Pointer 版)
     146#= Pointer 値 (IntegerVal の Pointer 版)
    163147#
    164 # ポインタ値は、CDL で直接生成されることはない
    165 # 整数値のキャスト演算により生成される
     148# ポインタ値は、CDL で直接生成されることはない
     149# 整数値のキャスト演算により生成される
    166150class PointerVal < BaseVal
    167 #@int_val:: IntegerVal: IntegerVal でなくてはならない
    168 #@ptr_type:: PtrType: ポインタの指すå
    169 ˆã®åž‹
     151#@int_val:: IntegerVal: IntegerVal でなくてはならない
     152#@ptr_type:: PtrType: ポインタの指す先の型
    170153
    171154  def initialize( int_val, ptr_type )
     
    175158  end
    176159
    177   #=== ポインタの指すå
    178 ˆã®åž‹ã‚’å¾—ã‚‹
    179   # PointerVal 専用のメソッド
     160  #=== ポインタの指す先の型を得る
     161  # PointerVal 専用のメソッド
    180162  def get_type
    181163    @ptr_type
     
    183165
    184166  def cast type
    185     t = type.get_original_type   # typedef のå
    186 ƒã‚’å¾—ã‚‹
     167    t = type.get_original_type   # typedef の元を得る
    187168    if t.kind_of? IntType then
    188169      val = t.check_and_clip( @int_val, :IntType )
     
    213194end
    214195
    215 #= IntegerVal: 整数値を扱うクラス
     196#= IntegerVal: 整数値を扱うクラス
    216197class IntegerVal < BaseVal
    217198#@val:: Integer: value
     
    250231  def / val
    251232    if val.kind_of? FloatVal then
    252       v2 = val.to_f   # to_f を2回評価しない
     233      v2 = val.to_f   # to_f を2回評価しない
    253234      if v2 == 0.0 then
    254235        cdl_error( "V1009 / : divieded by zero"  )
     
    257238      return FloatVal.new( @val.to_f / v2 )
    258239    else
    259       v2 = val.to_i   # to_i を2回評価しない
     240      v2 = val.to_i   # to_i を2回評価しない
    260241      if v2 == 0 then
    261242        cdl_error( "V1010 / : divieded by zero"  )
     
    267248  def % val
    268249    if val.kind_of? FloatVal then
    269       v2 = val.to_f   # to_f を2回評価しない
     250      v2 = val.to_f   # to_f を2回評価しない
    270251      if v2 == 0.0 then
    271252        cdl_error( "V1011 % : divieded by zero"  )
     
    274255      return FloatVal.new( @val.to_f % v2 )
    275256    else
    276       v2 = val.to_i   # to_i を2回評価しない
     257      v2 = val.to_i   # to_i を2回評価しない
    277258      if v2 == 0 then
    278259        cdl_error( "V1012 % : divieded by zero"  )
     
    360341  end
    361342  def cast( type )
    362     t = type.get_original_type   # typedef のå
    363 ƒã‚’å¾—ã‚‹
     343    t = type.get_original_type   # typedef の元を得る
    364344    if t.kind_of? IntType then
    365345      val = t.check_and_clip( @val, :IntType )
     
    395375end
    396376
    397 #= BoolVal: bool 値を扱うクラス
     377#= BoolVal: bool 値を扱うクラス
    398378class BoolVal < BaseVal
    399379#@val:: bool: true, false
     
    437417  end
    438418  def cast( type )
    439     t = type.get_original_type   # typedef のå
    440 ƒã‚’å¾—ã‚‹
     419    t = type.get_original_type   # typedef の元を得る
    441420    if @val then
    442421      val = 1
     
    478457end
    479458
    480 #= FloatVal: 実数値を扱うクラス
     459#= FloatVal: 実数値を扱うクラス
    481460class FloatVal < BaseVal
    482461#@val:: Float
     
    496475  end
    497476  def / val
    498     v2 = val.to_f   # to_f を2回評価しない
     477    v2 = val.to_f   # to_f を2回評価しない
    499478    if v2 == 0.0 then
    500479      cdl_error( "V1017 / : divieded by zero"  )
     
    504483  end
    505484  def % val
    506     v2 = val.to_f   # to_f を2回評価しない
     485    v2 = val.to_f   # to_f を2回評価しない
    507486    if v2 == 0.0 then
    508487      cdl_error( "V1018 % : divieded by zero"  )
     
    536515  end
    537516  def cast( type )
    538     t = type.get_original_type   # typedef のå
    539 ƒã‚’å¾—ã‚‹
     517    t = type.get_original_type   # typedef の元を得る
    540518    if t.kind_of? IntType then
    541519      val = t.check_and_clip( @val, :FloatType )
     
    565543end
    566544
    567 #= 文字列リテラルを扱うクラス
     545#= 文字列リテラルを扱うクラス
    568546class StringVal < BaseVal
    569547#@str:: Token:
     
    573551    super()
    574552    @str = str
    575     @specifier = spec   # mikan L"str" wide 文字列未対応
     553    @specifier = spec   # mikan L"str" wide 文字列未対応
    576554  end
    577555
    578556  #===
    579557  #
    580   # string の cast はできない mikan ポインタ型への cast はできるべき
     558  # string の cast はできない mikan ポインタ型への cast はできるべき
    581559  def cast type
    582     t = type.get_original_type   # typedef のå
    583 ƒã‚’å¾—ã‚‹
     560    t = type.get_original_type   # typedef の元を得る
    584561    if t.kind_of? IntType then
    585562      cdl_error( "V1022 string cannot cast to integer"  )
     
    598575
    599576  def val
    600     @str.to_s   # Token で扱われていた名残 (val を取り出す)
     577    @str.to_s   # Token で扱われていた名残 (val を取り出す)
    601578  end
    602579end
Note: See TracChangeset for help on using the changeset viewer.