Ignore:
Timestamp:
May 22, 2019, 10:03:37 PM (5 years ago)
Author:
coas-nagasima
Message:

ビルドが通るよう更新

Location:
azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core
Files:
22 edited

Legend:

Unmodified
Added
Removed
  • azure_iot_hub/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
    r388 r389  
    107107#               b_asm   = false
    108108
    109                 # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
     109                # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
    110110                TECS_LANG::set_kcode_binary
    111111
    112                 # 800U, 0xffLL など (整数リテラルにå
    113 ±é€šã®ä¿®é£¾å­)
     112                # 800U, 0xffLL など (整数リテラルに共通の修飾子)
    114113                integer_qualifier = "([Uu][Ll][Ll]|[Uu][Ll]|[Uu]|[Ll][Ll]|[Ll])?"
    115114
     
    126125                                if comment
    127126                                        case line
    128                                         # コメント終了
     127                                        # コメント終了
    129128                                        when /\A\*\//
    130129                                                comment = false
     
    134133                                else
    135134                                        case line
    136                                         # 空白、プリプロセスディレクティブ
     135                                        # 空白、プリプロセスディレクティブ
    137136                                        when /\A\s+/
    138137                                                ;
    139                                         # 識別子
     138                                        # 識別子
    140139                                        when /\A[a-zA-Z_]\w*/
    141140                                                word = $&
    142141                                                @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)]
    143                                         # 16 進数定数
     142                                        # 16 進数定数
    144143                                        when /\A0x[0-9A-Fa-f]+#{integer_qualifier}/
    145144                                                @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)]
    146                                         # 8 進数定数
     145                                        # 8 進数定数
    147146                                        when /\A0[0-7]+#{integer_qualifier}/
    148147                                                @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)]
    149                                         # 浮動小数定数
     148                                        # 浮動小数定数
    150149                                        when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/
    151150                                                @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
    152                                         # 整数定数
     151                                        # 整数定数
    153152                                        when /\A\d+#{integer_qualifier}/
    154153                                        # when /\A\d+/
    155154                                                @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)]
    156                                         # 文字
     155                                        # 文字
    157156                                        when /\A'(?:[^'\\]|\\.)'/
    158157                                                @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)]
    159                                         # 文字列
    160 #                                       "#include  #include #include \"../systask/logtask.cfg\"       æœ€å¾Œã® " 忘れ)で無限ループ
     158                                        # 文字列
     159#                                       "#include  #include #include \"../systask/logtask.cfg\"       最後の " 忘れ)で無限ループ
    161160#                                       when /\A"(?:[^"\\]+|\\.)*"/
    162                                         when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
     161                                        when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
    163162                                                @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)]
    164                                         # 行コメント
     163                                        # 行コメント
    165164                                        when /\A\/\/.*$/
    166                                                 # 読み飛ばすだけ
    167                                         # コメント開始
     165                                                # 読み飛ばすだけ
     166                                        # コメント開始
    168167                                        when /\A\/\*/
    169168                                                comment = true
     
    196195        }
    197196
    198         # 終了の印
     197        # 終了の印
    199198        @q << nil
    200199
     
    223222                        end
    224223
    225                         # TYPE_NAME トークンへ置き換え
     224                        # TYPE_NAME トークンへ置き換え
    226225                        if @b_no_type_name == false
    227226                                if token[0] == :IDENTIFIER && Namespace.is_typename?( token[1].val ) then
     
    232231                        end
    233232
    234                         if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
     233                        if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
    235234                                locale = @@current_locale[@@generator_nest]
    236235                                if token then
     
    262261        @@n_info = 0
    263262
    264         # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
     263        # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
    265264        def self.error( msg )
    266265                @@n_error += 1
     
    274273        end
    275274
    276         # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
     275        # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
    277276        def self.warning( msg )
    278277                @@n_warning += 1
     
    281280        end
    282281
    283         # このメソッドは構文解析、意味解析からのみ呼出し可
     282        # このメソッドは構文解析、意味解析からのみ呼出し可
    284283        def self.info( msg )
    285284                @@n_info += 1
     
    17961795module_eval(<<'.,.,', 'C_parser.y.rb', 228)
    17971796  def _reduce_83(val, _values, result)
    1798                         result = Expression.new( val[2] )    # ',' の後ろを採用
     1797                        result = Expression.new( val[2] )    # ',' の後ろを採用
    17991798               
    18001799    result
     
    18221821module_eval(<<'.,.,', 'C_parser.y.rb', 261)
    18231822  def _reduce_86(val, _values, result)
    1824                         result = CIntType.new( -3 )    # storage class は無視
     1823                        result = CIntType.new( -3 )    # storage class は無視
    18251824               
    18261825    result
     
    18301829module_eval(<<'.,.,', 'C_parser.y.rb', 265)
    18311830  def _reduce_87(val, _values, result)
    1832                         result = val[1]                # storage class は無視
     1831                        result = val[1]                # storage class は無視
    18331832               
    18341833    result
     
    25872586  def _reduce_268(val, _values, result)
    25882587                while true
    2589                         # ';' が表れるまで、トークンを読み飛ばす。
    2590                         # gcc の構文拡張に対応すべきだが、単純な実è£
    2591 ã¨ã—て、';' まで読み飛ばす。
    2592                         # トークン単位で読み飛ばしているので、文字列やコメントå†
    2593 ã® ';' は対象にならない。
     2588                        # ';' が表れるまで、トークンを読み飛ばす。
     2589                        # gcc の構文拡張に対応すべきだが、単純な実装として、';' まで読み飛ばす。
     2590                        # トークン単位で読み飛ばしているので、文字列やコメント内の ';' は対象にならない。
    25942591                        token = next_token
    25952592                        if token[1].val == ";"
  • azure_iot_hub/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
    r388 r389  
    66#   Copyright (C) 2008-2018 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
    5237#   $Id$
     
    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#
    68 # 2019/3/28 長島 下記のC99の構文に近づくよう変更
    69 #(読めないヘッダーファイルがあったため)
     51# 2019/3/28 長島 下記のC99の構文に近づくよう変更
     52#(読めないヘッダーファイルがあったため)
    7053# http://www.quut.com/c/ANSI-C-grammar-y-1999.html
    71 # å
    72 ƒã€
    73 ã®ã‚³ãƒ¡ãƒ³ãƒˆã¨åˆã‚ãªããªã£ã¦ã„ます
     54# 元々のコメントと合わなくなっています
    7455
    7556primary_expression
    7657                : namespace_identifier
    7758                { result = [ :IDENTIFIER, val[0] ] }     #1ok
    78 #        : IDENTIFIER   # mikan namespace への対応
     59#        : IDENTIFIER   # mikan namespace への対応
    7960#               { result = [ :IDENTIFIER, val[0] ] }
    8061#        | TRUE
     
    10384                { result << val[1] }
    10485
    105 # 関数呼び出しと後置インクリメント、デクリメント演算子がない
     86# 関数呼び出しと後置インクリメント、デクリメント演算子がない
    10687postfix_expression
    10788                : primary_expression
     
    11596                | postfix_expression '->' IDENTIFIER
    11697                { result = [ :OP_REF, val[0], val[2] ] }
    117                 | postfix_expression '++'       { result = val[0] }   # ++, -- は無視する
     98                | postfix_expression '++'       { result = val[0] }   # ++, -- は無視する
    11899                | postfix_expression '--'       { result = val[0] }
    119100                | '(' type_name ')' '{' initializer_list '}'
     
    125106
    126107
    127 # 前置インクリメント、デクリメント演算子がない
     108# 前置インクリメント、デクリメント演算子がない
    128109unary_expression
    129110                : postfix_expression
     
    134115                | SIZEOF '(' type_name ')'
    135116                { result = [ :OP_SIZEOF_TYPE, val[1] ] }
    136                 | '++' unary_expression                 { result = val[1] }   # ++, -- は無視する
     117                | '++' unary_expression                 { result = val[1] }   # ++, -- は無視する
    137118                | '--' unary_expression                 { result = val[1] }
    138119
     
    246227                | expression ',' assignment_expression
    247228                {
    248                         result = Expression.new( val[2] )    # ',' の後ろを採用
     229                        result = Expression.new( val[2] )    # ',' の後ろを採用
    249230                }
    250231
     
    264245
    265246# Types
    266 ##########################  宣言  ##########################
    267 # 宣言もK&Rと一部異なる
    268 
    269 # declarationはセルの属性で使われる
    270 # K&Rとの違い: storage classが指定できない、型が省略できない
     247##########################  宣言  ##########################
     248# 宣言もK&Rと一部異なる
     249
     250# declarationはセルの属性で使われる
     251# K&Rとの違い: storage classが指定できない、型が省略できない
    271252declaration
    272253                : declaration_specifiers init_declarator_list ';'
    273254#        : specifier_qualifier_list init_declarator_list ';'
    274255
    275 # declaration_specifiersは関数のパラメータで使われるが、
    276 # specifier_qualifier_listで十分かもしれない
     256# declaration_specifiersは関数のパラメータで使われるが、
     257# specifier_qualifier_listで十分かもしれない
    277258
    278259declaration_specifiers
    279260                : storage_class_specifier
    280261                {
    281                         result = CIntType.new( -3 )    # storage class は無視
     262                        result = CIntType.new( -3 )    # storage class は無視
    282263                }
    283264                | storage_class_specifier declaration_specifiers
    284265                {
    285                         result = val[1]                # storage class は無視
     266                        result = val[1]                # storage class は無視
    286267                }
    287268                | type_specifier
     
    350331                { set_no_type_name true; result = CBoolType.new }
    351332                | struct_specifier
    352                 { set_no_type_name true; result = val[0] } # set_no_type_name true は struct_tag でも呼ばれる
     333                { set_no_type_name true; result = val[0] } # set_no_type_name true は struct_tag でも呼ばれる
    353334                | union_specifier
    354                 { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
     335                { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
    355336                | enum_specifier
    356                 { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
     337                { set_no_type_name true; result = CVoidType.new }  # void が宣言されたとする
    357338                | TYPE_NAME
    358339                { set_no_type_name true; result = CDefinedType.new( val[0].val ) }
    359340
    360 # mikan K&Rのstruct_or_union_specifierに相当するが、unionは使えない, bit field にも対応しない
     341# mikan K&Rのstruct_or_union_specifierに相当するが、unionは使えない, bit field にも対応しない
    361342struct_specifier                # mikan
    362343#        : STRUCT struct_tag '{'
     
    379360                        result = val[1]
    380361                }
    381 #        | STRUCT struct_tag   # mikan struct_tag は namespace 対応がå¿
    382 è¦
    383                 | struct_term struct_tag   # mikan struct_tag は namespace 対応がå¿
    384 è¦
     362#        | STRUCT struct_tag   # mikan struct_tag は namespace 対応が必要
     363                | struct_term struct_tag   # mikan struct_tag は namespace 対応が必要
    385364                {
    386365                        StructType.set_define( false )
     
    403382                }
    404383
    405 # ポインタ修飾子を追加
     384# ポインタ修飾子を追加
    406385struct_declaration
    407386                : declaration_specifiers struct_declarator_list ';'
     
    416395                        result = val[1]
    417396                }
    418                 # ビットフィールドを読み飛ばし
     397                # ビットフィールドを読み飛ばし
    419398                | declaration_specifiers struct_declarator_list ':' constant_expression ';'
    420399                {
     
    427406                        result = val[1]
    428407                }
    429                 | union_specifier ';'                       # 無名
    430                 | struct_specifier ';'                       # 無名
    431 
    432 
    433 
    434 # K&Rのspecifier_qualifier_listと同じ
    435 # 名前がまぎらわしかったのでtype_を付けた
     408                | union_specifier ';'                       # 無名
     409                | struct_specifier ';'                       # 無名
     410
     411
     412
     413# K&Rのspecifier_qualifier_listと同じ
     414# 名前がまぎらわしかったのでtype_を付けた
    436415specifier_qualifier_list
    437416                : type_specifier specifier_qualifier_list
     
    457436                { result << val[2] }
    458437
    459 # ビットフィールドは使えない
     438# ビットフィールドは使えない
    460439struct_declarator
    461440                : declarator
     
    466445#        : UNION union_tag '{' union_declaration_list '}'
    467446#        | UNION '{' union_declaration_list '}'
    468 #        | UNION union_tag   # mikan struct_tag は namespace 対応がå¿
    469 è¦
     447#        | UNION union_tag   # mikan struct_tag は namespace 対応が必要
    470448                : union_term union_tag '{' union_declaration_list '}'
    471449                | union_term '{' union_declaration_list '}'
    472                 | union_term union_tag   # mikan struct_tag は namespace 対応がå¿
    473 è¦
     450                | union_term union_tag   # mikan struct_tag は namespace 対応が必要
    474451
    475452union_term
     
    485462union_declaration
    486463                : declaration_specifiers union_declarator_list ';'
    487                 | union_specifier ';'                       # 無名
    488                 | struct_specifier ';'                      # 無名
     464                | union_specifier ';'                       # 無名
     465                | struct_specifier ';'                      # 無名
    489466
    490467union_declarator_list
     
    535512                }
    536513                | direct_declarator
    537                 | pointer TYPE_NAME     # 関数ポインタの typedef が二重定義の場合
     514                | pointer TYPE_NAME     # 関数ポインタの typedef が二重定義の場合
    538515                {
    539516                        result = Decl.new( val[1].val )
     
    562539                        result = val[0]
    563540                }
    564                 | direct_declarator '(' identifier_list ')'  # これは何のためにå¿
    565 è¦ï¼Ÿ 060211
     541                | direct_declarator '(' identifier_list ')'  # これは何のために必要? 060211
    566542                | direct_declarator '(' ')'
    567543                {
     
    599575                : parameter_list
    600576                | parameter_list ',' '.' '.' '.'
    601                 # mikan 可変長パラメータ,  ... の間のスペースが許される(手抜き)
     577                # mikan 可変長パラメータ,  ... の間のスペースが許される(手抜き)
    602578
    603579parameter_list
     
    607583#               {
    608584#                       val[0].add_param( val[2] )
    609 #                       # result = val[0] 不要
     585#                       # result = val[0] 不要
    610586#               }
    611587
    612588
    613 # パラメータ修飾子を追加
     589# パラメータ修飾子を追加
    614590parameter_declaration
    615591                : declaration_specifiers declarator
     
    620596#               }
    621597
    622         # 以下はエラーとする
    623 #        | declaration_specifiers       # 仮引数なしは、とりあえず扱わない 060210
     598        # 以下はエラーとする
     599#        | declaration_specifiers       # 仮引数なしは、とりあえず扱わない 060210
    624600#               {
    625601#                       unless val[0].kind_of?( VoidType ) then
     
    628604#                       result = nil
    629605#               }
    630                 | declaration_specifiers abstract_declarator    # 仮引数なし
    631                 | declaration_specifiers                                                # 仮引数なし
    632 
    633 
    634 identifier_list       # 060211  不用になった
     606                | declaration_specifiers abstract_declarator    # 仮引数なし
     607                | declaration_specifiers                                                # 仮引数なし
     608
     609
     610identifier_list       # 060211  不用になった
    635611        : IDENTIFIER
    636612        | identifier_list ',' IDENTIFIER
     
    662638                | direct_abstract_declarator '(' parameter_type_list ')'
    663639
    664 # assignment_expressionをconstant_expressionに変更
     640# assignment_expressionをconstant_expressionに変更
    665641initializer                     # mikan
    666642                : assignment_expression
     
    685661
    686662
    687 ##########################  ここからはCDL独自  ##########################
    688 
    689 #トップレベルの構文規則
     663##########################  ここからはCDL独自  ##########################
     664
     665#トップレベルの構文規則
    690666C_parser
    691667                :
     
    703679                | declaration
    704680                | ';'
    705                 | error   # エラー回復ポイント
     681                | error   # エラー回復ポイント
    706682
    707683typedef
     
    792768                : _ASM {
    793769                while true
    794                         # ';' が表れるまで、トークンを読み飛ばす。
    795                         # gcc の構文拡張に対応すべきだが、単純な実è£
    796 ã¨ã—て、';' まで読み飛ばす。
    797                         # トークン単位で読み飛ばしているので、文字列やコメントå†
    798 ã® ';' は対象にならない。
     770                        # ';' が表れるまで、トークンを読み飛ばす。
     771                        # gcc の構文拡張に対応すべきだが、単純な実装として、';' まで読み飛ばす。
     772                        # トークン単位で読み飛ばしているので、文字列やコメント内の ';' は対象にならない。
    799773                        token = next_token
    800774                        if token[1].val == ";"
     
    906880#               b_asm   = false
    907881
    908                 # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
     882                # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
    909883                TECS_LANG::set_kcode_binary
    910884
    911                 # 800U, 0xffLL など (整数リテラルにå
    912 ±é€šã®ä¿®é£¾å­)
     885                # 800U, 0xffLL など (整数リテラルに共通の修飾子)
    913886                integer_qualifier = "([Uu][Ll][Ll]|[Uu][Ll]|[Uu]|[Ll][Ll]|[Ll])?"
    914887
     
    925898                                if comment
    926899                                        case line
    927                                         # コメント終了
     900                                        # コメント終了
    928901                                        when /\A\*\//
    929902                                                comment = false
     
    933906                                else
    934907                                        case line
    935                                         # 空白、プリプロセスディレクティブ
     908                                        # 空白、プリプロセスディレクティブ
    936909                                        when /\A\s+/
    937910                                                ;
    938                                         # 識別子
     911                                        # 識別子
    939912                                        when /\A[a-zA-Z_]\w*/
    940913                                                word = $&
    941914                                                @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)]
    942                                         # 16 進数定数
     915                                        # 16 進数定数
    943916                                        when /\A0x[0-9A-Fa-f]+#{integer_qualifier}/
    944917                                                @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)]
    945                                         # 8 進数定数
     918                                        # 8 進数定数
    946919                                        when /\A0[0-7]+#{integer_qualifier}/
    947920                                                @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)]
    948                                         # 浮動小数定数
     921                                        # 浮動小数定数
    949922                                        when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/
    950923                                                @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
    951                                         # 整数定数
     924                                        # 整数定数
    952925                                        when /\A\d+#{integer_qualifier}/
    953926                                        # when /\A\d+/
    954927                                                @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)]
    955                                         # 文字
     928                                        # 文字
    956929                                        when /\A'(?:[^'\\]|\\.)'/
    957930                                                @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)]
    958                                         # 文字列
    959 #                                       "#include  #include #include \"../systask/logtask.cfg\"       æœ€å¾Œã® " 忘れ)で無限ループ
     931                                        # 文字列
     932#                                       "#include  #include #include \"../systask/logtask.cfg\"       最後の " 忘れ)で無限ループ
    960933#                                       when /\A"(?:[^"\\]+|\\.)*"/
    961                                         when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
     934                                        when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
    962935                                                @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)]
    963                                         # 行コメント
     936                                        # 行コメント
    964937                                        when /\A\/\/.*$/
    965                                                 # 読み飛ばすだけ
    966                                         # コメント開始
     938                                                # 読み飛ばすだけ
     939                                        # コメント開始
    967940                                        when /\A\/\*/
    968941                                                comment = true
     
    995968        }
    996969
    997         # 終了の印
     970        # 終了の印
    998971        @q << nil
    999972
     
    1022995                        end
    1023996
    1024                         # TYPE_NAME トークンへ置き換え
     997                        # TYPE_NAME トークンへ置き換え
    1025998                        if @b_no_type_name == false
    1026999                                if token[0] == :IDENTIFIER && Namespace.is_typename?( token[1].val ) then
     
    10311004                        end
    10321005
    1033                         if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
     1006                        if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
    10341007                                locale = @@current_locale[@@generator_nest]
    10351008                                if token then
     
    10611034        @@n_info = 0
    10621035
    1063         # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
     1036        # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
    10641037        def self.error( msg )
    10651038                @@n_error += 1
     
    10731046        end
    10741047
    1075         # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
     1048        # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
    10761049        def self.warning( msg )
    10771050                @@n_warning += 1
     
    10801053        end
    10811054
    1082         # このメソッドは構文解析、意味解析からのみ呼出し可
     1055        # このメソッドは構文解析、意味解析からのみ呼出し可
    10831056        def self.info( msg )
    10841057                @@n_info += 1
  • azure_iot_hub/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
    r388 r389  
    9595  }
    9696
    97   # 指定子 '[]' å†
    98 ã§ã®ã¿ä½¿ç”¨ã§ãã‚‹ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰
     97  # 指定子 '[]' 内でのみ使用できるキーワード
    9998  RESERVED2 = {
    10099    # specifier
     
    113112    # port (entry)
    114113    'inline' => :INLINE,
    115     'ref_desc' => :REF_DESC,   # call も可
     114    'ref_desc' => :REF_DESC,   # call も可
    116115
    117116    # port (call)
     
    157156  }
    158157
    159   # 再帰的なパーサのためのスタック
     158  # 再帰的なパーサのためのスタック
    160159  @@generator_nest = -1
    161160  @@generator_stack = []
    162161  @@current_locale = []
    163162
    164   # import_C 中である
     163  # import_C 中である
    165164  @@import_C = false
    166165
    167   # すべての構文解析が完了した
     166  # すべての構文解析が完了した
    168167  @@b_end_all_parse = false
    169168
    170   # tag なし struct
     169  # tag なし struct
    171170  @@no_struct_tag_num = 0
    172171
    173172  def self.parse( file_name, plugin = nil, b_reuse = false )
    174     # パーサインスタンスを生成(別パーサで読み込む)
     173    # パーサインスタンスを生成(別パーサで読み込む)
    175174    parser = Generator.new
    176175
    177     # plugin から import されている場合の plugin 設定
     176    # plugin から import されている場合の plugin 設定
    178177    parser.set_plugin plugin
    179178
    180     # reuse フラグを設定
     179    # reuse フラグを設定
    181180    parser.set_reuse b_reuse
    182181
    183     # cdl をパース
     182    # cdl をパース
    184183    parser.parse( [file_name] )
    185184
    186     # 終期化 パーサスタックを戻す
     185    # 終期化 パーサスタックを戻す
    187186    parser.finalize
    188187  end
     
    204203  def self.get_plugin
    205204    if @@generator_stack[@@generator_nest] then
    206       # tecsgen 引数の cdl が import される場合は nil
     205      # tecsgen 引数の cdl が import される場合は nil
    207206      return @@generator_stack[@@generator_nest].get_plugin
    208207    else
     
    221220  def self.is_reuse?
    222221    if @@generator_stack[@@generator_nest] then
    223       # tecsgen 引数の cdl が import される場合は nil
     222      # tecsgen 引数の cdl が import される場合は nil
    224223      return @@generator_stack[@@generator_nest].is_reuse?
    225224    else
     
    251250      b_in_string = false
    252251
    253       # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
     252      # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
    254253      TECS_LANG::set_kcode_binary
    255254
     
    261260          TECSIO.foreach(file) {|line|
    262261            col = 1
    263 #            line.rstrip!         æ”¹è¡Œå«ã‚€æ–‡å­—列を扱うようになったので、ここで空白を取り除けなくなった
     262#            line.rstrip!         改行含む文字列を扱うようになったので、ここで空白を取り除けなくなった
    264263
    265264            until line.empty?
     
    267266              if b_in_comment
    268267                case line
    269                   # コメント終了
     268                  # コメント終了
    270269                when /\A\*\//
    271270                  b_in_comment = false
    272271                when /\A./
    273272                  ;
    274                 when /\s+/     # line.rstrip! を止めたため \n などの空白文字とまっちするルールがå¿
    275 è¦ã«ãªã£ãŸ
     273                when /\s+/     # line.rstrip! を止めたため \n などの空白文字とまっちするルールが必要になった
    276274                  ;
    277275                end
     
    281279                  @q <<  [:STRING_LITERAL, Token.new(string, file, lineno, col)]
    282280                  b_in_string = false
    283                 elsif line =~ /\A.*\\\n/     # 改行 \n は '.' にマッチしない
     281                elsif line =~ /\A.*\\\n/     # 改行 \n は '.' にマッチしない
    284282                  string += $&
    285                 elsif line =~ /\A.*\n/     # 改行 \n は '.' にマッチしない
     283                elsif line =~ /\A.*\n/     # 改行 \n は '.' にマッチしない
    286284                  string += line
    287                   # この位置では error メソッドは使えない (token 読出し前)
     285                  # この位置では error メソッドは使えない (token 読出し前)
    288286                  puts "#{file}:#{lineno}:#{col}: error: string literal has newline without escape"
    289287                  @@n_error += 1
     
    291289              else
    292290                case line
    293                 # 空白、プリプロセスディレクティブ
     291                # 空白、プリプロセスディレクティブ
    294292                when /\A\s+/
    295293                  ;
    296                 # 識別子
     294                # 識別子
    297295                when /\A[a-zA-Z_]\w*/
    298296                  word = $&
    299297                  @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)]
    300                 # 16 進数定数
     298                # 16 進数定数
    301299                when /\A0x[0-9A-Fa-f]+/
    302300                  @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)]
    303                 # 8 進数定数
     301                # 8 進数定数
    304302                when /\A0[0-7]+/
    305303                  @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)]
    306                 # 浮動小数定数
     304                # 浮動小数定数
    307305                when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/
    308306                  @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
    309                 # 整数定数
     307                # 整数定数
    310308                when /\A\d+/
    311309                  @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)]
    312                 # 文字定数
     310                # 文字定数
    313311                when /\A'(?:[^'\\]|\\.)'/
    314312                  @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)]
    315                 # 文字列
    316 #                "#include  #include #include \"../systask/logtask.cfg\"       æœ€å¾Œã® " 忘れ)で無限ループ
     313                # 文字列
     314#                "#include  #include #include \"../systask/logtask.cfg\"       最後の " 忘れ)で無限ループ
    317315#                when /\A"(?:[^"\\]+|\\.)*"/
    318                 when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
     316                when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
    319317                  @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)]
    320                 # 文字列 (改行あり)
     318                # 文字列 (改行あり)
    321319                when /\A"(?:[^"\\]|\\.)*\\\n$/
    322320                  string = $&
    323321                  b_in_string = true
    324                 # 文字列 (改行あり, escape なし)
     322                # 文字列 (改行あり, escape なし)
    325323                when /\A("(?:[^"\\]|\e\.)*)\n$/
    326324                  string = $1 + "\\\n"
    327325                  b_in_string = true
    328                   # この位置では error メソッドは使えない (token 読出し前) # mikan cdl_error ではない
     326                  # この位置では error メソッドは使えない (token 読出し前) # mikan cdl_error ではない
    329327                  puts "#{file}:#{lineno}:#{col}: error: string literal has newline without escape"
    330328                  @@n_error += 1
    331                 # 山括弧で囲まれた文字列
     329                # 山括弧で囲まれた文字列
    332330                # when /\A<[0-9A-Za-z_\. \/]+>/   # AB: angle bracke
    333                 when /\A<(?:[^>\\]|\\.)*>/   # これはうまく行くようだ
     331                when /\A<(?:[^>\\]|\\.)*>/   # これはうまく行くようだ
    334332                  @q << [:AB_STRING_LITERAL, Token.new($&, file, lineno, col)]
    335                 # 行コメント
     333                # 行コメント
    336334                when /\A\/\/.*$/
    337                   # 読み飛ばすだけ
    338                 # コメント開始
     335                  # 読み飛ばすだけ
     336                # コメント開始
    339337                when /\A\/\*/
    340338                  b_in_comment = true
    341                 # '>>', '<<' など
     339                # '>>', '<<' など
    342340                when /\A>>/, /\A<</, /\A==/, /\A!=/, /\A\&\&/, /\A\|\|/
    343341                  @q << [$&, Token.new($&, file, lineno, col)]
    344342                when /\A::/, /\A=>/, /\A<=/, /\A>=/
    345343                  @q << [$&, Token.new($&, file, lineno, col)]
    346                 # '(', ')' など一文字の記号、または未知の記号
     344                # '(', ')' など一文字の記号、または未知の記号
    347345                when /\A./
    348346                  @q << [$&, Token.new($&, file, lineno, col)]
     
    368366      }
    369367
    370       # 終了の印
     368      # 終了の印
    371369      @q << nil
    372370
     
    388386
    389387      if token[0] == :IDENTIFIER then
    390         # TYPE_NAME トークンへ置換え
     388        # TYPE_NAME トークンへ置換え
    391389        if Namespace.is_typename?( token[1].val ) then
    392390          token[0] = :TYPE_NAME
    393391        elsif @in_specifier && RESERVED2[ token[1].val.to_s ] then
    394           # 指定子キーワード( '[', ']' å†
    395 ã§ã®ã¿æœ‰åŠ¹)
     392          # 指定子キーワード( '[', ']' 内でのみ有効)
    396393          token[0] = RESERVED2[ token[1].val.to_s ]
    397394        end
    398395      end
    399396
    400       if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
     397      if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
    401398        locale = @@current_locale[@@generator_nest]
    402399        if token then
     
    430427  @@n_info = 0
    431428
    432   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
     429  # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
    433430  def self.error( msg, *arg )
    434431    locale = nil
     
    440437
    441438    msg = TECSMsg.get_error_message( msg )
    442     # $1, $2, ... を arg で置換
     439    # $1, $2, ... を arg で置換
    443440    count = 1
    444441    arg.each{ |a|
     
    448445    }
    449446
    450     # import_C の中でのエラー?
     447    # import_C の中でのエラー?
    451448    if @@import_C then
    452449      C_parser.error( msg )
    453450    else
    454451
    455       # Node の記憶する 位置 (locale) を使用した場合、変更以前に比べ、
    456       # 問題発生箇所と異なる位置にエラーが出るため、構文解析中のエラー
    457       # は、解析中の位置を出力する.(new_XXX で owner が子要素のチェッ
    458       # クをすると owner の行番号が出てしまう点で、ずれが生じている)
     452      # Node の記憶する 位置 (locale) を使用した場合、変更以前に比べ、
     453      # 問題発生箇所と異なる位置にエラーが出るため、構文解析中のエラー
     454      # は、解析中の位置を出力する.(new_XXX で owner が子要素のチェッ
     455      # クをすると owner の行番号が出てしまう点で、ずれが生じている)
    459456
    460457      if @@b_end_all_parse == false || locale == nil then
     
    469466  end
    470467
    471   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
     468  # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
    472469  def self.warning( msg, *arg )
    473470    locale = nil
     
    479476
    480477    msg = TECSMsg.get_warning_message( msg )
    481     # $1, $2, ... を arg で置換
     478    # $1, $2, ... を arg で置換
    482479    count = 1
    483480    arg.each{ |a|
     
    487484    }
    488485
    489     # import_C の中でのウォーニング?
     486    # import_C の中でのウォーニング?
    490487    if @@import_C then
    491488      C_parser.warning( msg )
     
    502499  end
    503500
    504   # このメソッドは構文解析、意味解析からのみ呼出し可
     501  # このメソッドは構文解析、意味解析からのみ呼出し可
    505502  def self.info( msg, *arg )
    506503    locale = nil
     
    512509
    513510    msg = TECSMsg.get_info_message( msg )
    514     # $1, $2, ... を arg で置換
     511    # $1, $2, ... を arg で置換
    515512    count = 1
    516513    arg.each{ |a|
     
    520517    }
    521518
    522     # import_C の中でのウォーニング?
     519    # import_C の中でのウォーニング?
    523520    if @@import_C then
    524521      C_parser.info( msg )
     
    555552  end
    556553
    557   #===  '[' specifier 始め
     554  #===  '[' specifier 始め
    558555  def set_in_specifier
    559556    # p "set_in_specifier"
     
    561558  end
    562559
    563   #=== ']' specifier 終わり
     560  #=== ']' specifier 終わり
    564561  def unset_in_specifier
    565562    # p "unset_in_specifier"
     
    567564  end
    568565
    569   # statement_specifier は構文解釈途中で参ç
    570 §ã—たいため
     566  # statement_specifier は構文解釈途中で参照したいため
    571567  @@statement_specifier_stack = []
    572568  def self.add_statement_specifier( ss )
     
    585581  end
    586582
    587   #=== すべての構文解析が完了したことを報告
     583  #=== すべての構文解析が完了したことを報告
    588584  def self.end_all_parse
    589585    @@b_end_all_parse = true
     
    23692365module_eval(<<'.,.,', 'bnf.y.rb', 76)
    23702366  def _reduce_13(val, _values, result)
    2371                         # 連接した文字列を1つの文字列にまとめる
     2367                        # 連接した文字列を1つの文字列にまとめる
    23722368                        str = "\"" + val[0].val.gsub( /\"(.*)\"/, "\\1" ) + val[1].val.gsub( /\"(.*)\"/, "\\1" ) + "\""
    23732369                        result = Token.new( str, val[0].file, val[0].lineno, val[0].col )
     
    29472943module_eval(<<'.,.,', 'bnf.y.rb', 379)
    29482944  def _reduce_104(val, _values, result)
    2949                         # tag が無い場合、å†
    2950 éƒ¨åã‚’与える
     2945                        # tag が無い場合、内部名を与える
    29512946                        result = StructType.new( :"TAG__#{@@no_struct_tag_num}__" )
    29522947                        @@no_struct_tag_num += 1
     
    32673262  def _reduce_153(val, _values, result)
    32683263                        val[0].add_param( val[2] )
    3269                         # result = val[0] 不要
     3264                        # result = val[0] 不要
    32703265               
    32713266    result
     
    34223417                                result = val[1]
    34233418                        else
    3424                                 # エラー:仮で val[0] を返す
     3419                                # エラー:仮で val[0] を返す
    34253420                                result = val[0]
    34263421                        end
     
    35683563                        obj = val[3]
    35693564                        if obj.kind_of?( Cell ) || obj.kind_of?( Signature ) || obj.kind_of?( Celltype ) || obj.kind_of?( CompositeCelltype )then
    3570                                 # cell, signature 以外は、指定子を置けない
     3565                                # cell, signature 以外は、指定子を置けない
    35713566                        else
    3572               Generator.get_statement_specifier   # クリア
     3567              Generator.get_statement_specifier   # クリア
    35733568              Generator.error( "G1009 unexpected specifier"  )
    35743569                        end
     
    39413936                                val[1].check
    39423937                        else
    3943                                 # mikan 関数のé
    3944 åˆ—も以下のメッセージになる
     3938                                # mikan 関数の配列も以下のメッセージになる
    39453939                                Generator.error( "G1010 Not function"  )
    39463940                                result = nil
     
    39973991  def _reduce_265(val, _values, result)
    39983992                        if val[3].kind_of? Port then
    3999                                 val[3].set_specifier val[1]  # 設定順序あり
     3993                                val[3].set_specifier val[1]  # 設定順序あり
    40003994                                Celltype.new_port( val[3] )
    40013995                        else
    4002                                 # Port 以外では指定子はエラー
     3996                                # Port 以外では指定子はエラー
    40033997                                Generator.error( "G1012 $1 : cannot put specifier here" , val[1] )
    40043998                        end
     
    42054199  def _reduce_298(val, _values, result)
    42064200                        val[3].each{ |i|       # i:Decl
    4207                                 i.set_kind( :ATTRIBUTE )   # 設定順序あり
     4201                                i.set_kind( :ATTRIBUTE )   # 設定順序あり
    42084202                                i.set_specifier_list( [val[1]] )
    42094203                                i.check
     
    42874281  def _reduce_309(val, _values, result)
    42884282                        val[3].each{ |i|       # i:Decl
    4289                                 i.set_kind( :VAR )   # 設定順序あり
     4283                                i.set_kind( :VAR )   # 設定順序あり
    42904284                                i.set_specifier_list( [val[1]] )
    42914285                                i.check
     
    45684562  def _reduce_354(val, _values, result)
    45694563                        if val[0].kind_of?( Port ) then
    4570                                 CompositeCelltype.new_port( val[0] )   # é
    4571 å»¶ã—て登録
     4564                                CompositeCelltype.new_port( val[0] )   # 遅延して登録
    45724565                        end
    45734566               
     
    45794572  def _reduce_355(val, _values, result)
    45804573                        if val[3].kind_of?( Port ) then
    4581                                 # port 以外 val[3] に有効な値がå
    4582 ¥ã£ã¦ã„ないので、以下のメソッドを適用できない
    4583                                 # 現状 port, cell 以外は指定子を受け付けない
    4584                                 # (しかし将来他の文も指定子を受け付ける可能性があるので、この位置に記述する)
     4574                                # port 以外 val[3] に有効な値が入っていないので、以下のメソッドを適用できない
     4575                                # 現状 port, cell 以外は指定子を受け付けない
     4576                                # (しかし将来他の文も指定子を受け付ける可能性があるので、この位置に記述する)
    45854577                                val[3].set_specifier( Generator.get_statement_specifier )
    4586                                 CompositeCelltype.new_port( val[3] )   # é
    4587 å»¶ã—て登録 (set_specifier 後)
     4578                                CompositeCelltype.new_port( val[3] )   # 遅延して登録 (set_specifier 後)
    45884579                        elsif val[3].kind_of?( Cell ) then
    4589                                 # Cell.end_of_parse にて設定
     4580                                # Cell.end_of_parse にて設定
    45904581                        else
    4591               Generator.get_statement_specifier   # クリア
     4582              Generator.get_statement_specifier   # クリア
    45924583              Generator.error( "G1013 unexpected specifier"  )
    45934584                        end
     
    48774868                        if obj.kind_of?( Cell ) then
    48784869                        else
    4879               Generator.get_statement_specifier   # クリア
     4870              Generator.get_statement_specifier   # クリア
    48804871              Generator.error( "G9999 unexpected specifier"  )
    48814872                        end
     
    51025093
    51035094
    5104 # ファイル => INCLUDE("header")のé
    5105 åˆ—
     5095# ファイル => INCLUDE("header")の配列
    51065096Include = Hash.new {|hash, key| hash[key] = []}
    51075097
     
    51575147
    51585148#= TECSIO
    5159 #  Ruby2.0(1.9) 対応に伴い導å
    5160 ¥ã—たクラス
    5161 #  SJIS 以外では、ASCII-8BIT としてå
    5162 ¥åŠ›ã™ã‚‹
     5149#  Ruby2.0(1.9) 対応に伴い導入したクラス
     5150#  SJIS 以外では、ASCII-8BIT として入力する
    51635151class TECSIO
    5164   def self.foreach(file) # ブロック引数 { |line| }
    5165     pr = Proc.new   # このメソッドのブロック引数を pr に代å
    5166 ¥
     5152  def self.foreach(file) # ブロック引数 { |line| }
     5153    pr = Proc.new   # このメソッドのブロック引数を pr に代入
    51675154    if $b_no_kcode then
    51685155          msg = "E".encode $Ruby19_File_Encode
    51695156      if( $Ruby19_File_Encode == "Shift_JIS" )
    51705157
    5171         # Shift JIS は、いったん Windows-31J として読み込ませ、Shift_JIS に変換させる.
    5172         # コメント等に含まれる SJIS に不適切な文字コードは '?' または REPLACEMENT CHARACTER に変換される.
    5173         # EUC や UTF-8 で記述された CDL が混在していても、Ruby 例外が発生することなく処理を進めることができる.
    5174         # 文字コード指定が SJIS であって、文字列リテラルの中に、文字コードがSJIS 以外の非 ASCII が含まれている場合、
    5175         # Ruby 1.8 の tecsgen では文字コード指定に影響なく処理されたものが、Ruby 1.9 以降では '?' に置き換わる可能性がある.
     5158        # Shift JIS は、いったん Windows-31J として読み込ませ、Shift_JIS に変換させる.
     5159        # コメント等に含まれる SJIS に不適切な文字コードは '?' または REPLACEMENT CHARACTER に変換される.
     5160        # EUC や UTF-8 で記述された CDL が混在していても、Ruby 例外が発生することなく処理を進めることができる.
     5161        # 文字コード指定が SJIS であって、文字列リテラルの中に、文字コードがSJIS 以外の非 ASCII が含まれている場合、
     5162        # Ruby 1.8 の tecsgen では文字コード指定に影響なく処理されたものが、Ruby 1.9 以降では '?' に置き換わる可能性がある.
    51765163
    51775164        mode = "r:Windows-31J"
     
    51975184  end
    51985185
    5199   #=== 文字コードが相違する場合一致させる
    5200   # msg と str の文字コードが相違する場合、str を msg の文字コードに変換する
    5201   # 変換不可の文字コードは '?' (utf-8 の場合 U+FFFD (REPLACEMENT CHARACTER )) に変換
     5186  #=== 文字コードが相違する場合一致させる
     5187  # msg と str の文字コードが相違する場合、str を msg の文字コードに変換する
     5188  # 変換不可の文字コードは '?' (utf-8 の場合 U+FFFD (REPLACEMENT CHARACTER )) に変換
    52025189  #
    5203   # このメソッドは、エラーメッセージ出力でも使用されていることに注意.
     5190  # このメソッドは、エラーメッセージ出力でも使用されていることに注意.
    52045191  #
    52055192  #msg_enc::Encode | String
    52065193  def self.str_code_convert( msg, str )
    52075194    if $b_no_kcode == false then
    5208       return str                          # Ruby V1.8 まで
     5195      return str                          # Ruby V1.8 まで
    52095196    end
    52105197    if msg.encoding != str.encoding then
    5211       option = { :invalid => :replace, :undef => :replace }   # 例外を発生させず、'?' に変換する(utf-8 は 0xfffd)
     5198      option = { :invalid => :replace, :undef => :replace }   # 例外を発生させず、'?' に変換する(utf-8 は 0xfffd)
    52125199      # return str.encode( msg.encoding, option )
    52135200      str = str.encode( "utf-8", option )
  • azure_iot_hub/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
    r388 r389  
    66#   Copyright (C) 2008-2018 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
    5237#   $Id$
     
    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 '{'
     
    397378        | STRUCT
    398379                {
    399                         # tag が無い場合、å†
    400 éƒ¨åã‚’与える
     380                        # tag が無い場合、内部名を与える
    401381                        result = StructType.new( :"TAG__#{@@no_struct_tag_num}__" )
    402382                        @@no_struct_tag_num += 1
     
    408388                        result = val[1]
    409389                }
    410         | STRUCT struct_tag   # mikan struct_tag は namespace 対応がå¿
    411 è¦
     390        | STRUCT struct_tag   # mikan struct_tag は namespace 対応が必要
    412391                {
    413392                        StructType.set_define( false )
     
    424403                { result = StructType.new( val[0].val ) }
    425404
    426 # ポインタ修飾子を追加
     405# ポインタ修飾子を追加
    427406struct_declaration
    428407        :                                type_specifier_qualifier_list struct_declarator_list ';'
     
    459438
    460439
    461 # K&Rのspecifier_qualifier_listと同じ
    462 # 名前がまぎらわしかったのでtype_を付けた
     440# K&Rのspecifier_qualifier_listと同じ
     441# 名前がまぎらわしかったのでtype_を付けた
    463442type_specifier_qualifier_list
    464 # Oyama type_specifier を繰り返して指定することはなくなった (sign_int_type としたため)
     443# Oyama type_specifier を繰り返して指定することはなくなった (sign_int_type としたため)
    465444#        : type_specifier type_specifier_qualifier_list
    466445        : type_specifier
     
    470449                        result = val[1]
    471450                }
    472 # mikan Oyama type_qualifier だけでは型指定にならない : 構文エラーとするより、意味エラーとした方が親切
     451# mikan Oyama type_qualifier だけでは型指定にならない : 構文エラーとするより、意味エラーとした方が親切
    473452#        | type_qualifier
    474453
     
    480459                { result << val[2] }
    481460
    482 # ビットフィールドは使えない
     461# ビットフィールドは使えない
    483462struct_declarator
    484463        : declarator
    485464
    486 # enumの種類を追加
     465# enumの種類を追加
    487466enum_specifier          # mikan
    488467        : enum_type            '{' enumerator_list '}'
     
    538517                        result = val[0]
    539518                }
    540 #        | direct_declarator '(' identifier_list ')'  # これは何のためにå¿
    541 è¦ï¼Ÿ 060211
     519#        | direct_declarator '(' identifier_list ')'  # これは何のために必要? 060211
    542520        | direct_declarator '(' ')'
    543521                {
     
    572550        : parameter_list
    573551        | parameter_list ',' '...'
    574                 # mikan 可変長パラメータ
     552                # mikan 可変長パラメータ
    575553
    576554parameter_list
     
    580558                {
    581559                        val[0].add_param( val[2] )
    582                         # result = val[0] 不要
    583                 }
    584 
    585 
    586 # パラメータ修飾子を追加
     560                        # result = val[0] 不要
     561                }
     562
     563
     564# パラメータ修飾子を追加
    587565parameter_declaration
    588566#        : spec_L parameter_specifier_list spec_R declaration_specifiers declarator
     
    595573                }
    596574
    597         # 以下はエラーとする
    598         | declaration_specifiers declarator # parameter_specifier なしは扱わない
     575        # 以下はエラーとする
     576        | declaration_specifiers declarator # parameter_specifier なしは扱わない
    599577                {
    600578                        Generator.error( "G1001 need specifier for \'$1\'" , val[1].get_name )
    601579                        result = nil
    602580                }
    603         | declaration_specifiers        # 仮引数なしは、とりあえず扱わない 060210
     581        | declaration_specifiers        # 仮引数なしは、とりあえず扱わない 060210
    604582                {
    605583                        unless val[0].instance_of?( VoidType ) then
     
    608586                        result = nil
    609587                }
    610 #        | '[' parameter_specifier_list ']' declaration_specifiers # 同 060210
    611         | parameter_specifier_list_bracket declaration_specifiers # 同 060210
     588#        | '[' parameter_specifier_list ']' declaration_specifiers # 060210
     589        | parameter_specifier_list_bracket declaration_specifiers # 060210
    612590                {
    613591                        unless val[1].instance_of?( VoidType ) then
     
    650628                                result = val[1]
    651629                        else
    652                                 # エラー:仮で val[0] を返す
     630                                # エラー:仮で val[0] を返す
    653631                                result = val[0]
    654632                        end
    655633                }
    656                 # mikan abstract_declarator が pointer 以外ではうまく動かない、とりあえず '*' CAST のみ救った
     634                # mikan abstract_declarator が pointer 以外ではうまく動かない、とりあえず '*' CAST のみ救った
    657635
    658636abstract_declarator             # mikan
     
    663641direct_abstract_declarator
    664642        : '(' abstract_declarator ')'
    665                 { result = val[1] }  # 関数ポインタ型を救う
     643                { result = val[1] }  # 関数ポインタ型を救う
    666644        | '[' ']'
    667645                {
     
    702680                }
    703681
    704 # assignment_expressionをconstant_expressionに変更
     682# assignment_expressionをconstant_expressionに変更
    705683initializer                     # mikan
    706684        : constant_expression
     
    726704
    727705
    728 ##########################  ここからはCDL独自  ##########################
    729 
    730 #トップレベルの構文規則
    731 #コンポーネント記述
     706##########################  ここからはCDL独自  ##########################
     707
     708#トップレベルの構文規則
     709#コンポーネント記述
    732710component_description
    733711        : component_description specified_statement
     
    742720                        obj = val[3]
    743721                        if obj.kind_of?( Cell ) || obj.kind_of?( Signature ) || obj.kind_of?( Celltype ) || obj.kind_of?( CompositeCelltype )then
    744                                 # cell, signature 以外は、指定子を置けない
     722                                # cell, signature 以外は、指定子を置けない
    745723                        else
    746               Generator.get_statement_specifier   # クリア
     724              Generator.get_statement_specifier   # クリア
    747725              Generator.error( "G1009 unexpected specifier"  )
    748726                        end
    749727                }
    750                 # これと同じ記述が composite_celltype にもある
     728                # これと同じ記述が composite_celltype にもある
    751729
    752730statement
     
    764742        | import_C
    765743        | generate_statement
    766         | error   # エラー回復ポイント
     744        | error   # エラー回復ポイント
    767745
    768746       
     
    803781        | IDENTIFIER '[' constant_expression ']' '.' IDENTIFIER '.' IDENTIFIER '=' initializer
    804782                {  result = [ :NORMAL_ALLOC, val[0], val[2], val[5], val[7], val[9] ] }
    805 # mikan 将来的な拡張 ('*' でまとめて指定可能とする)
     783# mikan 将来的な拡張 ('*' でまとめて指定可能とする)
    806784#        | IDENTIFIER '.' IDENTIFIER '.' '*'        '=' initializer
    807785#               {  result = [ val[0], val[ ], val[ ], val[ ] ] }
     
    828806
    829807const_statement
    830         : declaration   # 定数定義
     808        : declaration   # 定数定義
    831809                {
    832810                        val[0].each { |decl|
     
    883861                        }
    884862                }
    885                 # mikan   typedef_specifier 未処置
     863                # mikan   typedef_specifier 未処置
    886864
    887865
     
    903881        : IDENTIFIER
    904882                {result = Namespace.new(val[0].val)}
    905                 # namespace インスタンスに statement を記憶させるためここで生成
     883                # namespace インスタンスに statement を記憶させるためここで生成
    906884
    907885statement_list
     
    915893                { result = val[0].append!( val[2].val ) }
    916894
    917 #シグニチャ
     895#シグニチャ
    918896signature
    919897        : SIGNATURE signature_name '{' function_head_list '}' ';'
     
    924902                {result = Signature.new( val[0].val ) }
    925903
    926 function_head_list     # result:  function_head のé
    927 åˆ—
     904function_head_list     # result:  function_head の配列
    928905#        : function_head
    929906#               { result = NamedList.new( val[0], "function" ) }
     
    942919                                val[1].check
    943920                        else
    944                                 # mikan 関数のé
    945 åˆ—も以下のメッセージになる
     921                                # mikan 関数の配列も以下のメッセージになる
    946922                                Generator.error( "G1010 Not function"  )
    947923                                result = nil
     
    959935
    960936
    961 #セルタイプ
     937#セルタイプ
    962938celltype
    963939        : CELLTYPE celltype_name '{' celltype_statement_list '}' ';'
     
    985961                {
    986962                        if val[3].kind_of? Port then
    987                                 val[3].set_specifier val[1]  # 設定順序あり
     963                                val[3].set_specifier val[1]  # 設定順序あり
    988964                                Celltype.new_port( val[3] )
    989965                        else
    990                                 # Port 以外では指定子はエラー
     966                                # Port 以外では指定子はエラー
    991967                                Generator.error( "G1012 $1 : cannot put specifier here" , val[1] )
    992968                        end
     
    999975        | require
    1000976        | factory
    1001 #        | error       # エラー回復ポイント  (#513 無限ループに陥るケースがあるので、ここでのエラー回復は取りやめ)
     977#        | error       # エラー回復ポイント  (#513 無限ループに陥るケースがあるので、ここでのエラー回復は取りやめ)
    1002978
    1003979celltype_statement_specifier_list
     
    1016992
    1017993alloc_list2
    1018         : alloc2                        { result = [ val[0] ] }    # 受け口のアロケータ指定
    1019         | alloc                         { result = [ val[0] ] }    # å†
    1020 éƒ¨ã‚»ãƒ«ã®ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿æŒ‡å®š
     994        : alloc2                        { result = [ val[0] ] }    # 受け口のアロケータ指定
     995        | alloc                         { result = [ val[0] ] }    # 内部セルのアロケータ指定
    1021996        | alloc_list2 ',' alloc2        { result << val[2] }
    1022997        | alloc_list2 ',' alloc         { result << val[2] }
    1023998
    1024999alloc2
    1025         : IDENTIFIER '.' IDENTIFIER '=' initializer    # å†
    1026 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ (デバドラ向きアロケータ)指定
     1000        : IDENTIFIER '.' IDENTIFIER '=' initializer    # 内部アロケータ (デバドラ向きアロケータ)指定
    10271001                {  result = [ :INTERNAL_ALLOC, val[0].val, val[2].val, val[4] ] }
    1028         | IDENTIFIER '.' IDENTIFIER '<=' initializer   # 多段リレーモデル向きアロケータ指定
     1002        | IDENTIFIER '.' IDENTIFIER '<=' initializer   # 多段リレーモデル向きアロケータ指定
    10291003                {  result = [ :RELAY_ALLOC, val[0].val, val[2].val, val[4] ] }
    10301004
    10311005
    1032 #呼び口、受け口
     1006#呼び口、受け口
    10331007port
    10341008        : port_type namespace_signature_name port_name ';'
     
    10561030
    10571031
    1058 #属性
     1032#属性
    10591033attribute
    10601034        : ATTRIBUTE '{' attribute_declaration_list '}' ';'
     
    10801054                {
    10811055                        val[3].each{ |i|       # i:Decl
    1082                                 i.set_kind( :ATTRIBUTE )   # 設定順序あり
     1056                                i.set_kind( :ATTRIBUTE )   # 設定順序あり
    10831057                                i.set_specifier_list( [val[1]] )
    10841058                                i.check
     
    10991073        : STRING_LITERAL
    11001074
    1101 #å†
    1102 éƒ¨å¤‰æ•°
     1075#内部変数
    11031076var
    11041077        : VAR '{' var_declaration_list '}' ';'
     
    11221095                {
    11231096                        val[3].each{ |i|       # i:Decl
    1124                                 i.set_kind( :VAR )   # 設定順序あり
     1097                                i.set_kind( :VAR )   # 設定順序あり
    11251098                                i.set_specifier_list( [val[1]] )
    11261099                                i.check
     
    11321105        : SIZE_IS  '(' expression ')'   { result = [:SIZE_IS,val[2]] }
    11331106
    1134 # リクワイア
     1107# リクワイア
    11351108require
    11361109        : REQUIRE namespace_identifier '.' IDENTIFIER';'                            # mikan namespace #1
     
    11431116                }
    11441117
    1145 #ファクトリ
     1118#ファクトリ
    11461119factory
    11471120        : factory_head '{' factory_function_list '}' ';'
     
    11521125
    11531126factory_function_list
    1154         :                                         # 空
     1127        :                                         #
    11551128        | factory_function_list factory_function
    11561129
     
    11641137        : IDENTIFIER
    11651138
    1166 arg_list     # factory の write 関数の第三引数以降
     1139arg_list     # factory の write 関数の第三引数以降
    11671140        : IDENTIFIER
    11681141                { result = [ [ :IDENTIFIER, val[0].val ] ] }
     
    11741147                { result << [ :STRING_LITERAL, val[2].val ] }
    11751148
    1176 #セル生成
     1149#セル生成
    11771150cell
    11781151        : CELL namespace_celltype_name cell_name '{'
     
    11801153          join_list '}' ';'
    11811154                { result = Cell.end_of_parse true }
    1182         | CELL namespace_celltype_name cell_name ';'   # oyama プロトタイプ宣言
     1155        | CELL namespace_celltype_name cell_name ';'   # oyama プロトタイプ宣言
    11831156                        { result = Cell.end_of_parse false }
    11841157
     
    11921165
    11931166join_list
    1194         :   # 空行  061007
     1167        :   # 空行  061007
    11951168        | join_list specified_join
    11961169        | join_list reverse_join
     
    12351208                        Cell.new_join( result, true )
    12361209                }
    1237         | cae_name '=' initializer ';'     # 初期化子: '{', '}' も可
     1210        | cae_name '=' initializer ';'     # 初期化子: '{', '}' も可
    12381211                {
    12391212                        result = Join.new( val[0].val, nil, val[2] )
     
    12791252        : constant_expression
    12801253
    1281 #複合種
     1254#複合種
    12821255composite_celltype
    12831256        : COMPOSITE composite_celltype_name '{' composite_celltype_statement_list '}' ';'
     
    12991272                {
    13001273                        if val[0].kind_of?( Port ) then
    1301                                 CompositeCelltype.new_port( val[0] )   # é
    1302 å»¶ã—て登録
     1274                                CompositeCelltype.new_port( val[0] )   # 遅延して登録
    13031275                        end
    13041276                }
     
    13061278                {
    13071279                        if val[3].kind_of?( Port ) then
    1308                                 # port 以外 val[3] に有効な値がå
    1309 ¥ã£ã¦ã„ないので、以下のメソッドを適用できない
    1310                                 # 現状 port, cell 以外は指定子を受け付けない
    1311                                 # (しかし将来他の文も指定子を受け付ける可能性があるので、この位置に記述する)
     1280                                # port 以外 val[3] に有効な値が入っていないので、以下のメソッドを適用できない
     1281                                # 現状 port, cell 以外は指定子を受け付けない
     1282                                # (しかし将来他の文も指定子を受け付ける可能性があるので、この位置に記述する)
    13121283                                val[3].set_specifier( Generator.get_statement_specifier )
    1313                                 CompositeCelltype.new_port( val[3] )   # é
    1314 å»¶ã—て登録 (set_specifier 後)
     1284                                CompositeCelltype.new_port( val[3] )   # 遅延して登録 (set_specifier 後)
    13151285                        elsif val[3].kind_of?( Cell ) then
    1316                                 # Cell.end_of_parse にて設定
     1286                                # Cell.end_of_parse にて設定
    13171287                        else
    1318               Generator.get_statement_specifier   # クリア
     1288              Generator.get_statement_specifier   # クリア
    13191289              Generator.error( "G1013 unexpected specifier"  )
    13201290                        end
     
    13261296        | internal_cell
    13271297        | export_join
    1328 #        | error       # エラー回復ポイント  (#513 無限ループに陥るケースがあるので、ここでのエラー回復は取りやめ)
     1298#        | error       # エラー回復ポイント  (#513 無限ループに陥るケースがあるので、ここでのエラー回復は取りやめ)
    13291299
    13301300composite_celltype_statement_specifier_list
     
    13541324                }
    13551325
    1356 #属性
     1326#属性
    13571327composite_attribute
    13581328        : ATTRIBUTE '{' composite_attribute_declaration_list '}' ';'
     
    13851355
    13861356internal_join_list
    1387         :   # 空行  061007
     1357        :   # 空行  061007
    13881358        | internal_join_list specified_join
    13891359        | internal_join_list external_join
    13901360        | internal_join_list reverse_join
    13911361
    1392 external_join  # cell å†
    1393 ã«è¨˜è¿°ã™ã‚‹å‘¼ã³å£ã®å¤–部結合
     1362external_join  # cell 内に記述する呼び口の外部結合
    13941363        : internal_cell_elem_name '=>' COMPOSITE '.' export_name ';'
    13951364                {       Cell.external_join( val[0].val, val[4].val, true )      }
    13961365        | internal_cell_elem_name '=>' export_name ';'
    13971366                {       Cell.external_join( val[0].val, val[2].val, false )     }
    1398         # 以前の文法では、呼び口側も cell の外に記述していた
    1399         # その時の実è£
    1400 ã‚’
    1401 
    1402 export_join    # cell 外に記述する受け口の外部結合
     1367        # 以前の文法では、呼び口側も cell の外に記述していた
     1368        # その時の実装を
     1369
     1370export_join    # cell 外に記述する受け口の外部結合
    14031371        : export_name '=>' internal_ref_cell_name '.' internal_cell_elem_name ';'
    14041372                {
     
    14211389        : IDENTIFIER
    14221390
    1423 # リージョン
     1391# リージョン
    14241392region
    14251393        : spec_L region_specifier_list spec_R REGION region_name '{'  region_statement '}' ';'
     
    14361404        : IN_THROUGH '(' plugin_name ',' plugin_arg ')'
    14371405                { Region.new_in_through( val[2].val, val[4].val ) }
    1438         | IN_THROUGH '(' ')'   # in 許可
     1406        | IN_THROUGH '(' ')'   # in 許可
    14391407                { Region.new_in_through }
    14401408        | OUT_THROUGH '(' plugin_name ',' plugin_arg ')'
    14411409                { Region.new_out_through( val[2].val, val[4].val ) }
    1442         | OUT_THROUGH '(' ')'  # out 許可
     1410        | OUT_THROUGH '(' ')'  # out 許可
    14431411                { Region.new_out_through() }
    14441412        | TO_THROUGH '(' namespace_region_name ',' plugin_name ',' plugin_arg ')'
    14451413                { Region.new_to_through( val[2], val[4].val, val[6].val ) }
    1446         | TO_THROUGH '('namespace_region_name ')'  # to 許可
     1414        | TO_THROUGH '('namespace_region_name ')'  # to 許可
    14471415                { Region.new_to_through( val[2], nil, nil ) }
    14481416        | NODE
     
    14711439                        if obj.kind_of?( Cell ) then
    14721440                        else
    1473               Generator.get_statement_specifier   # クリア
     1441              Generator.get_statement_specifier   # クリア
    14741442              Generator.error( "G9999 unexpected specifier"  )
    14751443                        end
     
    14901458namespace_region_name
    14911459         : :IDENTIFIER
    1492                 { result = [ val[0].val ] }  # mikan é
    1493 åˆ—であるå¿
    1494 è¦ã¯ãªã„
     1460                { result = [ val[0].val ] }  # mikan 配列である必要はない
    14951461#        : namespace_identifier
    14961462
    1497 # 指定子の括弧 (in, out などのキーワード切り替えのため分離)
     1463# 指定子の括弧 (in, out などのキーワード切り替えのため分離)
    14981464spec_L
    14991465        : '['  { set_in_specifier }
     
    16521618  }
    16531619
    1654   # 指定子 '[]' å†
    1655 ã§ã®ã¿ä½¿ç”¨ã§ãã‚‹ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰
     1620  # 指定子 '[]' 内でのみ使用できるキーワード
    16561621  RESERVED2 = {
    16571622    # specifier
     
    16701635    # port (entry)
    16711636    'inline' => :INLINE,
    1672     'ref_desc' => :REF_DESC,   # call も可
     1637    'ref_desc' => :REF_DESC,   # call も可
    16731638
    16741639    # port (call)
     
    17141679  }
    17151680
    1716   # 再帰的なパーサのためのスタック
     1681  # 再帰的なパーサのためのスタック
    17171682  @@generator_nest = -1
    17181683  @@generator_stack = []
    17191684  @@current_locale = []
    17201685
    1721   # import_C 中である
     1686  # import_C 中である
    17221687  @@import_C = false
    17231688
    1724   # すべての構文解析が完了した
     1689  # すべての構文解析が完了した
    17251690  @@b_end_all_parse = false
    17261691
    1727   # tag なし struct
     1692  # tag なし struct
    17281693  @@no_struct_tag_num = 0
    17291694
    17301695  def self.parse( file_name, plugin = nil, b_reuse = false )
    1731     # パーサインスタンスを生成(別パーサで読み込む)
     1696    # パーサインスタンスを生成(別パーサで読み込む)
    17321697    parser = Generator.new
    17331698
    1734     # plugin から import されている場合の plugin 設定
     1699    # plugin から import されている場合の plugin 設定
    17351700    parser.set_plugin plugin
    17361701
    1737     # reuse フラグを設定
     1702    # reuse フラグを設定
    17381703    parser.set_reuse b_reuse
    17391704
    1740     # cdl をパース
     1705    # cdl をパース
    17411706    parser.parse( [file_name] )
    17421707
    1743     # 終期化 パーサスタックを戻す
     1708    # 終期化 パーサスタックを戻す
    17441709    parser.finalize
    17451710  end
     
    17611726  def self.get_plugin
    17621727    if @@generator_stack[@@generator_nest] then
    1763       # tecsgen 引数の cdl が import される場合は nil
     1728      # tecsgen 引数の cdl が import される場合は nil
    17641729      return @@generator_stack[@@generator_nest].get_plugin
    17651730    else
     
    17781743  def self.is_reuse?
    17791744    if @@generator_stack[@@generator_nest] then
    1780       # tecsgen 引数の cdl が import される場合は nil
     1745      # tecsgen 引数の cdl が import される場合は nil
    17811746      return @@generator_stack[@@generator_nest].is_reuse?
    17821747    else
     
    18081773      b_in_string = false
    18091774
    1810       # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
     1775      # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
    18111776      TECS_LANG::set_kcode_binary
    18121777
     
    18181783          TECSIO.foreach(file) {|line|
    18191784            col = 1
    1820 #            line.rstrip!         æ”¹è¡Œå«ã‚€æ–‡å­—列を扱うようになったので、ここで空白を取り除けなくなった
     1785#            line.rstrip!         改行含む文字列を扱うようになったので、ここで空白を取り除けなくなった
    18211786
    18221787            until line.empty?
     
    18241789              if b_in_comment
    18251790                case line
    1826                   # コメント終了
     1791                  # コメント終了
    18271792                when /\A\*\//
    18281793                  b_in_comment = false
    18291794                when /\A./
    18301795                  ;
    1831                 when /\s+/     # line.rstrip! を止めたため \n などの空白文字とまっちするルールがå¿
    1832 è¦ã«ãªã£ãŸ
     1796                when /\s+/     # line.rstrip! を止めたため \n などの空白文字とまっちするルールが必要になった
    18331797                  ;
    18341798                end
     
    18381802                  @q <<  [:STRING_LITERAL, Token.new(string, file, lineno, col)]
    18391803                  b_in_string = false
    1840                 elsif line =~ /\A.*\\\n/     # 改行 \n は '.' にマッチしない
     1804                elsif line =~ /\A.*\\\n/     # 改行 \n は '.' にマッチしない
    18411805                  string += $&
    1842                 elsif line =~ /\A.*\n/     # 改行 \n は '.' にマッチしない
     1806                elsif line =~ /\A.*\n/     # 改行 \n は '.' にマッチしない
    18431807                  string += line
    1844                   # この位置では error メソッドは使えない (token 読出し前)
     1808                  # この位置では error メソッドは使えない (token 読出し前)
    18451809                  puts "#{file}:#{lineno}:#{col}: error: string literal has newline without escape"
    18461810                  @@n_error += 1
     
    18481812              else
    18491813                case line
    1850                 # 空白、プリプロセスディレクティブ
     1814                # 空白、プリプロセスディレクティブ
    18511815                when /\A\s+/
    18521816                  ;
    1853                 # 識別子
     1817                # 識別子
    18541818                when /\A[a-zA-Z_]\w*/
    18551819                  word = $&
    18561820                  @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)]
    1857                 # 16 進数定数
     1821                # 16 進数定数
    18581822                when /\A0x[0-9A-Fa-f]+/
    18591823                  @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)]
    1860                 # 8 進数定数
     1824                # 8 進数定数
    18611825                when /\A0[0-7]+/
    18621826                  @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)]
    1863                 # 浮動小数定数
     1827                # 浮動小数定数
    18641828                when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/
    18651829                  @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
    1866                 # 整数定数
     1830                # 整数定数
    18671831                when /\A\d+/
    18681832                  @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)]
    1869                 # 文字定数
     1833                # 文字定数
    18701834                when /\A'(?:[^'\\]|\\.)'/
    18711835                  @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)]
    1872                 # 文字列
    1873 #                "#include  #include #include \"../systask/logtask.cfg\"       æœ€å¾Œã® " 忘れ)で無限ループ
     1836                # 文字列
     1837#                "#include  #include #include \"../systask/logtask.cfg\"       最後の " 忘れ)で無限ループ
    18741838#                when /\A"(?:[^"\\]+|\\.)*"/
    1875                 when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
     1839                when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
    18761840                  @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)]
    1877                 # 文字列 (改行あり)
     1841                # 文字列 (改行あり)
    18781842                when /\A"(?:[^"\\]|\\.)*\\\n$/
    18791843                  string = $&
    18801844                  b_in_string = true
    1881                 # 文字列 (改行あり, escape なし)
     1845                # 文字列 (改行あり, escape なし)
    18821846                when /\A("(?:[^"\\]|\e\.)*)\n$/
    18831847                  string = $1 + "\\\n"
    18841848                  b_in_string = true
    1885                   # この位置では error メソッドは使えない (token 読出し前) # mikan cdl_error ではない
     1849                  # この位置では error メソッドは使えない (token 読出し前) # mikan cdl_error ではない
    18861850                  puts "#{file}:#{lineno}:#{col}: error: string literal has newline without escape"
    18871851                  @@n_error += 1
    1888                 # 山括弧で囲まれた文字列
     1852                # 山括弧で囲まれた文字列
    18891853                # when /\A<[0-9A-Za-z_\. \/]+>/   # AB: angle bracke
    1890                 when /\A<(?:[^>\\]|\\.)*>/   # これはうまく行くようだ
     1854                when /\A<(?:[^>\\]|\\.)*>/   # これはうまく行くようだ
    18911855                  @q << [:AB_STRING_LITERAL, Token.new($&, file, lineno, col)]
    1892                 # 行コメント
     1856                # 行コメント
    18931857                when /\A\/\/.*$/
    1894                   # 読み飛ばすだけ
    1895                 # コメント開始
     1858                  # 読み飛ばすだけ
     1859                # コメント開始
    18961860                when /\A\/\*/
    18971861                  b_in_comment = true
    1898                 # '>>', '<<' など
     1862                # '>>', '<<' など
    18991863                when /\A>>/, /\A<</, /\A==/, /\A!=/, /\A\&\&/, /\A\|\|/
    19001864                  @q << [$&, Token.new($&, file, lineno, col)]
    19011865                when /\A::/, /\A=>/, /\A<=/, /\A>=/
    19021866                  @q << [$&, Token.new($&, file, lineno, col)]
    1903                 # '(', ')' など一文字の記号、または未知の記号
     1867                # '(', ')' など一文字の記号、または未知の記号
    19041868                when /\A./
    19051869                  @q << [$&, Token.new($&, file, lineno, col)]
     
    19251889      }
    19261890
    1927       # 終了の印
     1891      # 終了の印
    19281892      @q << nil
    19291893
     
    19451909
    19461910      if token[0] == :IDENTIFIER then
    1947         # TYPE_NAME トークンへ置換え
     1911        # TYPE_NAME トークンへ置換え
    19481912        if Namespace.is_typename?( token[1].val ) then
    19491913          token[0] = :TYPE_NAME
    19501914        elsif @in_specifier && RESERVED2[ token[1].val.to_s ] then
    1951           # 指定子キーワード( '[', ']' å†
    1952 ã§ã®ã¿æœ‰åŠ¹)
     1915          # 指定子キーワード( '[', ']' 内でのみ有効)
    19531916          token[0] = RESERVED2[ token[1].val.to_s ]
    19541917        end
    19551918      end
    19561919
    1957       if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
     1920      if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
    19581921        locale = @@current_locale[@@generator_nest]
    19591922        if token then
     
    19871950  @@n_info = 0
    19881951
    1989   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
     1952  # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
    19901953  def self.error( msg, *arg )
    19911954    locale = nil
     
    19971960
    19981961    msg = TECSMsg.get_error_message( msg )
    1999     # $1, $2, ... を arg で置換
     1962    # $1, $2, ... を arg で置換
    20001963    count = 1
    20011964    arg.each{ |a|
     
    20051968    }
    20061969
    2007     # import_C の中でのエラー?
     1970    # import_C の中でのエラー?
    20081971    if @@import_C then
    20091972      C_parser.error( msg )
    20101973    else
    20111974
    2012       # Node の記憶する 位置 (locale) を使用した場合、変更以前に比べ、
    2013       # 問題発生箇所と異なる位置にエラーが出るため、構文解析中のエラー
    2014       # は、解析中の位置を出力する.(new_XXX で owner が子要素のチェッ
    2015       # クをすると owner の行番号が出てしまう点で、ずれが生じている)
     1975      # Node の記憶する 位置 (locale) を使用した場合、変更以前に比べ、
     1976      # 問題発生箇所と異なる位置にエラーが出るため、構文解析中のエラー
     1977      # は、解析中の位置を出力する.(new_XXX で owner が子要素のチェッ
     1978      # クをすると owner の行番号が出てしまう点で、ずれが生じている)
    20161979
    20171980      if @@b_end_all_parse == false || locale == nil then
     
    20261989  end
    20271990
    2028   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
     1991  # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
    20291992  def self.warning( msg, *arg )
    20301993    locale = nil
     
    20361999
    20372000    msg = TECSMsg.get_warning_message( msg )
    2038     # $1, $2, ... を arg で置換
     2001    # $1, $2, ... を arg で置換
    20392002    count = 1
    20402003    arg.each{ |a|
     
    20442007    }
    20452008
    2046     # import_C の中でのウォーニング?
     2009    # import_C の中でのウォーニング?
    20472010    if @@import_C then
    20482011      C_parser.warning( msg )
     
    20592022  end
    20602023
    2061   # このメソッドは構文解析、意味解析からのみ呼出し可
     2024  # このメソッドは構文解析、意味解析からのみ呼出し可
    20622025  def self.info( msg, *arg )
    20632026    locale = nil
     
    20692032
    20702033    msg = TECSMsg.get_info_message( msg )
    2071     # $1, $2, ... を arg で置換
     2034    # $1, $2, ... を arg で置換
    20722035    count = 1
    20732036    arg.each{ |a|
     
    20772040    }
    20782041
    2079     # import_C の中でのウォーニング?
     2042    # import_C の中でのウォーニング?
    20802043    if @@import_C then
    20812044      C_parser.info( msg )
     
    21122075  end
    21132076
    2114   #===  '[' specifier 始め
     2077  #===  '[' specifier 始め
    21152078  def set_in_specifier
    21162079    # p "set_in_specifier"
     
    21182081  end
    21192082
    2120   #=== ']' specifier 終わり
     2083  #=== ']' specifier 終わり
    21212084  def unset_in_specifier
    21222085    # p "unset_in_specifier"
     
    21242087  end
    21252088
    2126   # statement_specifier は構文解釈途中で参ç
    2127 §ã—たいため
     2089  # statement_specifier は構文解釈途中で参照したいため
    21282090  @@statement_specifier_stack = []
    21292091  def self.add_statement_specifier( ss )
     
    21422104  end
    21432105
    2144   #=== すべての構文解析が完了したことを報告
     2106  #=== すべての構文解析が完了したことを報告
    21452107  def self.end_all_parse
    21462108    @@b_end_all_parse = true
     
    21502112
    21512113
    2152 # ファイル => INCLUDE("header")のé
    2153 åˆ—
     2114# ファイル => INCLUDE("header")の配列
    21542115Include = Hash.new {|hash, key| hash[key] = []}
    21552116
     
    22052166
    22062167#= TECSIO
    2207 #  Ruby2.0(1.9) 対応に伴い導å
    2208 ¥ã—たクラス
    2209 #  SJIS 以外では、ASCII-8BIT としてå
    2210 ¥åŠ›ã™ã‚‹
     2168#  Ruby2.0(1.9) 対応に伴い導入したクラス
     2169#  SJIS 以外では、ASCII-8BIT として入力する
    22112170class TECSIO
    2212   def self.foreach(file) # ブロック引数 { |line| }
    2213     pr = Proc.new   # このメソッドのブロック引数を pr に代å
    2214 ¥
     2171  def self.foreach(file) # ブロック引数 { |line| }
     2172    pr = Proc.new   # このメソッドのブロック引数を pr に代入
    22152173    if $b_no_kcode then
    22162174          msg = "E".encode $Ruby19_File_Encode
    22172175      if( $Ruby19_File_Encode == "Shift_JIS" )
    22182176
    2219         # Shift JIS は、いったん Windows-31J として読み込ませ、Shift_JIS に変換させる.
    2220         # コメント等に含まれる SJIS に不適切な文字コードは '?' または REPLACEMENT CHARACTER に変換される.
    2221         # EUC や UTF-8 で記述された CDL が混在していても、Ruby 例外が発生することなく処理を進めることができる.
    2222         # 文字コード指定が SJIS であって、文字列リテラルの中に、文字コードがSJIS 以外の非 ASCII が含まれている場合、
    2223         # Ruby 1.8 の tecsgen では文字コード指定に影響なく処理されたものが、Ruby 1.9 以降では '?' に置き換わる可能性がある.
     2177        # Shift JIS は、いったん Windows-31J として読み込ませ、Shift_JIS に変換させる.
     2178        # コメント等に含まれる SJIS に不適切な文字コードは '?' または REPLACEMENT CHARACTER に変換される.
     2179        # EUC や UTF-8 で記述された CDL が混在していても、Ruby 例外が発生することなく処理を進めることができる.
     2180        # 文字コード指定が SJIS であって、文字列リテラルの中に、文字コードがSJIS 以外の非 ASCII が含まれている場合、
     2181        # Ruby 1.8 の tecsgen では文字コード指定に影響なく処理されたものが、Ruby 1.9 以降では '?' に置き換わる可能性がある.
    22242182
    22252183        mode = "r:Windows-31J"
     
    22452203  end
    22462204
    2247   #=== 文字コードが相違する場合一致させる
    2248   # msg と str の文字コードが相違する場合、str を msg の文字コードに変換する
    2249   # 変換不可の文字コードは '?' (utf-8 の場合 U+FFFD (REPLACEMENT CHARACTER )) に変換
     2205  #=== 文字コードが相違する場合一致させる
     2206  # msg と str の文字コードが相違する場合、str を msg の文字コードに変換する
     2207  # 変換不可の文字コードは '?' (utf-8 の場合 U+FFFD (REPLACEMENT CHARACTER )) に変換
    22502208  #
    2251   # このメソッドは、エラーメッセージ出力でも使用されていることに注意.
     2209  # このメソッドは、エラーメッセージ出力でも使用されていることに注意.
    22522210  #
    22532211  #msg_enc::Encode | String
    22542212  def self.str_code_convert( msg, str )
    22552213    if $b_no_kcode == false then
    2256       return str                          # Ruby V1.8 まで
     2214      return str                          # Ruby V1.8 まで
    22572215    end
    22582216    if msg.encoding != str.encoding then
    2259       option = { :invalid => :replace, :undef => :replace }   # 例外を発生させず、'?' に変換する(utf-8 は 0xfffd)
     2217      option = { :invalid => :replace, :undef => :replace }   # 例外を発生させず、'?' に変換する(utf-8 は 0xfffd)
    22602218      # return str.encode( msg.encoding, option )
    22612219      str = str.encode( "utf-8", option )
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/componentobj.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2019 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
    5237#   $Id$
     
    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 ‹)
    101 #  @descriptor_list:: nil | { Signature => ParamDecl }  最後の ParamDecl しか記憶しないことに注意
    102 #  @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
     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: 空(関数が一つもない状態)
     81#  @descriptor_list:: nil | { Signature => ParamDecl }  最後の ParamDecl しか記憶しないことに注意
     82#  @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
    10383
    10484  include PluginModule
     
    123103
    124104  # STAGE: P
    125   # このメソッドは parse 中のみ呼び出される
     105  # このメソッドは parse 中のみ呼び出される
    126106  def self.get_current
    127107    @@current_object
     
    134114    @name = name
    135115    Namespace.new_signature( self )
    136     set_namespace_path # @NamespacePath の設定
     116    set_namespace_path # @NamespacePath の設定
    137117    if "#{Namespace.get_global_name}" == "" then
    138118      @global_name = @name
     
    158138    @function_head_list = function_head_list
    159139
    160     # id を割付ける
     140    # id を割付ける
    161141    id = 1
    162142    function_head_list.get_items.each{ |f|
     
    180160  end
    181161
    182   #=== Signature# signature の指定子を設定
     162  #=== Signature# signature の指定子を設定
    183163  # STAGE: B
    184164  #spec_list::      [ [ :CONTEXT,  String ], ... ]
    185165  #                     s[0]        s[1]
    186166  def set_specifier_list( spec_list )
    187     return if spec_list == nil  # 空ならば何もしない
     167    return if spec_list == nil  # 空ならば何もしない
    188168
    189169    spec_list.each { |s|
     
    235215  end
    236216
    237   #=== Signature# 関数名から signature å†
    238 ã® id を得る
     217  #=== Signature# 関数名から signature 内の id を得る
    239218  def get_id_from_func_name func_name
    240219    @func_name_to_id[ func_name ]
    241220  end
    242221
    243   #=== Signature# context を得る
    244   # context 文字列を返す "task", "non-task", "any"
    245   # 未指定時のデフォルトとして task を返す
     222  #=== Signature# context を得る
     223  # context 文字列を返す "task", "non-task", "any"
     224  # 未指定時のデフォルトとして task を返す
    246225  def get_context
    247226    if @context then
     
    252231  end
    253232
    254   #=== Signature# signaure のすべての関数のすべてのパラメータをたどる
    255   #block:: ブロックを引数に取る
    256   # ブロックは2つの引数を受け取る  Decl, ParamDecl     ( Decl: 関数ヘッダ )
    257   # Port クラスにも each_param がある(同じ働き)
    258   def each_param # ブロック引数 { |func_decl, param_decl| }
    259     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    260 åˆ—
    261     return if fha == nil                                # nil なら文法エラーで有効値が設定されなかった
    262 
    263     pr = Proc.new   # このメソッドのブロック引数を pr に代å
    264 ¥
    265     fha.each{ |fh|  # fh: FuncHead                      # 関数é
    266 åˆ—中の各関数頭部
    267       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    268       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    269         fd.get_type.get_paramlist.get_items.each{ |par| # すべてのパラメータについて
     233  #=== Signature# signaure のすべての関数のすべてのパラメータをたどる
     234  #block:: ブロックを引数に取る
     235  # ブロックは2つの引数を受け取る  Decl, ParamDecl     ( Decl: 関数ヘッダ )
     236  # Port クラスにも each_param がある(同じ働き)
     237  def each_param # ブロック引数 { |func_decl, param_decl| }
     238    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
     239    return if fha == nil                                # nil なら文法エラーで有効値が設定されなかった
     240
     241    pr = Proc.new   # このメソッドのブロック引数を pr に代入
     242    fha.each{ |fh|  # fh: FuncHead                      # 関数配列中の各関数頭部
     243      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     244      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     245        fd.get_type.get_paramlist.get_items.each{ |par| # すべてのパラメータについて
    270246          pr.call( fd, par )
    271247        }
     
    274250  end
    275251
    276   #=== Signature# 正当なアロケータ シグニチャかテストする
    277   # alloc, dealloc 関数を持つかどうか、第一引き数がそれぞれ、整数、ポインタ、第二引き数が、ポインタへのポインタ、なし
     252  #=== Signature# 正当なアロケータ シグニチャかテストする
     253  # alloc, dealloc 関数を持つかどうか、第一引き数がそれぞれ、整数、ポインタ、第二引き数が、ポインタへのポインタ、なし
    278254  def is_allocator?
    279255
    280     # 一回だけチェックする
     256    # 一回だけチェックする
    281257    if @b_checked_as_allocator_signature == true then
    282258      return true
     
    284260    @b_checked_as_allocator_signature = true
    285261
    286     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    287 åˆ—
    288     if fha == nil then                                  # nil なら文法エラーで有効値が設定されなかった
     262    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
     263    if fha == nil then                                  # nil なら文法エラーで有効値が設定されなかった
    289264      return false
    290265    end
    291266
    292267    found_alloc = false; found_dealloc = false
    293     fha.each{ |fh|  # fh: FuncHead                      # 関数é
    294 åˆ—中の各関数頭部
    295       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    296       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     268    fha.each{ |fh|  # fh: FuncHead                      # 関数配列中の各関数頭部
     269      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     270      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    297271        func_name = fd.get_name.to_sym
    298272        if func_name == :alloc then
     
    303277                ! params[0].get_type.get_original_type.kind_of?( IntType ) ||
    304278                params[0].get_direction != :IN then
    305               # 第一引数が int 型でない
     279              # 第一引数が int 型でない
    306280              if ! params[0].instance_of?( ParamDecl ) ||
    307281                  ! params[0].get_type.kind_of?( PtrType ) ||
     
    309283                  params[0].get_type.get_type.get_type.kind_of?( PtrType ) ||
    310284                  params[0].get_direction != :OUT then
    311                 # 第一引数がポインタ型でもない
     285                # 第一引数がポインタ型でもない
    312286                cdl_error3( @locale, "S1003 $1: \'alloc\' 1st parameter neither [in] integer type nor [out] double pointer type", @name )
    313287              end
     
    317291                params[1].get_type.get_type.get_type.kind_of?( PtrType ) ||
    318292                params[0].get_direction != :IN then
    319               # (第一引数が整数で) 第二引数がポインタでない
     293              # (第一引数が整数で) 第二引数がポインタでない
    320294              cdl_error3( @locale, "S1004 $1: \'alloc\' 2nd parameter not [in] double pointer" , @name )
    321295            end
     
    332306                params[0].get_direction != :IN then
    333307              cdl_error3( @locale, "S1006 $1: \'dealloc\' 1st parameter not [in] pointer type" , @name )
    334 #            elsif params[1] != nil then    # 第二引き数はチェックしない
     308#            elsif params[1] != nil then    # 第二引き数はチェックしない
    335309#              cdl_error3( @locale, "S1007 Error message is changed to empty" )
    336310#                 cdl_error3( @locale, "S1007 $1: \'dealloc\' cannot has 2nd parameter" , @name )
     
    354328  end
    355329
    356   #=== Signature# シグニチャプラグイン (generate 指定子)
     330  #=== Signature# シグニチャプラグイン (generate 指定子)
    357331  def signature_plugin
    358332    plugin_name = @generate[0]
     
    384358end
    385359
    386   #== Signature# 引数で参ç
    387 §ã•ã‚Œã¦ã„ã‚‹ Descriptor 型のリストを
    388   #RETURN:: Hash { Signature => ParamDecl }:  複数の ParamDecl から参ç
    389 §ã•ã‚Œã¦ã„る場合、最後のものしか返さない
     360  #== Signature# 引数で参照されている Descriptor 型のリストを
     361  #RETURN:: Hash { Signature => ParamDecl }:  複数の ParamDecl から参照されている場合、最後のものしか返さない
    390362  def get_descriptor_list
    391363    @descriptor_list
     
    402374  end
    403375
    404   #== Signature# 引数で参ç
    405 §ã•ã‚Œã¦ã„ã‚‹ Descriptor 型のリストを作成する
     376  #== Signature# 引数で参照されている Descriptor 型のリストを作成する
    406377  def set_descriptor_list
    407378    desc_list = { }
    408379    # p "has_desc #{@name}"
    409     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    410 åˆ—
    411     if fha == nil then                                  # nil の場合、自己参ç
    412 §ã«ã‚ˆã‚‹ã‚±ãƒ¼ã‚¹ã¨ä»®å®š
     380    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
     381    if fha == nil then                                  # nil の場合、自己参照によるケースと仮定
    413382      @descriptor_list = desc_list
    414383      return desc_list
    415384    end
    416385    fha.each{ |fh|
    417       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    418       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     386      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     387      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    419388        params = fd.get_type.get_paramlist.get_items
    420389        if params then
     
    443412  end
    444413
    445   #=== Signature# 引数に Descriptor があるか?
     414  #=== Signature# 引数に Descriptor があるか?
    446415  def has_descriptor?
    447416    if get_descriptor_list == nil then
    448       # end_of_parse が呼び出される前に has_descriptor? が呼び出された
    449       # 呼び出しå
    450 ƒã¯ DescriptorType#initialize
    451       # この場合、同じシグニチャå†
    452 ã®å¼•æ•°ãŒ Descriptor 型である
     417      # end_of_parse が呼び出される前に has_descriptor? が呼び出された
     418      # 呼び出し元は DescriptorType#initialize
     419      # この場合、同じシグニチャ内の引数が Descriptor 型である
    453420      return true
    454421    elsif get_descriptor_list.length > 0 then
     
    459426  end
    460427
    461   #=== Signature# コールバックか?
    462   # 指定子 callback が指定されていれば true
     428  #=== Signature# コールバックか?
     429  # 指定子 callback が指定されていれば true
    463430  def is_callback?
    464431    @b_callback
    465432  end
    466433
    467   #=== Signature# 逸脱か?
    468   # 指定子 deviate が指定されていれば true
     434  #=== Signature# 逸脱か?
     435  # 指定子 deviate が指定されていれば true
    469436  def is_deviate?
    470437    @b_deviate
    471438  end
    472439
    473   #=== Signature# 空か?
     440  #=== Signature# 空か?
    474441  def is_empty?
    475442    @b_empty
    476443  end
    477444
    478   #=== Signature# Push Pop Allocator がå¿
    479 è¦ã‹ï¼Ÿ
    480   # Transparent RPC の場合 oneway かつ in のé
    481 åˆ—(size_is, count_is, string のいずれかで修飾)がある
     445  #=== Signature# Push Pop Allocator が必要か?
     446  # Transparent RPC の場合 oneway かつ in の配列(size_is, count_is, string のいずれかで修飾)がある
    482447  def need_PPAllocator?( b_opaque = false )
    483     fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数é
    484 åˆ—
     448    fha = get_function_head_array                       # 呼び口または受け口のシグニチャの関数配列
    485449    fha.each{ |fh|
    486450      fd = fh.get_declarator
     
    508472
    509473module CelltypePluginModule
    510   #=== Celltype# セルタイププラグイン (generate 指定子)
     474  #=== Celltype# セルタイププラグイン (generate 指定子)
    511475  def celltype_plugin
    512476    plugin_name = @generate[0]
     
    515479  end
    516480
    517   #=== Celltype# セルタイププラグインをこのセルタイプに適用
     481  #=== Celltype# セルタイププラグインをこのセルタイプに適用
    518482  def apply_plugin( plugin_name, option )
    519483
     
    543507    end
    544508
    545     # 既に存在するセルに new_cell を適用
     509    # 既に存在するセルに new_cell を適用
    546510    @cell_list.each{ |cell|
    547511      apply_plugin_cell plugin_object, cell
     
    583547# @factory_list::   Factory[]
    584548# @ct_factory_list::    Factory[] :    celltype factory
    585 # @cell_list:: Cell[] : 定義のみ (V1.0.0.2 以降)
    586 # @ordered_cell_list:: Cell[] : ID 順に順序付けされたセルリスト、最適化以降有効 (リンク単位ごとに生成されなおす)
     549# @cell_list:: Cell[] : 定義のみ (V1.0.0.2 以降)
     550# @ordered_cell_list:: Cell[] : ID 順に順序付けされたセルリスト、最適化以降有効 (リンク単位ごとに生成されなおす)
    587551# @singleton:: bool
    588552# @idx_is_id:: bool
     
    590554# @b_need_ptab:: bool: true if having cells in multi-domain
    591555# @active:: bool
    592 # @b_reuse:: bool :  reuse 指定されて import された(template 不要)
    593 # @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
    594 # @generate_list:: [ [ Symbol, String, Plugin ], ... ]   generate 文で追加された generate
     556# @b_reuse:: bool :  reuse 指定されて import された(template 不要)
     557# @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
     558# @generate_list:: [ [ Symbol, String, Plugin ], ... ]   generate 文で追加された generate
    595559#
    596560# @n_attribute_ro:: int >= 0    none specified
     
    599563# @n_var:: int >= 0
    600564# @n_var_size_is:: int >= 0     # of [size_is] specified vars # mikan count_is
    601 # @n_var_omit:: int >= 0        # of [omit] specified vars # mikan var の omit は有?
     565# @n_var_omit:: int >= 0        # of [omit] specified vars # mikan var の omit は有?
    602566# @n_var_init:: int >= 0        # of vars with initializer
    603567# @n_call_port:: int >= 0       # dynamic ports are included
    604568# @n_call_port_array:: int >= 0  # dynamic ports are included
    605 # @n_call_port_omitted_in_CB:: int >= 0   æœ€é©åŒ–で省略される呼び口
     569# @n_call_port_omitted_in_CB:: int >= 0   最適化で省略される呼び口
    606570# @n_call_port_dynamic:: int >= 0  #
    607571# @n_call_port_array_dynamic:: int >= 0
     
    611575# @n_entry_port_array:: int >= 0
    612576# @n_entry_port_inline:: int >= 0
    613 # @n_cell_gen:: int >= 0  生成するセルの数.コード生成の頭で算出する.意味解析段階では参ç
    614 §ä¸å¯
    615 # @id_base:: Integer : cell の ID の最小値(最大値は @id_base + @n_cell)
     577# @n_cell_gen:: int >= 0  生成するセルの数.コード生成の頭で算出する.意味解析段階では参照不可
     578# @id_base:: Integer : cell の ID の最小値(最大値は @id_base + @n_cell)
    616579#
    617 # @b_cp_optimized:: bool : 呼び口最適化実施
    618 # @plugin:: PluginObject      このセルタイプがプラグインにより生成された CDL から生成された場合に有効。
    619 #                              generate の指定は @generate にプラグインが保持される
     580# @b_cp_optimized:: bool : 呼び口最適化実施
     581# @plugin:: PluginObject      このセルタイプがプラグインにより生成された CDL から生成された場合に有効。
     582#                              generate の指定は @generate にプラグインが保持される
    620583#
    621 # @included_header:: Hash :  include されたヘッダファイル
    622 # @domain_roots::Hash { DomainTypeName(Symbol) => [ Region ] }  ドメインタイプ名と Region のé
    623 åˆ— (optimize.rb で設定)
    624 #                                               ãƒ«ãƒ¼ãƒˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¯ãƒ‰ãƒ¡ã‚¤ãƒ³åãŒã€€nil
     584# @included_header:: Hash :  include されたヘッダファイル
     585# @domain_roots::Hash { DomainTypeName(Symbol) => [ Region ] }  ドメインタイプ名と Region の配列 (optimize.rb で設定)
     586#                                               ルートリージョンはドメイン名が nil
    625587
    626588  include PluginModule
     
    692654
    693655    @plugin = Generator.get_plugin
    694       # plugin の場合 PluginObject が返される
    695     # å
    696 ƒã® Generator から呼出された Generator の中でパースおよび意味チェックされている
     656      # plugin の場合 PluginObject が返される
     657    # 元の Generator から呼出された Generator の中でパースおよび意味チェックされている
    697658
    698659    # if @plugin then
    699     #  # plugin 生成されるセルタイプは再利用ではない   #833 不å
    700 ·åˆä¿®æ­£
     660    #  # plugin 生成されるセルタイプは再利用ではない   #833 不具合修正
    701661    #  @b_reuse = false
    702662    # else
     
    715675
    716676    Namespace.new_celltype( self )
    717     set_namespace_path # @NamespacePath の設定
     677    set_namespace_path # @NamespacePath の設定
    718678    set_specifier_list( Generator.get_statement_specifier )
    719679
     
    727687  end
    728688
    729   #== Celltype#ドメインルートを返す
    730   # @domain_roots の説明を参ç
    731 §
     689  #== Celltype#ドメインルートを返す
     690  # @domain_roots の説明を参照
    732691  def get_domain_roots
    733692    @domain_roots
     
    736695  # Celltype# end_of_parse
    737696  def end_of_parse
    738     # 属性・変数のチェック
     697    # 属性・変数のチェック
    739698    check_attribute
    740699
    741     # アロケータ呼び口をå†
    742 éƒ¨ç”Ÿæˆ
     700    # アロケータ呼び口を内部生成
    743701    generate_allocator_port
    744702
    745     # リレーアロケータ、å†
    746 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã®è¨­å®š
     703    # リレーアロケータ、内部アロケータの設定
    747704    @port.each { |p|
    748705      p.set_allocator_instance
     
    814771      end
    815772      if a.get_initializer then
    816         # 登録後にチェックしても問題ない(attr を参ç
    817 §ã§ããªã„ので、自己参ç
    818 §ã—ない)
     773        # 登録後にチェックしても問題ない(attr を参照できないので、自己参照しない)
    819774        a.get_type.check_init( @locale, a.get_identifier, a.get_initializer, :ATTRIBUTE )
    820775      end
     
    822777  end
    823778
    824   #=== Celltype# celltype の attribute/var のチェック
     779  #=== Celltype# celltype の attribute/var のチェック
    825780  # STAGE:  S
    826781  #
    827   # このメソッドは celltype のパースが完了した時点で呼出される.
     782  # このメソッドは celltype のパースが完了した時点で呼出される.
    828783  def check_attribute
    829     # attribute の size_is 指定が妥当かチェック
     784    # attribute の size_is 指定が妥当かチェック
    830785    (@attribute+@var).each{ |a|
    831786      if a.get_size_is then
    832787        if ! a.get_type.kind_of?( PtrType ) then
    833           # size_is がポインタ型以外に指定された
     788          # size_is がポインタ型以外に指定された
    834789          cdl_error( "S1011 $1: size_is specified for non-pointer type" , a.get_identifier )
    835790        else
    836791
    837           # 参ç
    838 §ã™ã‚‹å¤‰æ•°ãŒå­˜åœ¨ã—、計算可能な型かチェックする
    839           size = a.get_size_is.eval_const( @name_list )  # C_EXP の可能性あり
     792          # 参照する変数が存在し、計算可能な型かチェックする
     793          size = a.get_size_is.eval_const( @name_list )  # C_EXP の可能性あり
    840794          init = a.get_initializer
    841795          if init then
    842796            if ! init.instance_of?( Array ) then
    843               # 初期化子がé
    844 åˆ—ではない
     797              # 初期化子が配列ではない
    845798              cdl_error( "S1012 $1: unsuitable initializer, need array initializer" , a.get_identifier )
    846799            elsif size.kind_of?( Integer ) && size < init.length then
    847               # size_is 指定された個数よりも初期化子のé
    848 åˆ—要素が多い
     800              # size_is 指定された個数よりも初期化子の配列要素が多い
    849801              cdl_error( "S1013 $1: too many initializer, $2 for $3" , a.get_identifier, init.length, size )
    850             # elsif a.get_size_is.eval_const( nil ) == nil  # C_EXP の可能性あり
     802            # elsif a.get_size_is.eval_const( nil ) == nil  # C_EXP の可能性あり
    851803            end
    852804
     
    858810              ( a.get_initializer.instance_of?( Expression ) &&
    859811                a.get_initializer.eval_const2(@name_list).instance_of?( Array ) ) then
    860             # size_is 指定されていないポインタが Array で初期化されていたら、エラー
     812            # size_is 指定されていないポインタが Array で初期化されていたら、エラー
    861813            cdl_error( "S1159 $1: non-size_is pointer cannot be initialized with array initializer" , a.get_identifier )
    862814          end
     
    870822  end
    871823
    872   #=== Celltype# アロケータ呼び口を生成
    873   #    send, receive 引数のアロケータを呼出すための呼び口を生成
     824  #=== Celltype# アロケータ呼び口を生成
     825  #    send, receive 引数のアロケータを呼出すための呼び口を生成
    874826  def generate_allocator_port
    875827    @port.each { |port|
    876       # ポートのすべてのパラメータを辿る
     828      # ポートのすべてのパラメータを辿る
    877829      port.each_param { |port, fd, par|
    878         case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
     830        case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
    879831        when :SEND, :RECEIVE
    880832          if par.get_allocator then
    881             cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
    882             #           ãƒãƒ¼ãƒˆå          関数名         ãƒ‘ラメータ名
    883             # alloc_sig_path = [ par.get_allocator.get_name ]  # mikan Namespace アロケータ呼び口のシグニチャ #1
     833            cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
     834            #           ポート名          関数名         パラメータ名
     835            # alloc_sig_path = [ par.get_allocator.get_name ]  # mikan Namespace アロケータ呼び口のシグニチャ #1
    884836            alloc_sig_path = par.get_allocator.get_namespace_path
    885             array_size = port.get_array_size            # 呼び口または受け口é
    886 åˆ—のサイズ
    887             created_port = Port.new( cp_name, alloc_sig_path, :CALL, array_size ) # 呼び口を生成
     837            array_size = port.get_array_size            # 呼び口または受け口配列のサイズ
     838            created_port = Port.new( cp_name, alloc_sig_path, :CALL, array_size ) # 呼び口を生成
    888839            created_port.set_allocator_port( port, fd, par )
    889840            if port.is_optional? then
     
    893844              created_port.set_omit
    894845            end
    895             new_port( created_port )                    # セルタイプに新しい呼び口を追加
     846            new_port( created_port )                    # セルタイプに新しい呼び口を追加
    896847          # else
    897848          #  already error "not found or not signature" in class ParamDecl
     
    910861  end
    911862
    912   #=== Celltype# 新しいå†
    913 éƒ¨å¤‰æ•°
     863  #=== Celltype# 新しい内部変数
    914864  #var:: [Decl]
    915865  def new_var( var )
     
    924874      @name_list.add_item( i )
    925875
    926       # size_is 指定されたé
    927 åˆ—? mikan  count_is
     876      # size_is 指定された配列? mikan  count_is
    928877      if i.get_size_is then
    929878        @n_var_size_is += 1
     
    941890  end
    942891
    943   #=== Celltype# celltype の指定子を設定
     892  #=== Celltype# celltype の指定子を設定
    944893  def set_specifier_list( spec_list )
    945894    return if spec_list == nil
     
    976925
    977926  def new_require( ct_or_cell_nsp, ep_name, cp_name )
    978     # Require: set_owner するものがない
     927    # Require: set_owner するものがない
    979928    obj = Namespace.find( ct_or_cell_nsp )    #1
    980929    if obj.instance_of? Celltype then
    981       # Celltype 名で指定
     930      # Celltype 名で指定
    982931      ct = obj
    983932    elsif obj.instance_of? Cell then
    984       # Cell 名で指定
     933      # Cell 名で指定
    985934      ct = obj.get_celltype
    986935    elsif obj == nil then
     
    993942
    994943    if( ! ct.is_singleton? ) then
    995       # シングルトンではない
     944      # シングルトンではない
    996945      cdl_error( "S1018 $1 : not singleton cell" , obj.get_name )
    997946    end
    998947
    999     # 受け口を探す
     948    # 受け口を探す
    1000949    obj2 = ct.find( ep_name )
    1001950    if( ( ! obj2.instance_of? Port ) || obj2.get_port_type != :ENTRY ) then
     
    1008957
    1009958    if obj2.get_signature == nil then
    1010       # signature が未定義:既にエラー
     959      # signature が未定義:既にエラー
    1011960      return
    1012961    end
     
    1014963    require_call_port_prefix = :_require_call_port
    1015964    if cp_name == nil then
    1016       # 関数名重複チェック
     965      # 関数名重複チェック
    1017966      @require.each{ |req|
    1018967        unless req[0].to_s =~ /^#{require_call_port_prefix}/ then
    1019           next     # 名前ありの require は関数名重複チェックしない
     968          next     # 名前ありの require は関数名重複チェックしない
    1020969        end
    1021970        port = req[2]
    1022971        if port.get_signature == obj2.get_signature then
    1023           # 同じ signature (すべて同じ関数名を持つ)個別に出すのではなく、まとめてエラーとする
     972          # 同じ signature (すべて同じ関数名を持つ)個別に出すのではなく、まとめてエラーとする
    1024973          cdl_error( "S1021 $1 : require cannot have same signature with \'$2\'" , obj2.get_name, port.get_name )
    1025974          next
    1026975        end
    1027976        port.get_signature.get_function_head_array.each{ |f|
    1028           # mikan ここは、namedList からの検索にならないの?(効率が悪い)
     977          # mikan ここは、namedList からの検索にならないの?(効率が悪い)
    1029978          obj2.get_signature.get_function_head_array.each{ |f2|
    1030979            if( f.get_name == f2.get_name ) then
     
    1042991      b_has_name = true
    1043992    end
    1044     # require を追加
     993    # require を追加
    1045994    @require << [ cp_name, obj, obj2 ]  # [ lhs:cp_name, rhs:Celltype, rhs:Port ]
    1046995
    1047     # require port を追加 (呼び口として追加する。ただし require をセットしておく)
     996    # require port を追加 (呼び口として追加する。ただし require をセットしておく)
    1048997    port = Port.new( cp_name, obj2.get_signature.get_namespace_path, :CALL )
    1049998    port.set_require( b_has_name )
     
    10771026  end
    10781027
    1079   #=== Celltype#dynamic の適合性チェック
     1028  #=== Celltype#dynamic の適合性チェック
    10801029  def check_dynamic_join
    10811030    return if ! $verbose
    10821031    @port.each{ |port|
    10831032      signature = port.get_signature
    1084       next if signature == nil   # すでにエラー
     1033      next if signature == nil   # すでにエラー
    10851034      if port.is_dynamic? then
    10861035        dbgPrint( "[DYNAMIC] checking dynamic port: #{@global_name}.#{port.get_name}\n" )
     
    11331082  end
    11341083  def find_ref_desc_port signature
    1135     if signature == nil then  # すでにエラー
     1084    if signature == nil then  # すでにエラー
    11361085      return nil
    11371086    end
     
    11431092    return nil
    11441093  end
    1145   #=== Celltype#ディスクリプタ型でシグニチャが一致し dyn_ref に対応づく引数を探す
    1146   #dyn_ref::Symbol: :DYNAMIC=ディスクリプタを得る手段となる引数を探す.:REF_DESC=渡す手段となる引数を探す
     1094  #=== Celltype#ディスクリプタ型でシグニチャが一致し dyn_ref に対応づく引数を探す
     1095  #dyn_ref::Symbol: :DYNAMIC=ディスクリプタを得る手段となる引数を探す.:REF_DESC=渡す手段となる引数を探す
    11471096  def find_descriptor_param signature, dyn_ref
    11481097    param_list = []
     
    11861135  end
    11871136
    1188   #=== Celltype# celltype に新しい cell を追加
     1137  #=== Celltype# celltype に新しい cell を追加
    11891138  #cell:: Cell
    1190   # 新しいセルをセルタイプに追加.
    1191   # セルの構文解釈の最後でこのメソドを呼出される.
    1192   # シングルトンセルが同じ linkunit に複数ないかチェック
     1139  # 新しいセルをセルタイプに追加.
     1140  # セルの構文解釈の最後でこのメソドを呼出される.
     1141  # シングルトンセルが同じ linkunit に複数ないかチェック
    11931142  def new_cell( cell )
    11941143    dbgPrint "Celltype#new_cell( #{cell.get_name} )\n"
    1195     # Celltype では Cell の set_owner しない
    1196     # シングルトンで、プロトタイプ宣言でない場合、コード生成対象リージョンの場合
     1144    # Celltype では Cell の set_owner しない
     1145    # シングルトンで、プロトタイプ宣言でない場合、コード生成対象リージョンの場合
    11971146    if @singleton  then
    11981147      @cell_list.each{ |c|
     
    12041153    @cell_list << cell
    12051154
    1206     # プラグインにより生成されたセルタイプか ?
     1155    # プラグインにより生成されたセルタイプか ?
    12071156    if @plugin then
    12081157      @plugin.new_cell cell
    12091158    end
    12101159
    1211     # セルタイププラグインの適用
     1160    # セルタイププラグインの適用
    12121161    celltype_plugin_new_cell cell
    12131162  end
    12141163
    1215   #=== Celltype# セルタイプは INIB を持つか?
    1216   # セルタイプが INIB を持つかどうかを判定する
    1217   # $rom == false のとき:  INIB を持たない. (すべては CB に置かれる)
    1218   # $rom == true のとき、INIB に置かれるものが一つでも存在すれば INIB を持つ
    1219   #   INIB に置かれるものは
    1220   #     attribute (omit のものは除く.現仕様では rw のものはない)
    1221   #     size_is を伴う var
    1222   #     å‘¼ã³å£ï¼ˆãŸã ã—、最適化で不要となるものは除く)
     1164  #=== Celltype# セルタイプは INIB を持つか?
     1165  # セルタイプが INIB を持つかどうかを判定する
     1166  # $rom == false のとき:  INIB を持たない. (すべては CB に置かれる)
     1167  # $rom == true のとき、INIB に置かれるものが一つでも存在すれば INIB を持つ
     1168  #   INIB に置かれるものは
     1169  #     attribute (omit のものは除く.現仕様では rw のものはない)
     1170  #     size_is を伴う var
     1171  #     呼び口(ただし、最適化で不要となるものは除く)
    12231172  def has_INIB?
    12241173
     
    12341183  end
    12351184
    1236   #=== Celltype# セルタイプは CB を持つか?
    1237   # $rom == true のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ
    1238   #   size_is が指定されていない var
    1239   #   rw 指定された attribute (現仕様では存在しない)
    1240   # $rom == false のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ
     1185  #=== Celltype# セルタイプは CB を持つか?
     1186  # $rom == true のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ
     1187  #   size_is が指定されていない var
     1188  #   rw 指定された attribute (現仕様では存在しない)
     1189  # $rom == false のとき、いかのものが置かれる.それらの一つでも存在すれば CB を持つ
    12411190  #   attribute
    12421191  #   var
    1243   #   å‘¼ã³å£ï¼ˆãŸã ã—、最適化で不要となるものは除く)
     1192  #   呼び口(ただし、最適化で不要となるものは除く)
    12441193  def has_CB?
    12451194    if $rom then
     
    12511200  end
    12521201
    1253   #=== Celltype# SET_CB_INIB_POINTER, INITIALIZE_CB がå¿
    1254 è¦ã‹
     1202  #=== Celltype# SET_CB_INIB_POINTER, INITIALIZE_CB が必要か
    12551203  def need_CB_initializer?
    12561204    @n_var_init > 0 || has_CB? || ( @n_call_port_dynamic && $ram_initializer )
    12571205  end
    12581206
    1259   #=== Celltype# 逆require の結合を生成する
     1207  #=== Celltype# 逆require の結合を生成する
    12601208  def create_reverse_require_join cell
    12611209    @port.each{ |p|
     
    12641212  end
    12651213
    1266   #=== Celltype# singleton セルを得る
    1267   #region:: Region   : singleton を探す Region
    1268   # 距離が最も近いものを返す
    1269   # mikan 本当は region の範囲の singleton を探すå¿
    1270 è¦ãŒã‚ã‚‹
     1214  #=== Celltype# singleton セルを得る
     1215  #region:: Region   : singleton を探す Region
     1216  # 距離が最も近いものを返す
     1217  # mikan 本当は region の範囲の singleton を探す必要がある
    12711218  def get_singleton_cell region
    12721219    cell = nil
    1273     dist = 999999999 # mikan 制限値(これは十分すぎるほどデカイが)
    1274     # require: celltype で指定
     1220    dist = 999999999 # mikan 制限値(これは十分すぎるほどデカイが)
     1221    # require: celltype で指定
    12751222    @cell_list.each{ |c|
    1276       # 到達可能で最も近いセルを探す(複数の singleton があるかもしれない)
     1223      # 到達可能で最も近いセルを探す(複数の singleton があるかもしれない)
    12771224      d = region.distance( c.get_region )
    12781225      #debug
     
    12931240  end
    12941241
    1295   #=== Celltype# セルタイププラグインを得る
     1242  #=== Celltype# セルタイププラグインを得る
    12961243  def get_celltype_plugin
    12971244    if @generate then
     
    13201267  end
    13211268
    1322   #=== Celltype# アクティブではないか
    1323   # このメソッドでは active の他に factory (singleton においては FACTORYを含む)がなければ inactive とする
     1269  #=== Celltype# アクティブではないか
     1270  # このメソッドでは active の他に factory (singleton においては FACTORYを含む)がなければ inactive とする
    13241271  def is_inactive?
    13251272    if @active == false && @factory_list.length == 0 &&
     
    13421289  end
    13431290
    1344   #=== Celltype# コード生成するå¿
    1345 è¦ãŒã‚るか判定
    1346   # セルの個数が 0 ならセルタイプコードは生成不要
     1291  #=== Celltype# コード生成する必要があるか判定
     1292  # セルの個数が 0 ならセルタイプコードは生成不要
    13471293  def need_generate?
    13481294    @n_cell_gen > 0
    13491295  end
    13501296
    1351   #=== Celltype# require 呼び口の結合を行う
     1297  #=== Celltype# require 呼び口の結合を行う
    13521298  # STAGE: S
    1353   # セルタイプの require 呼び口について、結合を行う
    1354   # セルが生成されないかチェックを行う
     1299  # セルタイプの require 呼び口について、結合を行う
     1300  # セルが生成されないかチェックを行う
    13551301  def set_require_join
    13561302    @require.each{ |req|
     
    13681314  end
    13691315
    1370   #=== Celltype# inline 受け口しかないか?
    1371   # 受け口が無い場合、すべての受け口が inline とはしない
     1316  #=== Celltype# inline 受け口しかないか?
     1317  # 受け口が無い場合、すべての受け口が inline とはしない
    13721318  def is_all_entry_inline?
    13731319    @n_entry_port == @n_entry_port_inline && @n_entry_port > 0
     
    14081354# @n_var:: int >= 0
    14091355# @n_var_size_is:: int >= 0     # of [size_is] specified cells # mikan count_is
    1410 # @n_var_omit:: int >= 0        # of [omit] specified  cells # mikan var の omit は有?
     1356# @n_var_omit:: int >= 0        # of [omit] specified  cells # mikan var の omit は有?
    14111357# @n_call_port:: int >= 0
    14121358# @n_call_port_array:: int >= 0
    1413 # @n_call_port_omitted_in_CB:: int >= 0   æœ€é©åŒ–で省略される呼び口
     1359# @n_call_port_omitted_in_CB:: int >= 0   最適化で省略される呼び口
    14141360# @n_entry_port:: int >= 0
    14151361# @n_entry_port_array:: int >= 0
    14161362    (indent+1).times { print "  " }
    14171363    puts "@n_entry_port_inline #{@n_entry_port_inline}"
    1418 # @n_cell:: int >= 0  コード生成の頭で算出する.意味解析段階では参ç
    1419 §ä¸å¯
    1420 # @id_base:: Integer : cell の ID の最小値(最大値は @id_base + @n_cell)
     1364# @n_cell:: int >= 0  コード生成の頭で算出する.意味解析段階では参照不可
     1365# @id_base:: Integer : cell の ID の最小値(最大値は @id_base + @n_cell)
    14211366
    14221367  end
     
    14241369
    14251370class Cell < NSBDNode # < Nestable
    1426 # @name:: Symbol : composite celltype のå†
    1427 å´ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã§ã¯å¤–のセル
    1428 # @global_name:: Symbol : C で使える名前(namespace を含む)
    1429 # @local_name:: str : cell celltype name { ... } の name
     1371# @name:: Symbol : composite celltype の内側のインスタンスでは外のセル
     1372# @global_name:: Symbol : C で使える名前(namespace を含む)
     1373# @local_name:: str : cell celltype name { ... } の name
    14301374# @celltype:: Celltype | CompositeCelltype
    14311375# @join_list:: NamedList
     
    14341378# @b_prototype:: bool:  prototype specified in current parsing cell. (@b_defined is used to determine whether definition done)
    14351379# @b_duplicate:: bool:  definition duplicate
    1436 # @b_checked::   bool:  set_definition_join が済んでいる場合 true
    1437 # @require_joined_list:: {cp_name=>true}:  set_require_join が済んでいる呼び口は true
     1380# @b_checked::   bool:  set_definition_join が済んでいる場合 true
     1381# @require_joined_list:: {cp_name=>true}:  set_require_join が済んでいる呼び口は true
    14381382# @f_ref:: refercenced from others
    1439 # @entry_array_max_subscript:: { @port=>Integer } : 受け口é
    1440 åˆ—のé
    1441 åˆ—添数の最大値(添数無し受け口é
    1442 åˆ—対応)
     1383# @entry_array_max_subscript:: { @port=>Integer } : 受け口配列の配列添数の最大値(添数無し受け口配列対応)
    14431384# @plugin::     Plugin: avialble if cell is generated by plugin generated cdl code.
    1444 # @referenced_port_list:: { Port => Integer } : 受け口の参ç
    1445 §æ•°
    1446 #                                               ã™ã¹ã¦ã®æ„å‘³è§£æž(through, composite展開)が終わった後に設定する
    1447 #                                               é€†require ポートに対して複数の結合がないかチェックする
    1448 # @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
     1385# @referenced_port_list:: { Port => Integer } : 受け口の参照数
     1386#                                               すべての意味解析(through, composite展開)が終わった後に設定する
     1387#                                               逆require ポートに対して複数の結合がないかチェックする
     1388# @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
    14491389# @b_post_code_generated:: Bool: true if generated in tmp_plugin_post_code.cdl
    14501390#
    1451 # composite のためインスタンス変数
     1391# composite のためインスタンス変数
    14521392# @in_composite:: bool : true if in composite celltype
    14531393# @compositecelltypejoin_list:: NamedList : item= CompositeCelltypeJoin ( if @in_composite )
    14541394# @f_cloned:: bool : true if cloned (instantiate of composite consist cell)
    1455 # @my_clone:: Cell : Composite cell で in_composite = true の場合のみ有効(直前の clone を一時記憶)
    1456 # @cell_list:: Cell[local_name] : Composite cell で clone した後のリスト cell_list
    1457 # @cell_list2:: [ Cell ] : Composite cell で clone した後のリスト cell_list
    1458 #                          @cell_list2 は composite å†
    1459 ã§ã®å‡ºç¾é † 
     1395# @my_clone:: Cell : Composite cell で in_composite = true の場合のみ有効(直前の clone を一時記憶)
     1396# @cell_list:: Cell[local_name] : Composite cell で clone した後のリスト cell_list
     1397# @cell_list2:: [ Cell ] : Composite cell で clone した後のリスト cell_list
     1398#                          @cell_list2 は composite 内での出現順 
    14601399#
    1461 # region のためのインスタンス変数
    1462 # @region:: Region (属するregion)
     1400# region のためのインスタンス変数
     1401# @region:: Region (属するregion)
    14631402#
    1464 # allocator のためのインスタンス変数
     1403# allocator のためのインスタンス変数
    14651404# @alloc_list::  [ [ NORMAL_ALLOC, ep_name, func_name, param_name, expr ], ... ]
    1466 #   å—け口側のアロケータへの結合を記憶。以下のメソッドで追加される
    1467 #      set_specifier … cell 定義時にアロケータ指定されている場合
    1468 #      create_relay_allocator_join … リレーアロケータの場合
     1405#   受け口側のアロケータへの結合を記憶。以下のメソッドで追加される
     1406#      set_specifier … cell 定義時にアロケータ指定されている場合
     1407#      create_relay_allocator_join … リレーアロケータの場合
    14691408#
    1470 # ID のためのインスタンス変数(optimize.rb にて設定)
    1471 # @id:: Integer : コード生成直前に設定  (プロトタイプ宣言の場合は -1 のまま放置)
    1472 # @id_specified::Integer : 指定された id
     1409# ID のためのインスタンス変数(optimize.rb にて設定)
     1410# @id:: Integer : コード生成直前に設定  (プロトタイプ宣言の場合は -1 のまま放置)
     1411# @id_specified::Integer : 指定された id
    14731412# @restrict_list::{ entry_name => { func_name, [ region_path_str, ... ] } }
    14741413# @restrict_list2::{ entry_name => { func_name, [ domain_root_region, ... ] } }
    1475 # @b_restrict_referenced::Bool: restrict_list が参ç
    1476 §ã‚ŒãŸ
     1414# @b_restrict_referenced::Bool: restrict_list が参照れた
    14771415
    14781416=begin
    1479 # Cell クラスは、以下のものを扱う
    1480 # 1)普通のセル
    1481 # 2)composite セルタイプのセル
    1482 # 3)composite セルタイプのå†
    1483 å´ã®ã‚»ãƒ« (@in_composite)   # composite のå†
    1484 å´ã® composite セルタイプのセルもある
     1417# Cell クラスは、以下のものを扱う
     1418# 1)普通のセル
     1419# 2)composite セルタイプのセル
     1420# 3)composite セルタイプの内側のセル (@in_composite)   # composite の内側の composite セルタイプのセルもある
    14851421#
    1486 # 2) は CellOfComposite クラスとして分けたほうがよいかもしれない
    1487 #    expand (composite セルの展開) は CellOfComposite にのみå¿
    1488 è¦ãªãƒ¡ã‚½ãƒƒãƒ‰ã§ã‚ã‚‹
    1489 #    get_real_cell, get_real_port など @celltype.instance_of?( CompositeCelltype ) の判定がなくすっきりする
    1490 #    ただ、分離しても、メンテナンスすべき範囲が切り離されてしまい、忘れやすくなる問題とのトレードオフかも
     1422# 2) は CellOfComposite クラスとして分けたほうがよいかもしれない
     1423#    expand (composite セルの展開) は CellOfComposite にのみ必要なメソッドである
     1424#    get_real_cell, get_real_port など @celltype.instance_of?( CompositeCelltype ) の判定がなくすっきりする
     1425#    ただ、分離しても、メンテナンスすべき範囲が切り離されてしまい、忘れやすくなる問題とのトレードオフかも
    14911426#
    1492 # 3) は CellInCompoiste クラスとして分けたほうがよいかもしれない
    1493 #    @in_composite で判定している処理を切り離せる (上記 2) よりも分離は容易ではない)
    1494 #    clone_for_composite は CellInCompoiste にのみå¿
    1495 è¦ãªãƒ¡ã‚½ãƒƒãƒ‰ã§ã‚ã‚‹
    1496 #    ただし、clone 後に Cell, CellOfComposite に変化するå¿
    1497 è¦ãŒã‚るので、clone ではなく new する実è£
    1498 ã«å¤‰æ›´ã™ã‚‹å¿
    1499 è¦ãŒã‚ã‚‹
     1427# 3) は CellInCompoiste クラスとして分けたほうがよいかもしれない
     1428#    @in_composite で判定している処理を切り離せる (上記 2) よりも分離は容易ではない)
     1429#    clone_for_composite は CellInCompoiste にのみ必要なメソッドである
     1430#    ただし、clone 後に Cell, CellOfComposite に変化する必要があるので、clone ではなく new する実装に変更する必要がある
    15001431#
    15011432=end
     
    15071438  @@current_object = nil
    15081439
    1509   # 定義されたすべてのセル(出現順. namespace に影響されない)
    1510   @@cell_list = []     # composite のå†
    1511 éƒ¨ã®ã‚»ãƒ«ã‚’含まない
    1512   @@cell_list2 = []    # composite のå†
    1513 éƒ¨ã®ã‚»ãƒ«ã‚’含む (å
    1514 ƒã®ã‚»ãƒ«ã‚’含む)
    1515                        # 意味解析後 make_cell_list2 にて設定される
     1440  # 定義されたすべてのセル(出現順. namespace に影響されない)
     1441  @@cell_list = []     # composite の内部のセルを含まない
     1442  @@cell_list2 = []    # composite の内部のセルを含む (元のセルを含む)
     1443                       # 意味解析後 make_cell_list2 にて設定される
    15161444
    15171445  def self.push
     
    15331461    @region = Region.get_current
    15341462
    1535     # celltype のplugin/存在をチェック
     1463    # celltype のplugin/存在をチェック
    15361464    object = Namespace.find( ct_path )    #1
    15371465    if object == nil then
    1538       # mikan celltype の名前が不完å
    1539 ¨ "::ct1ct2" になる
     1466      # mikan celltype の名前が不完全 "::ct1ct2" になる
    15401467      cdl_error( "S1027 \'$1\' celltype not found" , ct_path.get_path_str )
    15411468    elsif ! object.instance_of?( Celltype ) && ! object.instance_of?( CompositeCelltype ) then
    1542       # mikan celltype の名前が不完å
    1543 ¨
     1469      # mikan celltype の名前が不完全
    15441470      cdl_error( "S1028 \'$1\' not celltype" , ct_path.get_path_str )
    15451471    else
     
    15921518    end
    15931519
    1594     # この時点ではプロトタイプか、定義か分らないが、自己参ç
    1595 §ã®ãŸã‚ã«ç™»éŒ²
    1596     # set_f_def で再度登録しなおす
    1597     # Celltype への登録は、end_of_parse で行う
     1520    # この時点ではプロトタイプか、定義か分らないが、自己参照のために登録
     1521    # set_f_def で再度登録しなおす
     1522    # Celltype への登録は、end_of_parse で行う
    15981523    if @in_composite then
    15991524      cell_prev = CompositeCelltype.find( name )
     
    16021527      end
    16031528    else
    1604       # cell_prev = Namespace.find( [ name ] )   # 親まで捜しにいく
     1529      # cell_prev = Namespace.find( [ name ] )   # 親まで捜しにいく
    16051530      cell_prev = Namespace.get_current.find( name )
    16061531      if cell_prev == nil then
    16071532        Namespace.new_cell( self )
    1608         set_namespace_path # @NamespacePath の設定
     1533        set_namespace_path # @NamespacePath の設定
    16091534      end
    16101535    end
     
    16131538      if ! cell_prev.instance_of?( Cell ) then
    16141539        cdl_error( "S1029 $1 mismatch with previous one" , name )
    1615         # celltype が一致しているか ?
     1540        # celltype が一致しているか ?
    16161541      elsif get_celltype != cell_prev.get_celltype then
    16171542        cdl_error( "S1030 $1: celltype mismatch with previous one" , name )
    16181543      else
    1619         # region が一致しているか?
     1544        # region が一致しているか?
    16201545        if ! cell_prev.get_region.equal? get_region then
    16211546          cdl_error( "S1031 $1 region \'$2\' mismatch  with previous one \'$3\'" , name, @region.get_name, cell_prev.get_region.get_name )
     
    16231548
    16241549        @@current_object = cell_prev
    1625         # この時点では、まだプロトタイプ宣言か定義か分らない
    1626         # 以前が定義であって、今回も定義の場合、重複エラーである
     1550        # この時点では、まだプロトタイプ宣言か定義か分らない
     1551        # 以前が定義であって、今回も定義の場合、重複エラーである
    16271552      end
    16281553    end
     
    16341559    dbgPrint "Cell new_cell: #{@global_name} #{@in_composite} #{self}\n"
    16351560
    1636     # å†
    1637 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã‚’ @alloc_list に追加
     1561    # 内部アロケータを @alloc_list に追加
    16381562    if @celltype.instance_of? CompositeCelltype then
    16391563      @celltype.get_internal_allocator_list.each{ |cell, cp_internal_name, port_name, fd_name, par_name, ext_alloc_ent|
    16401564        nsp = NamespacePath.new( @name, false )
    1641         rhs = Expression.new( [:OP_DOT, [:IDENTIFIER, nsp], Token.new( ext_alloc_ent.to_s.to_sym, nil, nil, nil ) ] )  #1 構文解析段階なので locale 不要
     1565        rhs = Expression.new( [:OP_DOT, [:IDENTIFIER, nsp], Token.new( ext_alloc_ent.to_s.to_sym, nil, nil, nil ) ] )  #1 構文解析段階なので locale 不要
    16421566
    16431567        @alloc_list << [:NORMAL_ALLOC,port_name,nil,fd_name,par_name,rhs]
     
    16471571  end
    16481572
    1649   #=== Cell# cell の定義
    1650   # 本体(join)の定義の直前に呼び出される
     1573  #=== Cell# cell の定義
     1574  # 本体(join)の定義の直前に呼び出される
    16511575  def self.new_def
    16521576    @@current_object.new_def
    16531577  end
    16541578
    1655   #=== Cell# cell の定義
    1656   # 本体(join)の定義の直前に呼び出される
    1657   # このメソッドは cell tCelltype Cell { };  '{', '}' の部分がある場合に呼出される
     1579  #=== Cell# cell の定義
     1580  # 本体(join)の定義の直前に呼び出される
     1581  # このメソッドは cell tCelltype Cell { };  '{', '}' の部分がある場合に呼出される
    16581582  def new_def
    16591583    set_specifier_list( Generator.get_statement_specifier )
    16601584
    1661     # prototype 指定子ないか
     1585    # prototype 指定子ないか
    16621586    if ! @b_prototype then
    1663       # 二重定義のチェック
     1587      # 二重定義のチェック
    16641588      if @b_defined == true then
    16651589        cdl_error( "S1032 $1: duplicate cell" , @name )
    16661590        dbgPrint "previous: #{@prev_locale[0]}: line #{@prev_locale[1]} '#{@name}' defined here\n"
    16671591
    1668         # セルの重複定義エラーの処置
    1669         # 前の定義は捨てる
     1592        # セルの重複定義エラーの処置
     1593        # 前の定義は捨てる
    16701594        @join_list = NamedList.new( nil, "in cell '#{@name}'" )
    16711595      end
     
    16801604  end
    16811605
    1682   #===  Cell# 新しい結合をチェック
     1606  #===  Cell# 新しい結合をチェック
    16831607  # STAGE:   P
    16841608  #
    1685   #join::  Join : 新しい結合
    1686   #b_regular:: bool : 通常の場所 (bnf.y.rb)からならば true, それ以外(allocator, require) では false
     1609  #join::  Join : 新しい結合
     1610  #b_regular:: bool : 通常の場所 (bnf.y.rb)からならば true, それ以外(allocator, require) では false
    16871611  def new_join( join, b_regular = false )
    16881612    join.set_owner self
    16891613
    1690     # composite の新文法対応.
    1691     # composite の中のセルで、attribute の定義である場合
    1692     # cell å†
    1693 ã® attr_ext = composite.attr; 構文を処理
     1614    # composite の新文法対応.
     1615    # composite の中のセルで、attribute の定義である場合
     1616    # cell 内の attr_ext = composite.attr; 構文を処理
    16941617    if @in_composite then
    16951618      if @celltype then
    1696         if @celltype.find(join.get_name).instance_of?( Decl ) then # mikan a::b で指定されていたものがエラーにならないかも
     1619        if @celltype.find(join.get_name).instance_of?( Decl ) then # mikan a::b で指定されていたものがエラーにならないかも
    16971620          rhs = join.get_rhs
    16981621          if rhs.instance_of? Expression then
    16991622            ele = rhs.get_elements
    1700             if( ele[0]==:IDENTIFIER )then    #  attr = attr_ext (右辺単é 
    1701 ï¼‰ã‹ï¼Ÿ #1
    1702               if( CompositeCelltype.has_attribute?(ele[1].get_name ) )then    # mikan a::b.ePort がエラーにならないかも
    1703                 ident = ele[1].get_name   # 右辺は attribute.
     1623            if( ele[0]==:IDENTIFIER )then    #  attr = attr_ext (右辺単項)か? #1
     1624              if( CompositeCelltype.has_attribute?(ele[1].get_name ) )then    # mikan a::b.ePort がエラーにならないかも
     1625                ident = ele[1].get_name   # 右辺は attribute.
    17041626              else
    1705                 # 右辺は attribute にないのであれば、定数のはず
    1706                 # 定数は下へ渡す (cell の join にする)
     1627                # 右辺は attribute にないのであれば、定数のはず
     1628                # 定数は下へ渡す (cell の join にする)
    17071629                ident = nil
    17081630              end
    17091631            else
    1710               if join.get_rhs.eval_const2(nil) == nil then   # 定数式ではないか?
    1711                 # 右辺が、単一のシンボルでない場合、現状は扱えない
     1632              if join.get_rhs.eval_const2(nil) == nil then   # 定数式ではないか?
     1633                # 右辺が、単一のシンボルでない場合、現状は扱えない
    17121634                cdl_error( "S1033 rhs expression is not supported. Only attribute is permitted on current version."  )
    17131635                return
    17141636              else
    1715                 # 定数は下へ渡す (cell の join にする)
     1637                # 定数は下へ渡す (cell の join にする)
    17161638                ident = nil
    17171639              end
     
    17191641
    17201642            if ident then
    1721               # attr = attr; のような参ç
    1722 §ã¯ã‚¨ãƒ©ãƒ¼ (a = composite.a とするå¿
    1723 è¦ãŒã‚ã‚‹)
     1643              # attr = attr; のような参照はエラー (a = composite.a とする必要がある)
    17241644              if @celltype.find( ident ) then
    17251645                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 )
     
    17271647            end
    17281648          elsif rhs.instance_of? Array then
    1729             if rhs[0] == :COMPOSITE then   # 右辺は composite.attr の形式
     1649            if rhs[0] == :COMPOSITE then   # 右辺は composite.attr の形式
    17301650              ident = rhs[1].to_sym
    17311651            else
    1732               ident = nil    # 右辺は { 10, -10 } の形式
     1652              ident = nil    # 右辺は { 10, -10 } の形式
    17331653            end
    17341654          else
    1735             ident = nil      # 右辺は C_EXP の形式
     1655            ident = nil      # 右辺は C_EXP の形式
    17361656          end
    17371657
    1738           # ident が見つかった(右辺は単一の ident)
     1658          # ident が見つかった(右辺は単一の ident)
    17391659          if ident then
    1740             # composite の旧文法の構文処理へ渡す.セル外の attr_ext = Cell.attr; 構文の処理に渡す
     1660            # composite の旧文法の構文処理へ渡す.セル外の attr_ext = Cell.attr; 構文の処理に渡す
    17411661            #                        export_name, internal_cell_name, internal_cell_elem_name
    1742             decl = CompositeCelltype.new_join( ident, @name, join.get_name, :ATTRIBUTE )  # mikan a::b.ePort がエラーにならないかも
     1662            decl = CompositeCelltype.new_join( ident, @name, join.get_name, :ATTRIBUTE )  # mikan a::b.ePort がエラーにならないかも
    17431663            if ! decl.instance_of? Decl then
    17441664              return
     
    17481668              return
    17491669            end
    1750             # 以下の旧文法実è£
    1751 ã«æ¸¡ã™ï¼Ž
    1752             # 旧文法では cell に初期値を与えることで、composite で属性の初期値を指定することができた
    1753             # attribute で指定された初期値を cell の属性として処理させる
     1670            # 以下の旧文法実装に渡す.
     1671            # 旧文法では cell に初期値を与えることで、composite で属性の初期値を指定することができた
     1672            # attribute で指定された初期値を cell の属性として処理させる
    17541673            join.change_rhs( ini )
    17551674          else
    1756             # ident がない.定数式
     1675            # ident がない.定数式
    17571676          end
    17581677        else
    1759           # celltype の属性として、この join の名前がない
    1760           # 以下の join.set_definition の中でエラーとなる
     1678          # celltype の属性として、この join の名前がない
     1679          # 以下の join.set_definition の中でエラーとなる
    17611680        end
    17621681      else
    1763         return    # celltype がない.すでにエラー
     1682        return    # celltype がない.すでにエラー
    17641683      end
    17651684    elsif join.get_rhs.instance_of? Array then
    17661685      rhs = join.get_rhs
    17671686      if rhs[0] == :COMPOSITE then
    1768         # composite の中でないのに attr = composite.attr が使われた
     1687        # composite の中でないのに attr = composite.attr が使われた
    17691688        cdl_error( "S1035 composite : cannot specify out of composite celltype definition"  )
    17701689        return
     
    17721691    end
    17731692
    1774     # 以下 composite 文法変更前からある処理
    1775 
    1776     # 既に左辺が同じ名前の初期化が存在するか?
    1777     j = @join_list.get_item( join.get_name )   # mikan NamespacePath がパスを持っている
    1778     if j.instance_of? Join then    # mikan ここでは j が Join or Nil 以外は、ないはず
     1693    # 以下 composite 文法変更前からある処理
     1694
     1695    # 既に左辺が同じ名前の初期化が存在するか?
     1696    j = @join_list.get_item( join.get_name )   # mikan NamespacePath がパスを持っている
     1697    if j.instance_of? Join then    # mikan ここでは j が Join or Nil 以外は、ないはず
    17791698
    17801699      # debug
    17811700      dbgPrint "add_array_member: #{@name} port: #{j.get_port_name} rhs: #{j.get_rhs}, #{join.get_port_name} #{join.get_rhs}\n"
    1782       # 呼び口é
    1783 åˆ—(であると仮定して)要素を追加
     1701      # 呼び口配列(であると仮定して)要素を追加
    17841702      j.add_array_member join
    17851703
     
    17901708    end
    17911709
    1792     # if get_owner then   # error S1030 発生時 get_owner が見つからなくて例外になる
     1710    # if get_owner then   # error S1030 発生時 get_owner が見つからなくて例外になる
    17931711    #   dbgPrint "Cell#new_join: #{get_owner.get_name}.#{@name}\n"
    17941712    # else
     
    18041722  end
    18051723
    1806   #=== Cell.新しい逆結合
     1724  #=== Cell.新しい逆結合
    18071725  def self.new_reverse_join( reverse_join )
    18081726    @@current_object.new_reverse_join( reverse_join )
    18091727  end
    18101728
    1811   #=== Cell#新しい逆結合
     1729  #=== Cell#新しい逆結合
    18121730  def new_reverse_join( reverse_join )
    18131731    dbgPrint( "new_reverse_join name=#{reverse_join.get_name}\n")
     
    18341752  end
    18351753
    1836   #=== Cell#逆結合から結合を生成
     1754  #=== Cell#逆結合から結合を生成
    18371755  # STAGE: S
    18381756  def create_reverse_join
     
    18441762#      @reverse_join_list.get_items.each{ |rj|
    18451763      @reverse_join_list.each{ |rj|
    1846         # 逆結合のæƒ
    1847 å ±ã‚’å¾—ã‚‹
     1764        # 逆結合の情報を得る
    18481765        ep_name = rj.get_name
    18491766        ep_subscript, cp_cell_nsp, cp_name, cp_subscript = rj.get_rhs_cell_and_port
    18501767
    1851         # 呼び口側のセルと、そのセルタイプ
     1768        # 呼び口側のセルと、そのセルタイプ
    18521769        if ! @in_composite then
    18531770          cell = Namespace.find cp_cell_nsp
     
    18911808  end
    18921809
    1893   #=== Cell# cell å†
    1894 ã«è¨˜è¿°ã™ã‚‹å‘¼ã³å£ã®å¤–部結合
    1895   # internal_cell_elem_name:: string : 呼び口名
    1896   # export_name:: string: composite の外部にå
    1897 ¬é–‹ã™ã‚‹å‘¼ã³å£å
    1898   #  呼び口を外部結合する.
    1899   #  このメソッドは、composite の中の cell でしか呼ばれない.
     1810  #=== Cell# cell 内に記述する呼び口の外部結合
     1811  # internal_cell_elem_name:: string : 呼び口名
     1812  # export_name:: string: composite の外部に公開する呼び口名
     1813  #  呼び口を外部結合する.
     1814  #  このメソッドは、composite の中の cell でしか呼ばれない.
    19001815  def external_join( internal_cell_elem_name, export_name, b_composite )
    19011816
    1902     # cCall => composite.cCall; ではないか?
     1817    # cCall => composite.cCall; ではないか?
    19031818    if( b_composite == false )then
    1904       # cCall => cCall; のような場合
     1819      # cCall => cCall; のような場合
    19051820      if @celltype.find( export_name ) then
    19061821        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 )
    19071822      end
    19081823    end
    1909     # composite の旧文法における、cell 外の cCall = Cell.cCall; の構文処理に渡す
     1824    # composite の旧文法における、cell 外の cCall = Cell.cCall; の構文処理に渡す
    19101825    CompositeCelltype.new_join( export_name, @name,  internal_cell_elem_name, :CALL )
    19111826  end
     
    19191834
    19201835  def end_of_parse f_def
    1921     if @b_prototype then  # prototype 指定子あったか?
    1922       f_def = false       # プロトタイプ宣言とする
     1836    if @b_prototype then  # prototype 指定子あったか?
     1837      f_def = false       # プロトタイプ宣言とする
    19231838      @b_prototype = false
    19241839    end
    19251840    if f_def == false then
    1926       # cell tCelltype Cell; の形式の場合
    1927       # f_def == true の場合 new_def で、呼出される
     1841      # cell tCelltype Cell; の形式の場合
     1842      # f_def == true の場合 new_def で、呼出される
    19281843      set_specifier_list( Generator.get_statement_specifier )
    19291844    end
     
    19381853  end
    19391854
    1940   #=== Cell# プロトタイプ宣言(false)か定義(true)かを設定
    1941   #    このメソッドは構文解釈の最後に呼出される
     1855  #=== Cell# プロトタイプ宣言(false)か定義(true)かを設定
     1856  #    このメソッドは構文解釈の最後に呼出される
    19421857  #f_def::     bool     false if prototype, true if definition
    19431858  def set_f_def f_def
     
    19481863    if ! @in_composite then
    19491864      # if @celltype.instance_of? Celltype then
    1950       if @celltype then  # composite でも呼びだす, エラー時 nil
     1865      if @celltype then  # composite でも呼びだす, エラー時 nil
    19511866        @celltype.new_cell self
    19521867      end
     
    19591874    @f_ref = true
    19601875
    1961     # composite のå†
    1962 éƒ¨ã‚»ãƒ«ã‚’参ç
    1963 §ã•ã‚ŒãŸã“とにする
    1964     # 今のところ問題ないが、未参ç
    1965 §ã§ã‚るべきものまで参ç
    1966 §ã•ã‚ŒãŸã“とになる
     1876    # composite の内部セルを参照されたことにする
     1877    # 今のところ問題ないが、未参照であるべきものまで参照されたことになる
    19671878    if @cell_list then
    19681879      @cell_list.each{ |cn,cell|
     
    19721883  end
    19731884
    1974   #=== Cell# cell の指定子を設定
     1885  #=== Cell# cell の指定子を設定
    19751886  # STAGE:  B
    19761887  #
    1977   #    bnf.y.rb の statement_specifiler_list
     1888  #    bnf.y.rb statement_specifiler_list
    19781889  #spec_list::      [ :ALLOCATOR, [ [ :NORMAL_ALLOC, ep_name, subscript, func_name, param_name, expr ], ... ] ]
    19791890  #                     s[0]      s[1]   a[0]        a[1]       a[2]        a[3]     a[4]       a[5]
    1980   #    セルに指定されたアロケータ指定子
    1981   #    a[1] の subscript はこのメソッドの中で Expression から Integer に評価される
    1982   #    受け口側に生成されるアロケータ呼び口の結合をå†
    1983 éƒ¨ç”Ÿæˆã™ã‚‹
    1984   #    呼び口側は Port の create_allocator_join にて生成
    1985   #    リレーアロケータの場合 create_relay_allocator_join にて生成す
     1891  #    セルに指定されたアロケータ指定子
     1892  #    a[1] の subscript はこのメソッドの中で Expression から Integer に評価される
     1893  #    受け口側に生成されるアロケータ呼び口の結合を内部生成する
     1894  #    呼び口側は Port の create_allocator_join にて生成
     1895  #    リレーアロケータの場合 create_relay_allocator_join にて生成す
    19861896  def set_specifier_list( spec_list )
    1987     return if spec_list == nil  # 空ならば何もしない
     1897    return if spec_list == nil  # 空ならば何もしない
    19881898
    19891899    dbgPrint( "set_spec_list: #{@name}\n" )
    1990     b_generate = false   # generate が指定された
     1900    b_generate = false   # generate が指定された
    19911901
    19921902    spec_list.each{ |s|
    19931903      case s[0]             # statement_specifier
    19941904      when :ALLOCATOR       # [allocator(ePort.func.param=allocCell.eA,ePort.func2.param=allocCell.eA)]
    1995         s[1].each { |a|     # alloc_list : allocator のå†
    1996 éƒ¨ã® ',' で区切られた部分のé
    1997 åˆ—
    1998           cp_name = :"#{a[0+1]}_#{a[2+1]}_#{a[3+1]}"    # アロケータ呼び口の名前:'=' の左辺を '.' に変えて '_' で連結
     1905        s[1].each { |a|     # alloc_list : allocator の内部の ',' で区切られた部分の配列
     1906          cp_name = :"#{a[0+1]}_#{a[2+1]}_#{a[3+1]}"    # アロケータ呼び口の名前:'=' の左辺を '.' に変えて '_' で連結
    19991907          # p "#{a[0]} #{a[0+1]} #{a[2+1]} #{a[3+1]} #{cp_name}"
    20001908          if a[1+1] then
     
    20041912            subscript = nil
    20051913          end
    2006           # アロケータ呼び口の結合を生成
    2007           join = Join.new( cp_name, subscript, a[4+1] )   # 構文解析段階なので locale 不要
     1914          # アロケータ呼び口の結合を生成
     1915          join = Join.new( cp_name, subscript, a[4+1] )   # 構文解析段階なので locale 不要
    20081916          dbgPrint( "new allocator join #{cp_name} #{subscript} #{a[4+1]}\n" )
    20091917          Cell.new_join( join )
     
    20511959  def get_allocator_list
    20521960
    2053     # 意味チェック(set_definition)されていない?
    2054     # relay アロケータの場合、セルの意味チェックが行われていないと、@alloc_list が完成しない
     1961    # 意味チェック(set_definition)されていない?
     1962    # relay アロケータの場合、セルの意味チェックが行われていないと、@alloc_list が完成しない
    20551963    if @b_checked == false then
    20561964      set_definition_join
     
    20631971  end
    20641972
    2065   #=== id 指定子の値を設定
    2066   # このメソッドは、プラグインで cell の生成順序を制御したい場合のために設けた
    2067   # 通常の id 指定子では使っていない
     1973  #=== id 指定子の値を設定
     1974  # このメソッドは、プラグインで cell の生成順序を制御したい場合のために設けた
     1975  # 通常の id 指定子では使っていない
    20681976  def set_specified_id id
    20691977    if Integer( id ) != id || id <= 0 then
     
    20761984  end
    20771985
    2078   #=== Cell# セルプラグイン (generate 指定子)
     1986  #=== Cell# セルプラグイン (generate 指定子)
    20791987  def cell_plugin
    20801988    plugin_name = @generate[0]
     
    20891997
    20901998    plClass = load_plugin( plugin_name, CellPlugin )
    2091     # return if plClass == nil # 従来と仕様が変わるので、継続する
     1999    # return if plClass == nil # 従来と仕様が変わるので、継続する
    20922000    if $verbose then
    20932001      print "new cell plugin: plugin_object = #{plClass.class.name}.new( #{@name}, #{option} )\n"
     
    21092017  end
    21102018
    2111   #=== Cell# cell を composite セルタイプのセル用に clone する
    2112   #name::        string : 親 cell の名前  (cell tComposite cell1 での cell1)
    2113   #global_name:: string : 親 cell の global_name
    2114   #join_array::  Join[] : composite の cell の join で、この cell に対応するもの
    2115   #ct_name::     string : 親セルのセルタイプ名
    2116   #region::      Region : å
    2117 ƒã®ã‚»ãƒ«ãŒå±žã™ã‚‹ region
    2118   #このメソッドは CompositeCelltype の expand から呼出される
     2019  #=== Cell# cell を composite セルタイプのセル用に clone する
     2020  #name::        string : 親 cell の名前  (cell tComposite cell1 での cell1)
     2021  #global_name:: string : 親 cell の global_name
     2022  #join_array::  Join[] : composite の cell の join で、この cell に対応するもの
     2023  #ct_name::     string : 親セルのセルタイプ名
     2024  #region::      Region : 元のセルが属する region
     2025  #このメソッドは CompositeCelltype の expand から呼出される
    21192026  def clone_for_composite( name, global_name, namespacePath, join_array, ct_name, region, plugin, locale )
    21202027
     
    21252032    @my_clone = self.clone
    21262033
    2127     # clone したセルのå†
    2128 éƒ¨ã«æŒã¤åå‰æƒ
    2129 å ±ã‚’調整する
     2034    # clone したセルの内部に持つ名前情報を調整する
    21302035    @my_clone.set_cloned( name, global_name, namespacePath, join_array, ct_name, region, plugin, locale )
    21312036
    2132     # @celltype == nil は以前にセルタイプ未定義エラー
     2037    # @celltype == nil は以前にセルタイプ未定義エラー
    21332038    if @b_defined == true && @celltype != nil then
    21342039      if @celltype.instance_of?( Celltype ) then
    2135         # celltype に登録(コード生成の対象となる)
     2040        # celltype に登録(コード生成の対象となる)
    21362041        @celltype.new_cell( @my_clone )
    21372042      end
     
    21412046  end
    21422047
    2143   #=== Cell# clone されたセルのå†
    2144 éƒ¨ã«æŒã¤åå‰æƒ
    2145 å ±ã‚’調整する
    2146   #name::        string : 親 cell の名前  (cell tComposite cell1 での cell1)
    2147   #global_name:: string : 親 cell の global_name
    2148   #join_array::  Join[] : composite の cell の join で、この cell に対応するもの
    2149   #parent_ct_name:: string : 親セルのセルタイプ名(composite セルタイプ)
    2150   #  このメソッドはすぐ上の clone_for_composite から呼出され、clone されたセルを整える
     2048  #=== Cell# clone されたセルの内部に持つ名前情報を調整する
     2049  #name::        string : 親 cell の名前  (cell tComposite cell1 での cell1)
     2050  #global_name:: string : 親 cell の global_name
     2051  #join_array::  Join[] : composite の cell の join で、この cell に対応するもの
     2052  #parent_ct_name:: string : 親セルのセルタイプ名(composite セルタイプ)
     2053  #  このメソッドはすぐ上の clone_for_composite から呼出され、clone されたセルを整える
    21512054  def set_cloned( name, global_name, namespacePath, join_array, parent_ct_name, region, plugin, locale )
    21522055
     
    21652068    @f_cloned = true
    21662069
    2167     # Namespace.new_cell( self )  # mikan namespace 対応
    2168     region.new_cell( self )  # mikan  namespace に cell を置けないことを仮定
    2169 
    2170     # join_list : NamedList の clone を作る
     2070    # Namespace.new_cell( self )  # mikan namespace 対応
     2071    region.new_cell( self )  # mikan  namespace に cell を置けないことを仮定
     2072
     2073    # join_list : NamedList の clone を作る
    21712074    if @celltype then
    21722075      dbgPrint "set_cloned: #{@celltype.get_name} #{@name} #{region.get_name}\n"
     
    21812084    @cell_list2 = []
    21822085
    2183     # このセルのグローバル名を与える
    2184     # C_EXP の$id$ 置換はこのセルの名前になる
     2086    # このセルのグローバル名を与える
     2087    # C_EXP の$id$ 置換はこのセルの名前になる
    21852088    join_array.each { |j|
    21862089      @join_list.change_item j
     
    21882091  end
    21892092
    2190   #=== clone されたセルが composite の場合、å†
    2191 éƒ¨ã‚»ãƒ«ã‚’展開する
    2192   #self:: clone されたセルでなければならない
     2093  #=== clone されたセルが composite の場合、内部セルを展開する
     2094  #self:: clone されたセルでなければならない
    21932095  def expand_inner
    21942096    if ! @f_cloned then
     
    21962098    end
    21972099
    2198     # clone しようとするセルが composit セルタイプ?
     2100    # clone しようとするセルが composit セルタイプ?
    21992101    if @celltype.instance_of?( CompositeCelltype ) then
    2200       # composite cell を再帰的に展開
     2102      # composite cell を再帰的に展開
    22012103      @cell_list, @cell_list2 = @celltype.expand( @name, @global_name, @NamespacePath, @join_list, @region, @plugin, @locale )
    22022104    end
    22032105  end
    22042106
    2205   #=== Cell# clone された cell の join_list の右辺の変更
    2206   #  呼び口の右辺の cell を他の clone された cell に置換え
     2107  #=== Cell# clone された cell の join_list の右辺の変更
     2108  #  呼び口の右辺の cell を他の clone された cell に置換え
    22072109  def change_rhs_port cloned_cell_list
    22082110
     
    22472149  end
    22482150
    2249   #=== Cell# 生成されるセルか?
    2250   # 最適化、コード生成中に、対象となる region に属する場合 true を返す
     2151  #=== Cell# 生成されるセルか?
     2152  # 最適化、コード生成中に、対象となる region に属する場合 true を返す
    22512153  def is_generate?
    22522154    if $generating_region == nil then
    2253       # 構文解釈、意味解析段階で呼ばれると例外発生
     2155      # 構文解釈、意味解析段階で呼ばれると例外発生
    22542156      raise "is_generate? called before optimizing"
    22552157    end
     
    22632165  end
    22642166
    2265   #=== Cell# composite å†
    2266 éƒ¨ã®è¤‡è£½ã•ã‚ŒãŸã‚»ãƒ«ã‹ï¼Ÿ
    2267   # composite 定義のå†
    2268 éƒ¨ã®ã‚»ãƒ« (@in_composite = true) ではない
     2167  #=== Cell# composite 内部の複製されたセルか?
     2168  # composite 定義の内部のセル (@in_composite = true) ではない
    22692169  def is_cloned?
    22702170    @f_cloned
    22712171  end
    22722172
    2273   #=== Cell# composite å†
    2274 éƒ¨ã®ã‚»ãƒ«ã‹ï¼Ÿ
     2173  #=== Cell# composite 内部のセルか?
    22752174  def is_in_composite?
    22762175    @in_composite
    22772176  end
    22782177
    2279   #=== Cell# composite のセルか?
     2178  #=== Cell# composite のセルか?
    22802179  def is_of_composite?
    22812180    if @celltype.kind_of? CompositeCelltype
     
    22862185  end
    22872186
    2288   #=== Cell# tmp_plugin_post_code.cdl で生成されたセルか?
     2187  #=== Cell# tmp_plugin_post_code.cdl で生成されたセルか?
    22892188  def post_code_generated?
    22902189    @b_post_code_generated
    22912190  end
    22922191
    2293   # composite cell の port に対応するå†
    2294 éƒ¨ã® cell の port の名前(リンク時にå¿
    2295 è¦ãªåå‰ï¼‰
     2192  # composite cell の port に対応する内部の cell の port の名前(リンク時に必要な名前)
    22962193  def get_real_global_name port_name
    22972194    if @celltype.instance_of?( CompositeCelltype ) then
     
    23212218  end
    23222219
    2323   #=== Cell# セルの受け口 port_name に対する実際のセル名、受け口名を '_' で連結
    2324   #    namespace 名 + '_' + セル名 + '_' + 受け口名   ï¼ˆã“のセルが composite ならば展開後のセル名、受け口名)
     2220  #=== Cell# セルの受け口 port_name に対する実際のセル名、受け口名を '_' で連結
     2221  #    namespace 名 + '_' + セル名 + '_' + 受け口名   (このセルが composite ならば展開後のセル名、受け口名)
    23252222  def get_real_global_port_name port_name
    23262223
    2327     # composite か?
     2224    # composite か?
    23282225    if @celltype.instance_of?( CompositeCelltype ) then
    23292226
     
    23362233      }
    23372234
    2338       # セルタイプå†
    2339 ã§ port_name の CompositeCelltypeJoin を探す(コード生成段階ではå¿
    2340 ãšè¦‹ã¤ã‹ã‚‹ï¼‰
     2235      # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる)
    23412236      cj = @celltype.find_export( port_name )
    23422237
     
    23442239      dbgPrint "   composite join name: #{cj.get_name}  cell: #{cj.get_cell_name}  cell elem: #{cj.get_cell_elem_name}\n"
    23452240
    2346       # composite のå†
    2347 éƒ¨ã®ã‚»ãƒ«ã«å¯¾ã—再帰的に get_real_global_port_name を適用
     2241      # composite の内部のセルに対し再帰的に get_real_global_port_name を適用
    23482242      name = @cell_list[ "#{cj.get_cell_name}" ].get_real_global_port_name( cj.get_cell_elem_name )
    23492243      return name
     
    23572251  end
    23582252
    2359   #=== Cell# PORT (celltype の定義) を得る
     2253  #=== Cell# PORT (celltype の定義) を得る
    23602254  def get_real_port( port_name )
    23612255
    2362     # composite か?
     2256    # composite か?
    23632257    if @celltype.instance_of?( CompositeCelltype ) then
    23642258
    2365       # セルタイプå†
    2366 ã§ port_name の CompositeCelltypeJoin を探す(コード生成段階ではå¿
    2367 ãšè¦‹ã¤ã‹ã‚‹ï¼‰
     2259      # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる)
    23682260      cj = @celltype.find_export( port_name )
    23692261
    2370       # composite のå†
    2371 éƒ¨ã®ã‚»ãƒ«ã«å¯¾ã—再帰的に get_real_port を適用
     2262      # composite の内部のセルに対し再帰的に get_real_port を適用
    23722263      port = @cell_list[ "#{cj.get_cell_name}" ].get_real_port( cj.get_cell_elem_name )
    23732264      return port
     
    23782269  end
    23792270
    2380   #=== Cell# cell を得る
    2381   #    composite でなければ自分自身を返す
     2271  #=== Cell# cell を得る
     2272  #    composite でなければ自分自身を返す
    23822273  def get_real_cell( port_name )
    23832274
    2384     # composite か?
     2275    # composite か?
    23852276    if @celltype.instance_of?( CompositeCelltype ) then
    23862277
    2387       # セルタイプå†
    2388 ã§ port_name の CompositeCelltypeJoin を探す(コード生成段階ではå¿
    2389 ãšè¦‹ã¤ã‹ã‚‹ï¼‰
     2278      # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる)
    23902279      # print "get_real_cell: cell=#{@name} port=#{port_name}\n"
    23912280      # pp @cell_list
    23922281      cj = @celltype.find_export( port_name )
    23932282
    2394       # composite のå†
    2395 éƒ¨ã®ã‚»ãƒ«ã«å¯¾ã—再帰的に get_real_port を適用
     2283      # composite の内部のセルに対し再帰的に get_real_port を適用
    23962284      cell = @cell_list[ "#{cj.get_cell_name}" ].get_real_cell( cj.get_cell_elem_name )
    23972285      return cell
     
    24122300  end
    24132301
    2414   #=== Cell# 受け口のport の参ç
    2415 §ã‚«ã‚¦ãƒ³ãƒˆã‚’アップする
    2416   #port_name:: Symbol  : ポート名
     2302  #=== Cell# 受け口のport の参照カウントをアップする
     2303  #port_name:: Symbol  : ポート名
    24172304  def port_referenced port
    24182305    if @referenced_port_list[ port ] then
     
    24222309    end
    24232310
    2424     # composite か?
     2311    # composite か?
    24252312    if @celltype.instance_of?( CompositeCelltype ) then
    24262313
    2427       # セルタイプå†
    2428 ã§ port_name の CompositeCelltypeJoin を探す(コード生成段階ではå¿
    2429 ãšè¦‹ã¤ã‹ã‚‹ï¼‰
     2314      # セルタイプ内で port_name の CompositeCelltypeJoin を探す(コード生成段階では必ず見つかる)
    24302315      cj = @celltype.find_export( port.get_name )
    24312316
    24322317      dbgPrint " port_referenced: #{@celltype.get_name} #{@name} cj=#{cj&&(cj.get_name)||"nil"}\n"
    24332318
    2434       if cj then  # 既にエラー
    2435         # composite のå†
    2436 éƒ¨ã®ã‚»ãƒ«ã«å¯¾ã—再帰的に get_real_port を適用
     2319      if cj then  # 既にエラー
     2320        # composite の内部のセルに対し再帰的に get_real_port を適用
    24372321        cell = @cell_list[ "#{cj.get_cell_name}" ]
    24382322        if cell && cell.get_celltype then
     
    24572341  end
    24582342
    2459   #Cell#属性の初期値を得る
    2460   #attr_name::Symbol  å¿
    2461 ãšåˆæœŸåŒ–されていないと Ruby 例外となる
     2343  #Cell#属性の初期値を得る
     2344  #attr_name::Symbol  必ず初期化されていないと Ruby 例外となる
    24622345  def get_attr_initializer attr_name
    24632346    val = @join_list.get_item( attr_name )
     
    24992382  end
    25002383
    2501   #=== Cell# 受け口é
    2502 åˆ—の添数の最大値を設定
     2384  #=== Cell# 受け口配列の添数の最大値を設定
    25032385  def set_entry_port_max_subscript( port, num )
    25042386    dbgPrint( "set_entry_port_max_subscript: #{@name}.#{port.get_name}: #{num}\n" )
     
    25112393  end
    25122394
    2513   #=== Cell# composite のå†
    2514 å´ã‚»ãƒ«ã®å—け口é
    2515 åˆ—の添数の最大値を設定
     2395  #=== Cell# composite の内側セルの受け口配列の添数の最大値を設定
    25162396  def set_entry_inner_port_max_subscript( port, num )
    25172397    if @cell_list == nil then
    2518       return    # プロトタイプ宣言しかされていなくて、å†
    2519 å´ã‚»ãƒ«ãŒå±•é–‹ã•ã‚Œã¦ã„ない or composite 展開前
    2520     end
    2521 
    2522     # composite のå†
    2523 å´ã®ã‚»ãƒ«ã«ä¼æ’­
     2398      return    # プロトタイプ宣言しかされていなくて、内側セルが展開されていない or composite 展開前
     2399    end
     2400
     2401    # composite の内側のセルに伝播
    25242402    if @celltype.instance_of? CompositeCelltype then
    25252403      dbgPrint "set_entry_inner_port_max_subscript #{@name} #{@port} #{num} cell_list.len=#{@cell_list.length}\n"
     
    25382416  end
    25392417
    2540   #=== Cell# 受け口é
    2541 åˆ—の添数の最大値を返す
    2542   # 長さは +1 する
    2543   # 1つもない場合は -1 を返す
     2418  #=== Cell# 受け口配列の添数の最大値を返す
     2419  # 長さは +1 する
     2420  # 1つもない場合は -1 を返す
    25442421  def get_entry_port_max_subscript( port )
    25452422    subscript = @entry_array_max_subscript[port]
     
    25502427  end
    25512428
    2552   #=== Cell# リレーアロケータの結合を生成
     2429  #=== Cell# リレーアロケータの結合を生成
    25532430  # STAGE: S
    2554   # 呼び口側の結合をå
    2555 ƒã«å—け口側の結合を生成
     2431  # 呼び口側の結合を元に受け口側の結合を生成
    25562432  def create_relay_allocator_join
    25572433
    2558     # celltype がなければチェックしない(既にエラー)
     2434    # celltype がなければチェックしない(既にエラー)
    25592435    return if @celltype == nil
    25602436
    2561     # relay allocator を生成
     2437    # relay allocator を生成
    25622438    @celltype.get_port_list.each { |p|
    25632439      ail = p.get_allocator_instance
     
    25652441        dbgPrint "create_relay_allocator_join: #{@name}, #{p.get_name}\n"
    25662442        if p.get_array_size then
    2567           # mikan relay allocator が array に対応できてもよいのでは?
     2443          # mikan relay allocator が array に対応できてもよいのでは?
    25682444          cdl_error( "S1040 array not supported for relay allocator"  )
    25692445          next
     
    25732449          if ai2[0] == :RELAY_ALLOC then
    25742450            dbgPrint "create_relay_allocator_join: #{@name}, #{name}\n"
    2575             # 呼び口側の結合を取り出す
     2451            # 呼び口側の結合を取り出す
    25762452            ja = @join_list.get_item( :"#{ai2[3]}_#{ai2[4]}_#{ai2[5]}" )
    25772453            if ja == nil then
    2578               # 見つからない場合
     2454              # 見つからない場合
    25792455              found = false
    25802456             
    2581               # composite å†
    2582 ã§å¤–部に結合されているか
     2457              # composite 内で外部に結合されているか
    25832458              if @in_composite then
    25842459                @compositecelltypejoin_list.get_items.each { |cj|
     
    25972472                cdl_error( "S1041 \'$1_$2_$3\': not joined. cannot create internal join for relay allocator" , ai2[3], ai2[4], ai2[5] )
    25982473                print( "      In cell #{get_name}\n" )
    2599                 # join が未結合であることのエラーは二度でる (S1043)
     2474                # join が未結合であることのエラーは二度でる (S1043)
    26002475              end
    2601               next    # 打ち切る
     2476              next    # 打ち切る
    26022477            end
    26032478
    26042479            b_export = false
    2605             # composite å†
    2606 ã®ã‚»ãƒ«ã§ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•ã‚Œã¦ã„るかチェック
    2607             #  mikan エクスポート側と、こちら側で、リレーå
    2608 ˆãŒä¸€è‡´ã™ã‚‹ã‹ãƒã‚§ãƒƒã‚¯ãŒå¿
    2609 è¦
     2480            # composite 内のセルでエクスポートされているかチェック
     2481            #  mikan エクスポート側と、こちら側で、リレー先が一致するかチェックが必要
    26102482            if @compositecelltypejoin_list then
    2611               # export されているか調べる
     2483              # export されているか調べる
    26122484              @compositecelltypejoin_list.get_items.each{ |cj|
    2613                 # 属性名と composite の export する名前は一致するか
     2485                # 属性名と composite の export する名前は一致するか
    26142486                if p.get_name == cj.get_cell_elem_name then
    26152487                  print "export : #{p.get_name}\n"
    2616                   b_export = true    # 属性は export されているので、とりあえず未初期化とはしない
     2488                  b_export = true    # 属性は export されているので、とりあえず未初期化とはしない
    26172489                  break
    26182490                end
     
    26212493            end
    26222494
    2623             # mikan é
    2624 åˆ—
     2495            # mikan 配列
    26252496            am = nil
    26262497            if am then
     
    26292500                subscript = ja2.get_subscript
    26302501                if b_export == false then
    2631                   # CompositeCelltype の場合、å†
    2632 å´ã®ã‚»ãƒ«ã§ç”Ÿæˆã•ã›ã‚‹
     2502                  # CompositeCelltype の場合、内側のセルで生成させる
    26332503                  join = Join.new( :"#{p.get_name}_#{ai2[1]}_#{ai2[2]}", subscript, rhs, @loacle )
    26342504                  # p ( "#{p.get_name}_#{ai2[1]}_#{ai2[2]}", subscript, rhs )
    26352505                  new_join( join )
    26362506                  join.set_definition( @celltype.find(join.get_name) )
    2637                   # mikan relay mismatch チェックができていない(下方を参ç
    2638 §ï¼‰
     2507                  # mikan relay mismatch チェックができていない(下方を参照)
    26392508                end
    26402509                @alloc_list << [ :NORMAL_ALLOC, p.get_name, subscript, ai2[1], ai2[2], rhs ]
     
    26422511            else
    26432512              if b_export == false then
    2644                 # CompositeCelltype の場合、å†
    2645 å´ã®ã‚»ãƒ«ã§ç”Ÿæˆã•ã›ã‚‹
     2513                # CompositeCelltype の場合、内側のセルで生成させる
    26462514                join = Join.new( :"#{p.get_name}_#{ai2[1]}_#{ai2[2]}", nil, ja.get_rhs, @locale )
    26472515                new_join( join )
     
    26532521                                      "#{p.get_name}_#{ai2[1]}_#{ai2[2]}",
    26542522                                      "#{ai2[3]}_#{ai2[4]}_#{ai2[5]}" )
    2655                     # 本当は composite の呼び口と受け口の間で行うべきだが、å†
    2656 éƒ¨ã§å¤šæ®µæŽ¥ç¶šã•ã‚Œã¦ã„る場合
     2523                    # 本当は composite の呼び口と受け口の間で行うべきだが、内部で多段接続されている場合
    26572524                  else
    26582525                    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"
     
    26692536  end
    26702537
    2671   #=== Cell# @@cell_list2 を作る
    2672   # @@cell_list2 は、出現順に composite å†
    2673 ã‚’含むセルのリスト
     2538  #=== Cell# @@cell_list2 を作る
     2539  # @@cell_list2 は、出現順に composite 内を含むセルのリスト
    26742540  def self.make_cell_list2
    26752541    @@cell_list.each{ |c|
     
    26792545  end
    26802546
    2681   #=== Cell# @@cell_list2 を得る
    2682   # composite å†
    2683 ã‚’含む (compositeも含む)
    2684   # 意味解析後に作成される
     2547  #=== Cell# @@cell_list2 を得る
     2548  # composite 内を含む (compositeも含む)
     2549  # 意味解析後に作成される
    26852550  def self.get_cell_list2
    26862551    @@cell_list2
    26872552  end
    26882553
    2689   #=== Cell# @@cell_list を得る
    2690   #composite の中を含まない
     2554  #=== Cell# @@cell_list を得る
     2555  #composite の中を含まない
    26912556  def self.get_cell_list
    26922557    @@cell_list
    26932558  end
    26942559
    2695   #=== Cell# reverse_join を生成する
     2560  #=== Cell# reverse_join を生成する
    26962561  def self.create_reverse_join
    26972562    @@cell_list.each{ |c|
     
    27052570  end
    27062571
    2707   #=== Cell# reverse_require_join を生成する
     2572  #=== Cell# reverse_require_join を生成する
    27082573  def self.create_reverse_require_join
    27092574    @@cell_list2.each{ |c|
     
    27112576      # if c.is_generate? then
    27122577        if ct then
    2713           # self への呼び口側の結合を生成
     2578          # self への呼び口側の結合を生成
    27142579          ct.create_reverse_require_join c
    27152580        end
     
    27182583  end
    27192584
    2720   #=== Cell# 受け口のport の参ç
    2721 §ã‚«ã‚¦ãƒ³ãƒˆã‚’設定する
    2722   # self は呼びå
    2723 ƒã®ã‚»ãƒ«
    2724   # 呼びå
    2725 ˆã‚»ãƒ«ã®å—け口の参ç
    2726 §ã‚«ã‚¦ãƒ³ãƒˆã‚’アップする
     2585  #=== Cell# 受け口のport の参照カウントを設定する
     2586  # self は呼び元のセル
     2587  # 呼び先セルの受け口の参照カウントをアップする
    27272588  def set_port_reference_count
    27282589    @join_list.get_items.each { |j|
    27292590      if j.get_definition.instance_of? Port then
    27302591        am = j.get_array_member2
    2731         if am then             # 呼び口é
    2732 åˆ—
     2592        if am then             # 呼び口配列
    27332593          am.each { |j2|
    2734             next if j2 == nil    # optional で一部が欠落しているケース
     2594            next if j2 == nil    # optional で一部が欠落しているケース
    27352595            cell = j2.get_rhs_cell2
    2736             next if cell == nil     # 右辺が見つからなかった.既にエラー
     2596            next if cell == nil     # 右辺が見つからなかった.既にエラー
    27372597            port = cell.get_celltype.find( j2.get_rhs_port2 )
    27382598            dbgPrint( "set_port_reference_count: #{@name}.#{j2.get_name} => #{cell.get_name}.#{port.get_name}\n")
     
    27412601        else
    27422602          cell = j.get_rhs_cell2
    2743           next if cell == nil || cell.get_celltype == nil     # 右辺が見つからなかった.既にエラー
     2603          next if cell == nil || cell.get_celltype == nil     # 右辺が見つからなかった.既にエラー
    27442604          port = cell.get_celltype.find( j.get_rhs_port2 )
    27452605          if port == nil then
    27462606            dbgPrint "set_port_ref: #{@name}.#{j.get_name} = #{cell.get_name}.#{j.get_rhs_port2}\n"
    2747             # through プラグインで生成されたセルの受け口が見つからないケース (のハズ)
     2607            # through プラグインで生成されたセルの受け口が見つからないケース (のハズ)
    27482608            cdl_error( "entry '$1' not found in '$2' refered from $3.$4", j.get_rhs_port2, cell.get_name, @name, j.get_name )
    27492609            next
     
    27562616  end
    27572617
    2758   #=== Cell# 結合(Join)のチェック
    2759   #     Join は呼び口の結合または attribute の初期化
     2618  #=== Cell# 結合(Join)のチェック
     2619  #     Join は呼び口の結合または attribute の初期化
    27602620  #
    2761   #  mikan このメソッドは、以下の4つのチェックからなるが、分割したほうがより適切な長さのメソッドになる
    2762   #  ・リレーアロケータの生成 => create_relay_allocator_join
    2763   #  ・未結合の呼び口のチェック
    2764   #  ・ポインタ型がé
    2765 åˆ—で初期化される場合のチェック
    2766   #  ・未初期化の属性のチェック
     2621  #  mikan このメソッドは、以下の4つのチェックからなるが、分割したほうがより適切な長さのメソッドになる
     2622  #  ・リレーアロケータの生成 => create_relay_allocator_join
     2623  #  ・未結合の呼び口のチェック
     2624  #  ・ポインタ型が配列で初期化される場合のチェック
     2625  #  ・未初期化の属性のチェック
    27672626  def check_join
    27682627
    2769     # celltype がなければチェックしない(既にエラー)
     2628    # celltype がなければチェックしない(既にエラー)
    27702629    return if @celltype == nil
    27712630    return if @b_defined == false
    2772     return if @f_cloned == true    # å†
    2773 éƒ¨ã‚»ãƒ«ã«ã¤ã„ては、composite の定義時にチェックされている
     2631    return if @f_cloned == true    # 内部セルについては、composite の定義時にチェックされている
    27742632
    27752633    # debug
     
    27792637    # end
    27802638
    2781     # 未結合の呼び口のチェック
     2639    # 未結合の呼び口のチェック
    27822640    @celltype.get_port_list.each { |p|
    27832641
    2784       # 呼び口でなければ、チェックしない
     2642      # 呼び口でなければ、チェックしない
    27852643      next if p.get_port_type != :CALL
    27862644
     
    27882646      dbgPrint "check_join: #{@name} #{get_celltype.get_name} #{p.get_name}\n"
    27892647
    2790       # 結合リストの中から呼び口名に一致するものを取りだす
     2648      # 結合リストの中から呼び口名に一致するものを取りだす
    27912649      j = @join_list.get_item( p.get_name )
    27922650
    27932651      if j == nil then
    2794         # 未結合の呼び口
    2795 
    2796         # composite celltype のå†
    2797 éƒ¨ã®å ´åˆã€composite celltype が export する呼び口に結合されているか探す
     2652        # 未結合の呼び口
     2653
     2654        # composite celltype の内部の場合、composite celltype が export する呼び口に結合されているか探す
    27982655        found = false
    27992656        if @in_composite then
    2800           # composite celltype の export するものすべてから探す
    2801           # (export するものの右辺値から探すために get_item ではダメ)
     2657          # composite celltype の export するものすべてから探す
     2658          # (export するものの右辺値から探すために get_item ではダメ)
    28022659          @compositecelltypejoin_list.get_items.each{ |cj|
    2803             # 呼び口名と composite の export する名前は一致するか
     2660            # 呼び口名と composite の export する名前は一致するか
    28042661            if p.get_name == cj.get_cell_elem_name then
    28052662              found = true
     
    28082665        end
    28092666
    2810         # 呼び口é
    2811 åˆ—の場合 optional でå
    2812 ¨ã¦ã®è¦ç´ ãŒåˆæœŸåŒ–されない場合に、ここへ来る
     2667        # 呼び口配列の場合 optional で全ての要素が初期化されない場合に、ここへ来る
    28132668        if ! found && ! p.is_require? && ! p.is_optional? then
    28142669          if ! p.is_allocator_port? then
     
    28192674        end
    28202675      elsif p.get_array_size.kind_of? Integer then
    2821         # 添数あり呼び口é
    2822 åˆ—の場合、すべての添数要素が初期化されているかチェックする
     2676        # 添数あり呼び口配列の場合、すべての添数要素が初期化されているかチェックする
    28232677
    28242678        am = j.get_array_member2
    28252679        if( am )then
    2826           # join はé
    2827 åˆ—
    2828 
    2829           # 呼び口é
    2830 åˆ—定義でのé
    2831 åˆ—の大きさ
     2680          # join は配列
     2681
     2682          # 呼び口配列定義での配列の大きさ
    28322683          length = p.get_array_size
    28332684
    2834           # é
    2835 åˆ—の大きさが呼び口é
    2836 åˆ—定義と結合定義で一致するか?
     2685          # 配列の大きさが呼び口配列定義と結合定義で一致するか?
    28372686          if am.length != length then
    28382687            if ! p.is_optional? || am.length >= length then
    2839               # optional の場合、要素数が少なすぎるのは OK
     2688              # optional の場合、要素数が少なすぎるのは OK
    28402689              cdl_error( "S1044 $1: array initializer too many or few, $2 for $3" , p.get_name, am.length, length )
    28412690            end
    28422691
    2843             # am の要素に nil を追加しておく (#_CPA_# のコード生成時、このé
    2844 åˆ—要素数分生成)
     2692            # am の要素に nil を追加しておく (#_CPA_# のコード生成時、この配列要素数分生成)
    28452693            i = am.length
    28462694            while i < length
     
    28502698          end
    28512699
    2852 #          # é
    2853 åˆ—要素の抜けがないかチェック
    2854 #          if am.length < length then  # 満たない場合既にエラーだが要素のある範囲でチェック
     2700#          # 配列要素の抜けがないかチェック
     2701#          if am.length < length then  # 満たない場合既にエラーだが要素のある範囲でチェック
    28552702#            length = am.length
    28562703#          end
     
    28622709              end
    28632710            else
    2864               # 生成されないリージョンへの結合かチェック
     2711              # 生成されないリージョンへの結合かチェック
    28652712              if ! @in_composite then
    28662713                am[i].check_region2
     
    28712718
    28722719        # else
    2873         # join が非é
    2874 åˆ—であれば、既にエラー
     2720        # join が非配列であれば、既にエラー
    28752721        end
    28762722      elsif j.get_array_member then
    2877         # 添数なし呼び口é
    2878 åˆ—の場合
     2723        # 添数なし呼び口配列の場合
    28792724        am = j.get_array_member2
    28802725        length = am.length
     
    28892734        end
    28902735
    2891         # 生成されないリージョンへの結合かチェック
     2736        # 生成されないリージョンへの結合かチェック
    28922737        if ! @in_composite then
    28932738          am.each { |join|
     
    28982743        end
    28992744      else
    2900         # 呼び口[é
    2901 åˆ—」でない場合
    2902 
    2903         # 生成されないリージョンへの結合かチェック
     2745        # 呼び口[配列」でない場合
     2746
     2747        # 生成されないリージョンへの結合かチェック
    29042748        if ! @in_composite then
    29052749          j.check_region2
     
    29092753    }
    29102754
    2911     # ポインタ型がé
    2912 åˆ—で初期化される場合のチェック
     2755    # ポインタ型が配列で初期化される場合のチェック
    29132756    (@celltype.get_attribute_list+@celltype.get_var_list).each { |a|
    29142757      if a.get_size_is then
    29152758
    29162759        if a.instance_of? CompositeCelltypeJoin then
    2917           # 既にエラーになっている
     2760          # 既にエラーになっている
    29182761          # cdl_error( "S1047 size_is pointer cannot be exposed for composite attribute"  )
    29192762          next
     
    29252768          size = a.get_size_is.eval_const( @join_list, @celltype.get_name_list )
    29262769          a.get_type.set_scs( a.get_size_is, nil, nil, nil, false )
    2927           if( ! size.kind_of? Integer )then               # C_EXP の可能性あり
    2928             # mikan 多分ここでのエラー発生は不要、eval_const の中で変数が存在しない、型が不適切などのエラーになるはず
     2770          if( ! size.kind_of? Integer )then               # C_EXP の可能性あり
     2771            # mikan 多分ここでのエラー発生は不要、eval_const の中で変数が存在しない、型が不適切などのエラーになるはず
    29292772            cdl_error( "S1049 $1: size_is arg not constant" , a.get_name )
    29302773          else
     
    29422785              end
    29432786            else
    2944               # size_is 引数がセルで指定されていて、初期化子がセルタイプで指定されているケースのチェック
     2787              # size_is 引数がセルで指定されていて、初期化子がセルタイプで指定されているケースのチェック
    29452788              ini = a.get_initializer
    29462789              if ini.instance_of? Expression
     
    29572800      else
    29582801        if ! a.instance_of? CompositeCelltypeJoin then
    2959           # composite は size_is 指定できない
     2802          # composite は size_is 指定できない
    29602803          if a.get_type.kind_of?( PtrType ) then
    29612804            j = @join_list.get_item( a.get_identifier )
    29622805            if j && j.get_rhs.instance_of?( Array ) then
    2963               ## size_is 指定されていないポインタが Array で初期化されていたら、エラーとする
     2806              ## size_is 指定されていないポインタが Array で初期化されていたら、エラーとする
    29642807              cdl_error( "S1169 $1: non-size_is pointer cannot be initialized with array initializer" , a.get_identifier )
    29652808            end
     
    29692812    }
    29702813
    2971     # 未初期化の属性をチェック
     2814    # 未初期化の属性をチェック
    29722815    @celltype.get_attribute_list.each { |a|
    29732816      b_init = false
    29742817      # self.show_tree 1
    2975       if a.get_initializer then                               # セルタイプで初期化されている
     2818      if a.get_initializer then                               # セルタイプで初期化されている
    29762819        b_init = true
    2977         # @in_composite で export されている場合には、この初期値は使われない
    2978         # export されている、いないに関わらず、初期化されていることが保証される
    2979       elsif @join_list.get_item( a.get_name ) then            # セルで初期化されている
     2820        # @in_composite で export されている場合には、この初期値は使われない
     2821        # export されている、いないに関わらず、初期化されていることが保証される
     2822      elsif @join_list.get_item( a.get_name ) then            # セルで初期化されている
    29802823        b_init = true
    29812824      elsif @in_composite && @compositecelltypejoin_list then
    2982         # 属性が export されているか調べる。export されていれば未初期化とはしない
    2983         # mikan リニアサーチ
     2825        # 属性が export されているか調べる。export されていれば未初期化とはしない
     2826        # mikan リニアサーチ
    29842827        @compositecelltypejoin_list.get_items.each{ |cj|
    2985           # 属性名と composite の export する名前は一致するか
     2828          # 属性名と composite の export する名前は一致するか
    29862829          if a.get_name.to_sym == cj.get_cell_elem_name.to_sym then
    2987             b_init = true    # 属性は export されているので、とりあえず未初期化とはしない
     2830            b_init = true    # 属性は export されているので、とりあえず未初期化とはしない
    29882831          end
    29892832        }
    29902833        if b_init then
    2991           # size_is の引数がマッチするかチェックする
    2992           # å†
    2993 éƒ¨ã‚»ãƒ«ã® size_is をエクスポートする size_is とマッチするかチェックする
    2994           # å†
    2995 éƒ¨ã‚»ãƒ«ã¨ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã§åå‰ã‚’変えている可能性があるので、å†
    2996 éƒ¨ã‚»ãƒ«ã® size_is の名前を変換した上でチェックする
     2834          # size_is の引数がマッチするかチェックする
     2835          # 内部セルの size_is をエクスポートする size_is とマッチするかチェックする
     2836          # 内部セルとエクスポートで名前を変えている可能性があるので、内部セルの size_is の名前を変換した上でチェックする
    29972837          if a.get_size_is then
    29982838            ### p "attr: get_size_is"
     
    30002840            if cj.get_port_decl.instance_of? Decl then
    30012841              ### p "attr: get_size_is 2"
    3002               # cj_size_is は、外部å
    3003 ¬é–‹ã•ã‚Œã‚‹ attr の size_is
     2842              # cj_size_is は、外部公開される attr の size_is
    30042843              cj_size_is = cj.get_port_decl.get_size_is
    30052844              if cj_size_is == nil then
     
    30102849              remain = exprs
    30112850              inner_to_export = {}
    3012                           ### exprs に含まれる識別子を抜き出し、対応する export される名前を探す
     2851                          ### exprs に含まれる識別子を抜き出し、対応する export される名前を探す
    30132852              while remain != "" && remain != nil
    30142853                ### p "remain ", remain
    3015                 remain =~ /([^\w]*)([_A-Za-z][\w\d]*)/   # 変数名文字列を取り出す
     2854                remain =~ /([^\w]*)([_A-Za-z][\w\d]*)/   # 変数名文字列を取り出す
    30162855                                if $2 == nil then
    30172856                                                break
     
    30202859                remain = $'
    30212860                ### p exprs, $1, $2, $'
    3022                 # size_is に含まれる変数は、composite で export されているか
     2861                # size_is に含まれる変数は、composite で export されているか
    30232862                cj2 = nil
    30242863                @compositecelltypejoin_list.get_items.each{ |cj2t|
     
    30332872                if cj2.get_port_decl.instance_of? Decl then
    30342873                   decl2 = cj2.get_port_decl
    3035                    # å†
    3036 éƒ¨ã®åå‰ã¨å¤–部の名前の対応関係を記憶
     2874                   # 内部の名前と外部の名前の対応関係を記憶
    30372875                   inner_to_export[arg_name] = decl2.get_name
    3038                 # else cj2 は Port (既にエラー)
     2876                # else cj2 は Port (既にエラー)
    30392877                end
    30402878              end
    3041               # å†
    3042 éƒ¨ã®åå‰ã‚’外部の名前で置換
     2879              # 内部の名前を外部の名前で置換
    30432880              inner_to_export.each{ |arg_name, exp_name|
    30442881                ### p "changing #{arg_name}=>#{exp_name}"
    30452882                # exprs.gsub!( Regexp.new("#{arg_name}[^0-9A-Za-z_]"), exp_name.to_s )
    3046                 exprs.gsub!( Regexp.new("#{arg_name}(\\W)"), exp_name.to_s+"\\1" )  # 文字列末尾にないケース
    3047                 exprs.gsub!( Regexp.new("#{arg_name}\\Z"), exp_name.to_s )          # 文字列末尾にあるケース
     2883                exprs.gsub!( Regexp.new("#{arg_name}(\\W)"), exp_name.to_s+"\\1" )  # 文字列末尾にないケース
     2884                exprs.gsub!( Regexp.new("#{arg_name}\\Z"), exp_name.to_s )          # 文字列末尾にあるケース
    30482885              }
    30492886              ### p "changed: #{exprs} #{cj_size_is.to_s}"
     
    30512888                cdl_error( "S1172 \'$1\' size_is argument mismatch with exporting one \'$2\'", a.get_name, cj.get_name )
    30522889              end
    3053             # else cj は Port (既にエラー)
     2890            # else cj は Port (既にエラー)
    30542891            end
    30552892          end
     
    30642901  end
    30652902
    3066   #=== Cell# 逆 require をチェックする
    3067   # 逆 require 指定された受け口に複数の結合がないかチェックする
    3068   # composite のå†
    3069 éƒ¨ã‚»ãƒ« (f_cloned=true) もチェックする
     2903  #=== Cell# 逆 require をチェックする
     2904  # 逆 require 指定された受け口に複数の結合がないかチェックする
     2905  # composite の内部セル (f_cloned=true) もチェックする
    30702906  def check_reverse_require
    3071     # celltype がなければチェックしない(既にエラー)
     2907    # celltype がなければチェックしない(既にエラー)
    30722908    return if @celltype == nil
    30732909    return if @b_defined == false
    30742910
    30752911    # p "check reverse require   #{@name}"
    3076     # 逆require 指定された受け口に複数の結合がないかチェック
     2912    # 逆require 指定された受け口に複数の結合がないかチェック
    30772913    @referenced_port_list.each{ |port,count|
    30782914      # p port.class, count
     
    30842920  end
    30852921
    3086   #=== Cell# require 呼び口の結合を行う
     2922  #=== Cell# require 呼び口の結合を行う
    30872923  # STAGE: S
    3088   #cp_name:: Symbol           : 呼び口名
    3089   #cell_or_t:: Celltype|Cell  : celltype の require の右辺で指定されたセルタイプまたはセル
    3090   #port::  Port               : celltype の Port オブジェクト
     2924  #cp_name:: Symbol           : 呼び口名
     2925  #cell_or_t:: Celltype|Cell  : celltype の require の右辺で指定されたセルタイプまたはセル
     2926  #port::  Port               : celltype の Port オブジェクト
    30912927  def set_require_join( cp_name, cell_or_ct, port )
    30922928
    3093     # set_require_join は2度呼び出される
    3094     # 2度目は post コードを生成した後       #####  いったん見合わせ(重複エラーを見逃す)
     2929    # set_require_join は2度呼び出される
     2930    # 2度目は post コードを生成した後       #####  いったん見合わせ(重複エラーを見逃す)
    30952931    # if @require_joined_list[ cp_name ] then
    30962932    #   return
     
    31092945      end
    31102946    else
    3111       # require: cell で指定
     2947      # require: cell で指定
    31122948      cell = cell_or_ct
    31132949      if @region.distance( cell.get_region ) == nil then
     
    31192955      cdl_warning( "W1003 $1 : require call port overridden in $2" , cp_name, @name )
    31202956    else
    3121       # require の join を生成(呼び口の結合)
     2957      # require の join を生成(呼び口の結合)
    31222958#      rhs = Expression.new( [ :OP_DOT, [ :IDENTIFIER, Token.new( cell.get_name, nil, nil, nil ) ],
    31232959      nsp = NamespacePath.new( cell.get_name, false, cell.get_namespace )
     
    31322968  end
    31332969
    3134   #=== Cell# Join の definition の設定とチェック
     2970  #=== Cell# Join の definition の設定とチェック
    31352971  # STAGE: S
    31362972  def set_definition_join
    3137     return if @celltype == nil    # 既にエラー:打ち切る
    3138     return if @b_defined == false # プロトタイプ宣言のみ
    3139     return if @b_checked == true  # 既に設定(チェック)済み
     2973    return if @celltype == nil    # 既にエラー:打ち切る
     2974    return if @b_defined == false # プロトタイプ宣言のみ
     2975    return if @b_checked == true  # 既に設定(チェック)済み
    31402976
    31412977    dbgPrint "set_definition_join in #{@name}\n"
    31422978
    3143     # relay allocator をたどって再å
    3144 ¥ã—ないよう、å
    3145 ˆé ­ã§ @b_checked を true にする
     2979    # relay allocator をたどって再入しないよう、先頭で @b_checked を true にする
    31462980    @b_checked = true
    31472981
     
    31492983      check_restrict_list
    31502984     
    3151       # compoiste セルのクローンされたものは、set_definition 不要
    3152       # å
    3153 ƒã® join は既に definition されている
    3154       # å
    3155 ƒã®ã‚»ãƒ«ã«ãŠã„て、代å
    3156 ¥ãƒã‚§ãƒƒã‚¯ã•ã‚Œã¦ã„るので、二重にチェック(through適用)されてしまう
     2985      # compoiste セルのクローンされたものは、set_definition 不要
     2986      # 元の join は既に definition されている
     2987      # 元のセルにおいて、代入チェックされているので、二重にチェック(through適用)されてしまう
    31572988      @join_list.get_items.each{ |join|
    31582989        dbgPrint " set_definition_join: checking #{@name}.#{join.get_name}\n"
     
    31602991          port = @celltype.find(join.get_name)
    31612992          join.get_array_member2.each { |am|
    3162             if am == nil then   # 未結合の場合、エラーチェックは check_join
     2993            if am == nil then   # 未結合の場合、エラーチェックは check_join
    31632994              if port && ! port.is_optional? then
    3164                 # テスト用にエラーメッセージ出力
     2995                # テスト用にエラーメッセージ出力
    31652996                # cdl_error( "TEMPORAL set_definition_join: uninitialized array member"  )
    31662997              end
     
    31763007    end
    31773008
    3178     # リレー join は through プラグイン生成後にしかできない
    3179     # through 後に結合å
    3180 ˆãŒå
    3181 ¥ã‚Œæ›¿ãˆã‚‰ã‚Œã‚‹
     3009    # リレー join は through プラグイン生成後にしかできない
     3010    # through 後に結合先が入れ替えられる
    31823011    create_relay_allocator_join
    31833012
    3184     # composite セルの展開
     3013    # composite セルの展開
    31853014    if ! @in_composite && ! @f_cloned && @celltype.instance_of?( CompositeCelltype ) then
    3186       # composite セルタイプå†
    3187 ã® composite は展開しない
    3188       # compoiste セル展開中の composite は展開しない (CompositeCelltype::expand å†
    3189 ã§å†å¸°çš„に expnad)
     3015      # composite セルタイプ内の composite は展開しない
     3016      # compoiste セル展開中の composite は展開しない (CompositeCelltype::expand 内で再帰的に expnad)
    31903017      expand
    31913018    end
    31923019  end
    31933020
    3194   #=== Cell# composite セルの展開
    3195   # このセルが composite セルタイプ
     3021  #=== Cell# composite セルの展開
     3022  # このセルが composite セルタイプ
    31963023  def expand
    31973024
     
    31993026    dbgPrint "=====    expanding   #{@name}     =====\n"
    32003027
    3201     # composite celltype の cell を展開
     3028    # composite celltype の cell を展開
    32023029    @cell_list, @cell_list2 = @celltype.expand( @name, @global_name, @NamespacePath, @join_list, @region, @plugin, @locale )
    32033030
    3204     # プロトタイプが参ç
    3205 §ã•ã‚Œã¦ã„る場合、子も参ç
    3206 §ã•ã‚Œã¦ã„ることにする
     3031    # プロトタイプが参照されている場合、子も参照されていることにする
    32073032    if @f_ref then
    32083033      dbgPrint "expand: set_f_ref\n"
     
    32113036  end
    32123037
    3213   #=== Cell#å†
    3214 éƒ¨ã‚»ãƒ«ã®å—け口添数最大値を設定
     3038  #=== Cell#内部セルの受け口添数最大値を設定
    32153039  def set_max_entry_port_inner_cell
    32163040    if @cell_list == nil then
     
    32203044    dbgPrint "set_max_entry_port_inner_cell name=#{@name} entry_array_max_subscript.len=#{@entry_array_max_subscript.length}\n"
    32213045
    3222     # プロトタイプ宣言で設定されていたものを反映する
     3046    # プロトタイプ宣言で設定されていたものを反映する
    32233047    @entry_array_max_subscript.each{ |port,name|
    32243048      dbgPrint "set_entry_inner_port_max_subscript( #{port}, #{name} )\n"
     
    32273051  end
    32283052
    3229   #=== Cell#restrict を追加
     3053  #=== Cell#restrict を追加
    32303054  def add_restrict( entry_name, func_name, region_name_list )
    32313055    if @restrict_list[ entry_name ] == nil then
     
    32603084            else
    32613085              cdl_info( "I9999 $1: restrict calling domain to $2, which is same domain as the cell locates", @name, rp.to_s )
    3262               # restrict を同じドメインを指定してもよいこととする (HRP3)
    3263               # KernelDoamin å†
    3264 ã®ã‚»ãƒ«ã«å¯¾ã—、KernelDomain に restrict している場合、
    3265               # 無所属経由で結合されているが、KernelDomain から呼出すことを想定した許可
     3086              # restrict を同じドメインを指定してもよいこととする (HRP3)
     3087              # KernelDoamin 内のセルに対し、KernelDomain に restrict している場合、
     3088              # 無所属経由で結合されているが、KernelDomain から呼出すことを想定した許可
    32663089            end
    32673090          else
     
    33113134
    33123135  #=== Cell#get_callable_regions( entry_name, func_name )
    3313   # func_name=nil の場合、entry_name の可否をチェック数る
    3314   # nil が返る場合、制限されていないことを意味する
     3136  # func_name=nil の場合、entry_name の可否をチェック数る
     3137  # nil が返る場合、制限されていないことを意味する
    33153138  def get_restricted_regions( entry_name, func_name )
    33163139    # p "get_restricted_regions #{@name}"
     
    33273150
    33283151  #=== Cell#has_ineffective_restrict_specifier
    3329   # restrict 指定子が指定されていて、参ç
    3330 §ã•ã‚Œã¦ã„ない場合 true
    3331   # 参ç
    3332 §ã¯ã€HRPSVCPlugin のみ
     3152  # restrict 指定子が指定されていて、参照されていない場合 true
     3153  # 参照は、HRPSVCPlugin のみ
    33333154  def has_ineffective_restrict_specifier
    33343155    if @restrict_list.length != 0 && @b_restrict_referenced == false then
     
    33583179      puts "entry array #{port.get_name}: max subscript=#{num}"
    33593180    }
    3360     if @cell_list then   # ここで @cell_list が nil なのは Bug
     3181    if @cell_list then   # ここで @cell_list が nil なのは Bug
    33613182      (indent+1).times { print "  " }
    33623183      puts "cloned cell list:"
     
    33823203          subscript = ""
    33833204        end
    3384         # アロケータ呼び口の結合を生成
     3205        # アロケータ呼び口の結合を生成
    33853206        (indent+2).times { print "  " }
    33863207        puts "#{cp_name}#{subscript} = #{a[4+1]}"
     
    34073228# @real_singleton:: bool : has singleton cell in this composite celltype
    34083229# @real_active:: bool : has active cell in this composite celltype
    3409 # @name_list:: NamedList item: Decl (attribute), Port エクスポート定義
     3230# @name_list:: NamedList item: Decl (attribute), Port エクスポート定義
    34103231# @internal_allocator_list:: [ [cell, internal_cp_name, port_name, func_name, param_name, ext_alloc_ent], ... ]
    3411 # @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
    3412 # @generate_list:: [ [ Symbol, String, Plugin ], ... ]   generate 文で追加された generate
     3232# @generate:: [ Symbol, String, Plugin ]  = [ PluginName, option, Plugin ] Plugin は生成後に追加される
     3233# @generate_list:: [ [ Symbol, String, Plugin ], ... ]   generate 文で追加された generate
    34133234
    34143235  @@nest_stack_index = -1
     
    34533274
    34543275    Namespace.new_compositecelltype( self )
    3455     set_namespace_path # @NamespacePath の設定
     3276    set_namespace_path # @NamespacePath の設定
    34563277
    34573278    @port_list = []
     
    34693290  # CompositeCelltype#end_of_parse
    34703291  def end_of_parse
    3471     # singleton に関するチェック
     3292    # singleton に関するチェック
    34723293    if @b_singleton && @real_singleton == nil then
    34733294      cdl_warning( "W1004 $1 : specified singleton but has no singleton in this celltype" , @name )
     
    34783299    end
    34793300
    3480     # active に関するチェック
     3301    # active に関するチェック
    34813302    if @b_active && @real_active == nil then
    34823303      cdl_error( "S1054 $1 : specified active but has no active in this celltype" , @name )
     
    34853306    end
    34863307
    3487     # @allocator_instance を設定する
     3308    # @allocator_instance を設定する
    34883309    @name_list.get_items.each{ |n|
    34893310      if n.instance_of? Port then
     
    34923313    }
    34933314
    3494     # リレーアロケータの entry 側
     3315    # リレーアロケータの entry 側
    34953316    @port_list.each{ |p|
    34963317      if p.get_port_type == :ENTRY then
     
    35063327      end
    35073328    }
    3508     # mikan relay が正しく抜けているかチェックされていない
    3509 
    3510     # callback 結合
     3329    # mikan relay が正しく抜けているかチェックされていない
     3330
     3331    # callback 結合
    35113332    @cell_list_in_composite.get_items.each{ |c|
    35123333      ct = c.get_celltype
     
    35163337    }
    35173338
    3518     # 意味解析
     3339    # 意味解析
    35193340    @cell_list_in_composite.get_items.each{ |c|
    35203341      c.set_definition_join
    35213342    }
    35223343
    3523     # cell の未結合の呼び口がないかチェック
     3344    # cell の未結合の呼び口がないかチェック
    35243345    @cell_list_in_composite.get_items.each{ |c|
    35253346      c.check_join
     
    35273348    }
    35283349
    3529     # 呼び口の結合について、export とå†
    3530 éƒ¨çµåˆã®ä¸¡æ–¹ãŒãªã„かチェック
    3531     # リレーアロケータ、å†
    3532 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã®è¨­å®š
     3350    # 呼び口の結合について、export と内部結合の両方がないかチェック
     3351    # リレーアロケータ、内部アロケータの設定
    35333352    @port_list.each{ |p|
    35343353      p.check_dup_init
    35353354    }
    35363355
    3537     # すべてのエクスポート定義に対応した呼び口、受け口、属性が存在するかチェック
     3356    # すべてのエクスポート定義に対応した呼び口、受け口、属性が存在するかチェック
    35383357    @name_list.get_items.each{ |n|
    35393358      if( @export_name_list.get_item( n.get_name ) == nil )then
     
    35423361    }
    35433362
    3544     # å†
    3545 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã‚’設定する
     3363    # 内部アロケータを設定する
    35463364    @internal_allocator_list.each{ |cell, cp_internal_name, port_name, fd_name, par_name, ext_alloc_ent|
    35473365      res = ext_alloc_ent.get_allocator_rhs_elements( :INTERNAL_ALLOC )
     
    35643382    }
    35653383
    3566     # composite プラグイン
     3384    # composite プラグイン
    35673385    if @generate then
    35683386      celltype_plugin
     
    35793397    cell.set_owner self  # Cell (in_omposite)
    35803398    @cell_list_in_composite.add_item( cell )
    3581     if cell.get_celltype then    # nil ならば、すでにセルタイプなしエラー
     3399    if cell.get_celltype then    # nil ならば、すでにセルタイプなしエラー
    35823400      if cell.get_celltype.is_singleton? then
    35833401        @real_singleton = cell
     
    36013419    @cell_list << cell
    36023420
    3603     # セルタイププラグインの適用
     3421    # セルタイププラグインの適用
    36043422    celltype_plugin_new_cell cell
    36053423  end
    36063424
    3607   #=== CompositeCelltype# CompositeCelltypeJoin を作成
     3425  #=== CompositeCelltype# CompositeCelltypeJoin を作成
    36083426  # STAGE: B
    3609   #export_name:: Symbol : 外部にå
    3610 ¬é–‹ã™ã‚‹åå‰
    3611   #internal_cell_name:: Symbol : å†
    3612 éƒ¨ã‚»ãƒ«å
    3613   #internal_cell_elem_name:: Symbol : å†
    3614 éƒ¨ã‚»ãƒ«ã®è¦ç´ åï¼ˆå‘¼ã³å£åã€å—け口名、属性名のいずれか)
    3615   #type::  :CALL, :ENTRY, :ATTRIBUTE のいずれか(構文要素としてあるべきもの)
    3616   #RETURN:: Decl | Port : エクスポート定義
    3617   # new_join は
    3618   #   cCall => composite.cCall;     (セルå†
    3619 )
    3620   #   attr = composite.attr;        (セルå†
    3621 )
    3622   #   composite.eEnt => cell2.eEnt; (セル外)
    3623   # の構文要素の出現に対して呼び出される
     3427  #export_name:: Symbol : 外部に公開する名前
     3428  #internal_cell_name:: Symbol : 内部セル名
     3429  #internal_cell_elem_name:: Symbol : 内部セルの要素名(呼び口名、受け口名、属性名のいずれか)
     3430  #type::  :CALL, :ENTRY, :ATTRIBUTE のいずれか(構文要素としてあるべきもの)
     3431  #RETURN:: Decl | Port : エクスポート定義
     3432  # new_join は
     3433  #   cCall => composite.cCall;     (セル内)
     3434  #   attr = composite.attr;        (セル内)
     3435  #   composite.eEnt => cell2.eEnt; (セル外)
     3436  # の構文要素の出現に対して呼び出される
    36243437  def new_join( export_name, internal_cell_name,
    36253438                 internal_cell_elem_name, type )
     
    36343447
    36353448    celltype = cell.get_celltype
    3636     return if celltype == nil   # celltype == nil ならすでにエラー
    3637 
    3638     # å†
    3639 éƒ¨ã‚»ãƒ«ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—から対応要素を探す
    3640     # このメソッドは、構文上、呼び口、受け口、属性が記述できる箇所から呼出される
    3641     # 構文上の呼出し位置(記述位置)と、要素が対応したものかチェック
     3449    return if celltype == nil   # celltype == nil ならすでにエラー
     3450
     3451    # 内部セルのセルタイプから対応要素を探す
     3452    # このメソッドは、構文上、呼び口、受け口、属性が記述できる箇所から呼出される
     3453    # 構文上の呼出し位置(記述位置)と、要素が対応したものかチェック
    36423454    obj = celltype.find( internal_cell_elem_name )
    36433455    if obj.instance_of?( Decl ) then
     
    36473459      elsif type != :ATTRIBUTE then
    36483460        cdl_error( "S1059 \'$1\' : exporting attribute. write in cell or use \'=\' to export attribute" , export_name )
    3649         # return 次のエラーを避けるために処理続行し、付け加えてみる
     3461        # return 次のエラーを避けるために処理続行し、付け加えてみる
    36503462      end
    36513463    elsif obj.instance_of?( Port ) then
    36523464      if obj.get_port_type != type then
    36533465        cdl_error( "S1060 \'$1\' : port type mismatch. $2 type is allowed here." , export_name, type )
    3654         # return 次のエラーを避けるために処理続行し、付け加えてみる
     3466        # return 次のエラーを避けるために処理続行し、付け加えてみる
    36553467      end
    36563468    else
     
    36603472    end
    36613473
    3662     # エクスポート定義と一致するかどうかチェック
     3474    # エクスポート定義と一致するかどうかチェック
    36633475    obj2 = @name_list.get_item( export_name )
    36643476    if( obj2 == nil )then
     
    36763488        elsif obj.get_signature != obj2.get_signature then
    36773489          if obj.get_signature != nil && obj2.get_signature != nil then
    3678             # nil ならば既にエラーなので報告しない
     3490            # nil ならば既にエラーなので報告しない
    36793491            cdl_error( "S1066 $1 : signature \'$2\' mismatch with previous definition \'$3\'" , export_name, obj.get_signature.get_name, obj2.get_signature.get_name )
    36803492          end
     
    37053517    if obj.instance_of?( Decl ) then
    37063518      # attribute
    3707 #      # å†
    3708 éƒ¨ã‹ã‚‰å¤–部へ複数の結合がないかチェック
     3519#      # 内部から外部へ複数の結合がないかチェック
    37093520#      found = false
    37103521#      @attr_list.each{ |a|
     
    37193530    else
    37203531      # call/entry port
    3721 #      # å†
    3722 éƒ¨ã‹ã‚‰å¤–部へ複数の結合がないかチェック
     3532#      # 内部から外部へ複数の結合がないかチェック
    37233533#      found = false
    37243534#      @port_list.each{ |port|
     
    37333543    end
    37343544
    3735     # join を @export_name_list に登録(重複チェックとともに,後で行われる CompositeCelltypeJoin の clone に備える)
     3545    # join を @export_name_list に登録(重複チェックとともに,後で行われる CompositeCelltypeJoin の clone に備える)
    37363546    if obj.instance_of?( Decl ) && @export_name_list.get_item( export_name ) then
    3737       # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。
     3547      # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。
    37383548    elsif obj.instance_of?( Port ) && obj.get_port_type == :CALL && @export_name_list.get_item( export_name ) then
    3739       # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。
     3549      # 既に存在する。追加しない。新仕様では、@export_name_list に同じ名前が含まれることがある。
    37403550    else
    37413551      @export_name_list.add_item( join )
    37423552    end
    37433553
    3744     # export するポートに含まれる send/receive パラメータのアロケータ(allocator)呼び口をセルと結合
     3554    # export するポートに含まれる send/receive パラメータのアロケータ(allocator)呼び口をセルと結合
    37453555    if obj2.instance_of? Port then
    37463556      obj2.each_param{ |port, fd, par|
    3747         case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
     3557        case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
    37483558        when :SEND, :RECEIVE
    3749           cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
    3750           #            ポート名         é–¢æ•°å         ãƒ‘ラメータ名
     3559          cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
     3560          #            ポート名         関数名         パラメータ名
    37513561          cp_internal_name = :"#{internal_cell_elem_name}_#{fd.get_name}_#{par.get_name}"
    37523562
    3753           # リレーアロケータ or å†
    3754 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿æŒ‡å®šãŒãªã•ã‚Œã¦ã„る場合、アロケータ呼び口を追加しない
    3755           # この時点では get_allocator_instance では得られないため tmp を得る
     3563          # リレーアロケータ or 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない
     3564          # この時点では get_allocator_instance では得られないため tmp を得る
    37563565          if port.get_allocator_instance_tmp then
    37573566            found = false
     
    37613570
    37623571                if s[0] == :INTERNAL_ALLOC then
    3763                   # å†
    3764 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã®å ´åˆ    # mikan これはå†
    3765 éƒ¨ã®ã‚»ãƒ«ã«ç›´çµã™ã‚‹ã€‚外部のポートに改めるべき
     3572                  # 内部アロケータの場合    # mikan これは内部のセルに直結する。外部のポートに改めるべき
    37663573                  @internal_allocator_list << [ cell, cp_internal_name, port.get_name, fd.get_name, par.get_name, s[3] ]
    37673574                end
     
    37733580          end
    37743581
    3775           # 外部アロケータの場合
     3582          # 外部アロケータの場合
    37763583          new_join( cp_name, internal_cell_name, cp_internal_name, :CALL )
    37773584        end
     
    37793586    end
    37803587
    3781     # エクスポート定義を返す
     3588    # エクスポート定義を返す
    37823589    return obj2
    37833590  end
     
    38013608    @name_list.add_item port
    38023609
    3803     # export するポートに含まれる send/receive パラメータのアロケータ呼び口の export を生成してポートに追加
    3804     # この時点ではå†
    3805 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã‹ã©ã†ã‹åˆ¤æ–­ã§ããªã„ので、とりあえず生成しておく
     3610    # export するポートに含まれる send/receive パラメータのアロケータ呼び口の export を生成してポートに追加
     3611    # この時点では内部アロケータかどうか判断できないので、とりあえず生成しておく
    38063612    port.each_param { |port, fd, par|
    3807       case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
     3613      case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
    38083614      when :SEND, :RECEIVE
    3809         #### リレーアロケータ or å†
    3810 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿æŒ‡å®šãŒãªã•ã‚Œã¦ã„る場合、アロケータ呼び口を追加しない
    3811         # å†
    3812 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿æŒ‡å®šãŒãªã•ã‚Œã¦ã„る場合、アロケータ呼び口を追加しない
    3813         # この時点では get_allocator_instance では得られないため tmp を得る
     3615        #### リレーアロケータ or 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない
     3616        # 内部アロケータ指定がなされている場合、アロケータ呼び口を追加しない
     3617        # この時点では get_allocator_instance では得られないため tmp を得る
    38143618        if port.get_allocator_instance_tmp then
    38153619          found = false
     
    38263630
    38273631        if par.get_allocator then
    3828           cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
    3829           #           ãƒãƒ¼ãƒˆå          関数名         ãƒ‘ラメータ名
    3830           alloc_sig_path = [ par.get_allocator.get_name ]  # mikan Namespace アロケータ呼び口のシグニチャ
    3831           array_size = port.get_array_size            # 呼び口または受け口é
    3832 åˆ—のサイズ
    3833           created_port = Port.new( cp_name, alloc_sig_path, :CALL, array_size ) # 呼び口を生成
     3632          cp_name = :"#{port.get_name}_#{fd.get_name}_#{par.get_name}"     # アロケータ呼び口の名前
     3633          #           ポート名          関数名         パラメータ名
     3634          alloc_sig_path = [ par.get_allocator.get_name ]  # mikan Namespace アロケータ呼び口のシグニチャ
     3635          array_size = port.get_array_size            # 呼び口または受け口配列のサイズ
     3636          created_port = Port.new( cp_name, alloc_sig_path, :CALL, array_size ) # 呼び口を生成
    38343637          created_port.set_allocator_port( port, fd, par )
    38353638          if port.is_omit? then
    38363639            created_port.set_omit
    38373640          end
    3838           new_port( created_port )           # セルタイプに新しい呼び口を追加
     3641          new_port( created_port )           # セルタイプに新しい呼び口を追加
    38393642        # else
    38403643        #   already error
     
    38533656    attribute.each { |a|
    38543657      a.set_owner self   # Decl (CompositeCelltype)
    3855       # V1.1.0.10 composite の attr の size_is は可となった
     3658      # V1.1.0.10 composite の attr の size_is は可となった
    38563659      # if a.get_size_is then
    38573660      #  cdl_error( "S1070 $1: size_is pointer cannot be exposed for composite attribute" , a.get_name )
     
    38643667  end
    38653668
    3866   #=== CompositeCelltype# 逆require の結合を生成する
     3669  #=== CompositeCelltype# 逆require の結合を生成する
    38673670  def create_reverse_require_join cell
    38683671    @name_list.get_items.each{ |n|
     
    38893692    return @name_list.get_item( name )
    38903693
    3891     # 従来仕様
     3694    # 従来仕様
    38923695#    cj = @export_name_list.get_item( name )
    38933696#p "#{name}, #{cj.get_port_decl}"
     
    38993702  end
    39003703
    3901   #=== CompositeCelltype# export する CompositeCelltypeJoin を得る
     3704  #=== CompositeCelltype# export する CompositeCelltypeJoin を得る
    39023705  #name:: string:
    3903   # attribute の場合、同じ名前に対し複数存在する可能性があるが、最初のものしか返さない
     3706  # attribute の場合、同じ名前に対し複数存在する可能性があるが、最初のものしか返さない
    39043707  def find_export name
    39053708    return @export_name_list.get_item( name )
    39063709  end
    39073710
    3908   #=== CompositeCelltype# composite celltype の cell を展開
    3909   #name:: string: Composite cell の名前
    3910   #global_name:: string: Composite cell の global name (C 言語名)
    3911   #join_list:: NamedList : Composite cell に対する Join の NamedList
     3711  #=== CompositeCelltype# composite celltype の cell を展開
     3712  #name:: string: Composite cell の名前
     3713  #global_name:: string: Composite cell の global name (C 言語名)
     3714  #join_list:: NamedList : Composite cell に対する Join の NamedList
    39123715  #RETURN:
    39133716  # [ { name => cell }, [ cell, ... ] ]
    3914   #  戻り値 前は 名前⇒cloneされたå†
    3915 éƒ¨ã‚»ãƒ«ã€å¾Œã‚ã¯ composite の出現順のリスト
     3717  #  戻り値 前は 名前⇒cloneされた内部セル、後ろは composite の出現順のリスト
    39163718  def expand( name, global_name, namespacePath, join_list, region, plugin, locale )
    39173719
     
    39223724    }
    39233725 
    3924     # 展開で clone されたセルのリスト、右辺は Cell (composite の場合 composite な cell の clone)
     3726    # 展開で clone されたセルのリスト、右辺は Cell (composite の場合 composite な cell の clone)
    39253727    clone_cell_list = {}
    39263728    clone_cell_list2 = []
    39273729    clone_cell_list3 = {}
    39283730
    3929     #  composite å†
    3930 éƒ¨ã®ã™ã¹ã¦ã® cell について
     3731    #  composite 内部のすべての cell について
    39313732    @cell_list_in_composite.get_items.each { |c|
    39323733
     
    39343735      dbgPrint "expand : cell #{c.get_name}\n"
    39353736
    3936       # Join のé
    3937 åˆ—
     3737      # Join の配列
    39383738      ja = []
    39393739
    3940       # CompositeCelltype が export する呼び口、受け口、属性のリストについて
     3740      # CompositeCelltype が export する呼び口、受け口、属性のリストについて
    39413741      # @export_name_list.get_items.each{ |cj|  # cj: CompositeCelltypeJoin
    3942       # 新仕様では、@export_name_list にå
    3943 ¥ã£ã¦ã„ない attr がありうる
     3742      # 新仕様では、@export_name_list に入っていない attr がありうる
    39443743      (@port_list+@attr_list).each{ |cj|        # cj: CompositeCelltypeJoin
    39453744
     
    39473746        dbgPrint "        cj : #{cj.get_name}\n"
    39483747
    3949         # CompositeCelltypeJoin (export) の対象セルか?
     3748        # CompositeCelltypeJoin (export) の対象セルか?
    39503749        if cj.match?( c ) then
    39513750
    3952           # 対象セルå†
    3953 ã® CompositeCelltype の export する Join (attribute または call port)
     3751          # 対象セル内の CompositeCelltype の export する Join (attribute または call port)
    39543752          j = join_list.get_item( cj.get_name )
    39553753
     
    39623760
    39633761          if j then
    3964             # 呼び口、属性の場合
    3965             #  ComositeCell 用のもの(j) を対象セル用に clone (@through_list もコピーされる)
     3762            # 呼び口、属性の場合
     3763            #  ComositeCell 用のもの(j) を対象セル用に clone (@through_list もコピーされる)
    39663764            # p "expand: cloning Join #{j.get_name} #{@name} #{name}"
    39673765            jc = j.clone_for_composite( @name, name, locale )
     
    39713769            # p "cn #{jc.get_name} #{cj.get_cell_elem_name}"
    39723770
    3973             # 対象セルの呼び口または属性の名前に変更
     3771            # 対象セルの呼び口または属性の名前に変更
    39743772            jc.change_name( cj.get_cell_elem_name )
    39753773
    3976             # 対象セルに対する Join のé
    3977 åˆ—
     3774            # 対象セルに対する Join の配列
    39783775            ja << jc
    39793776          end
     
    39873784      dbgPrint "expand : clone #{name}_#{c.get_name}\n"
    39883785
    3989       # セルの clone を生成
     3786      # セルの clone を生成
    39903787#      clone_cell_list[ "#{name}_#{c.get_name}" ] =  c.clone_for_composite( name, global_name, ja )
    39913788      c2 =  c.clone_for_composite( name, global_name, namespacePath, ja, @name, region, plugin, locale )
     
    39983795    clone_cell_list.each { |nm,c|
    39993796      dbgPrint "  cloned: #{nm} = #{c.get_global_name}\n"
    4000       # join の owner を clone されたセルに変更する V1.1.0.25
     3797      # join の owner を clone されたセルに変更する V1.1.0.25
    40013798      c.get_join_list.get_items.each{ |j|
    40023799        j.set_cloned( clone_cell_list[ "#{c.get_local_name}" ] )
     
    40113808  end
    40123809
    4013   #=== CompositeCelltype 指定子リストの設定
     3810  #=== CompositeCelltype 指定子リストの設定
    40143811  def set_specifier_list( spec_list )
    40153812    return if spec_list == nil
     
    40513848
    40523849  def get_var_list
    4053     []   # 空のé
    4054 åˆ—を返す
     3850    []   # 空の配列を返す
    40553851  end
    40563852
     
    40603856
    40613857  #== CompositeCelltype#get_real_celltype
    4062   # port_name に接続されているå†
    4063 éƒ¨ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—ã‚’å¾—ã‚‹
     3858  # port_name に接続されている内部のセルタイプを得る
    40643859  def get_real_celltype( port_name )
    40653860    cj = find_export port_name
     
    40723867  end
    40733868
    4074   #== CompositeCelltype# generate 指定子のæƒ
    4075 å ±
    4076   # CompositeCelltype には generate が指定できないので nil を返す
    4077   # Celltype::@generate を参ç
    4078 §ã®ã“と
     3869  #== CompositeCelltype# generate 指定子の情報
     3870  # CompositeCelltype には generate が指定できないので nil を返す
     3871  # Celltype::@generate を参照のこと
    40793872  def get_celltype_plugin
    40803873    nil
     
    40893882  end
    40903883
    4091   #=== CompositeCelltype# アクティブではない
    4092   # active ではないに加え、å
    4093 ¨ã¦ã®å†
    4094 éƒ¨ã‚»ãƒ«ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—が inactive の場合に inactive
    4095   # (å†
    4096 éƒ¨ã®ã‚»ãƒ«ãŒ active または factory を持っている)
     3884  #=== CompositeCelltype# アクティブではない
     3885  # active ではないに加え、全ての内部セルのセルタイプが inactive の場合に inactive
     3886  # (内部のセルが active または factory を持っている)
    40973887  def is_inactive?
    40983888    if @b_active == false then
    40993889      @cell_list_in_composite.get_items.each{ |c|
    41003890        if c.get_celltype && c.get_celltype.is_inactive? == false then
    4101           # c.get_celltype == nil の場合はセルタイプ未定義ですでにエラー
     3891          # c.get_celltype == nil の場合はセルタイプ未定義ですでにエラー
    41023892          return false
    41033893        end
     
    41393929
    41403930
    4141 #== 構文要素:口を表すクラス(セルタイプの呼び口、受け口)
     3931#== 構文要素:口を表すクラス(セルタイプの呼び口、受け口)
    41423932class Port < BDNode
    41433933# @name::  str
     
    41453935# @port_type::  :CALL, :ENTRY
    41463936# @array_size:: nil: not array, "[]": sizeless, Integer: sized array
    4147 # @reverse_require_cell_path:: NamespacePath :     é€†require呼びå
    4148 ƒã‚»ãƒ«  mikan namespace (呼び口のみ指定可能)
    4149 # @reverse_require_callport_name:: Symbol:  逆require呼びå
    4150 ƒã‚»ãƒ«ã®å‘¼ã³å£å
     3937# @reverse_require_cell_path:: NamespacePath :     逆require呼び元セル  mikan namespace (呼び口のみ指定可能)
     3938# @reverse_require_callport_name:: Symbol:  逆require呼び元セルの呼び口名
    41513939#
    4152 # set_allocator_port によって設定される.設定された場合、このポートはアロケータポートである。
    4153 # @allocator_port:: Port : この呼び口ができるå
    4154 ƒã¨ãªã£ãŸå‘¼ã³å£ã¾ãŸã¯å—け口
    4155 # @allocator_func_decl:: Decl : この呼び口ができるå
    4156 ƒã¨ãªã£ãŸå‘¼ã³å£ã¾ãŸã¯å—け口の関数
    4157 # @allocator_param_decl:: ParamDecl : この呼び口ができるå
    4158 ƒã¨ãªã£ãŸå‘¼ã³å£ã¾ãŸã¯å—け口のパラメータ
     3940# set_allocator_port によって設定される.設定された場合、このポートはアロケータポートである。
     3941# @allocator_port:: Port : この呼び口ができる元となった呼び口または受け口
     3942# @allocator_func_decl:: Decl : この呼び口ができる元となった呼び口または受け口の関数
     3943# @allocator_param_decl:: ParamDecl : この呼び口ができる元となった呼び口または受け口のパラメータ
    41593944#
    4160 # set_specifier によって設定される(
     3945# set_specifier によって設定される(
    41613946# @allocator_instance:: Hash : {"func_param" => [ :RELAY_ALLOC, func_name, param_name, rhs_cp_name, rhs_func_name, rhs_param_name ]}
    41623947#                                               [:INTERNAL_ALLOC, func_name, param_name, rhs_ep_name ]
     
    41643949#                                                                                    function    parameter   rhs
    41653950#
    4166 # @b_require:: bool : require により生成された call port の場合 true
    4167 # @b_has_name:: bool : require : 名前ありのリクワイア呼び口
    4168 # @b_inline:: bool : entry port のみ
    4169 # @b_omit:: bool : omit 指定子が指定された (call port のみ)
    4170 # @b_optional:: bool : call port のみ
    4171 # @b_ref_desc:: bool :  ref_desc キーワードが指定された
    4172 # @b_dynamic:: bool :  dynamic キーワードが指定された (呼び口のみ)
     3951# @b_require:: bool : require により生成された call port の場合 true
     3952# @b_has_name:: bool : require : 名前ありのリクワイア呼び口
     3953# @b_inline:: bool : entry port のみ
     3954# @b_omit:: bool : omit 指定子が指定された (call port のみ)
     3955# @b_optional:: bool : call port のみ
     3956# @b_ref_desc:: bool :  ref_desc キーワードが指定された
     3957# @b_dynamic:: bool :  dynamic キーワードが指定された (呼び口のみ)
    41733958#
    41743959# optimize::
    4175 # @celltype:: 属するセルタイプ
     3960# @celltype:: 属するセルタイプ
    41763961#
    4177 # :CALL の場合の最適化
    4178 # @b_VMT_useless:: bool                     # VMT 関数テーブルを使用しない
    4179 # @b_skelton_useless:: bool                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    4180 # @b_cell_unique:: bool                     # 呼びå
    4181 ˆã¯å”¯ä¸€ã®ã‚»ãƒ«
    4182 # @only_callee_port:: Port                  # 唯一の呼びå
    4183 ˆãƒãƒ¼ãƒˆ
    4184 # @only_callee_cell:: Cell                  # 唯一の呼びå
    4185 ˆã‚»ãƒ« (@b_PEPDES_in_CB_useless = true の時有効)
     3962# :CALL の場合の最適化
     3963# @b_VMT_useless:: bool                     # VMT 関数テーブルを使用しない
     3964# @b_skelton_useless:: bool                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     3965# @b_cell_unique:: bool                     # 呼び先は唯一のセル
     3966# @only_callee_port:: Port                  # 唯一の呼び先ポート
     3967# @only_callee_cell:: Cell                  # 唯一の呼び先セル (@b_PEPDES_in_CB_useless = true の時有効)
    41863968#
    4187 # :ENTRY の場合の最適化(呼び口最適化と同じ変数名を使用)
    4188 # @b_VMT_useless:: bool                     # VMT 関数テーブルが不要
    4189 # @b_skelton_useless:: bool                 # スケルトン関数不要
     3969# :ENTRY の場合の最適化(呼び口最適化と同じ変数名を使用)
     3970# @b_VMT_useless:: bool                     # VMT 関数テーブルが不要
     3971# @b_skelton_useless:: bool                 # スケルトン関数不要
    41903972
    41913973  def initialize( name, sig_path, port_type, array_size = nil, reverse_require_cell_path = nil, reverse_require_entry_port_name = nil )
     
    42033985        @array_size = array_size.eval_const(nil)
    42043986      else
    4205         @array_size = array_size   # これはアロケータ呼び口の場合(å
    4206 ƒã®å‘¼ã³å£ã§æ—¢ã«è©•ä¾¡æ¸ˆã¿ï¼‰
     3987        @array_size = array_size   # これはアロケータ呼び口の場合(元の呼び口で既に評価済み)
    42073988      end
    42083989      if @array_size == nil then
     
    42194000    object = Namespace.find( sig_path )    #1
    42204001    if object == nil then
    4221       # mikan signature の名前が不完å
    4222 ¨
     4002      # mikan signature の名前が不完全
    42234003      cdl_error( "S1075 \'$1\' signature not found" , sig_path )
    42244004    elsif ! object.instance_of?( Signature ) then
    4225       # mikan signature の名前が不完å
    4226 ¨
     4005      # mikan signature の名前が不完全
    42274006      cdl_error( "S1076 \'$1\' not signature" , sig_path )
    42284007    else
     
    42314010    end
    42324011
    4233     # 逆require
     4012    # require
    42344013    @reverse_require_cell_path       = nil
    42354014    @reverse_require_entry_port_name = nil
     
    42414020        @reverse_require_entry_port_name = reverse_require_entry_port_name
    42424021
    4243         # 受け口é
    4244 åˆ—か?
     4022        # 受け口配列か?
    42454023        if array_size then
    42464024          cdl_error( "S1153 $1: cannot be entry port array for fixed join port", @name )
    42474025        end
    42484026
    4249         # 呼び口のセルタイプを探す
     4027        # 呼び口のセルタイプを探す
    42504028        ct_or_cell = Namespace.find( @reverse_require_cell_path )  #1
    42514029        if ct_or_cell.instance_of? Cell then
     
    42624040
    42634041        if ct == nil then
    4264           return    # 既にエラー
    4265         end
    4266 
    4267         # 添え字なしの呼び口é
    4268 åˆ—か?
     4042          return    # 既にエラー
     4043        end
     4044
     4045        # 添え字なしの呼び口配列か?
    42694046        port = ct.find( @reverse_require_entry_port_name )
    42704047        if port == nil || port.get_port_type != :CALL
     
    42894066  end
    42904067
    4291   #=== Port#最適化に関する変数をリセットする
    4292   # Region ごとに最適化のやりなおしをするため、リセットする
     4068  #=== Port#最適化に関する変数をリセットする
     4069  # Region ごとに最適化のやりなおしをするため、リセットする
    42934070  def reset_optimize
    42944071    if @port_type == :CALL then
    42954072      # call port optimize
    4296       @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
    4297       @b_skelton_useless = false                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    4298       @b_cell_unique = false                     # 唯一の呼びå
    4299 ˆã‚»ãƒ«
    4300       @only_callee_port = nil                    # 唯一の呼びå
    4301 ˆãƒãƒ¼ãƒˆ
    4302       @only_callee_cell = nil                    # 唯一の呼びå
    4303 ˆã‚»ãƒ«
     4073      @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
     4074      @b_skelton_useless = false                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     4075      @b_cell_unique = false                     # 唯一の呼び先セル
     4076      @only_callee_port = nil                    # 唯一の呼び先ポート
     4077      @only_callee_cell = nil                    # 唯一の呼び先セル
    43044078    else
    43054079      # entry port optimize
    43064080      if $unopt || $unopt_entry then
    4307         # 最適化なし
    4308         @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
    4309         @b_skelton_useless = false                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     4081        # 最適化なし
     4082        @b_VMT_useless = false                     # VMT 不要 (true の時 VMT を介することなく呼出す)
     4083        @b_skelton_useless = false                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    43104084      else
    4311         # 最適化あり
    4312         @b_VMT_useless = true                      # VMT 不要 (true の時 VMT を介することなく呼出す)
    4313         @b_skelton_useless = true                  # スケルトン関数不要   (true の時、受け口関数を呼出す)
     4085        # 最適化あり
     4086        @b_VMT_useless = true                      # VMT 不要 (true の時 VMT を介することなく呼出す)
     4087        @b_skelton_useless = true                  # スケルトン関数不要   (true の時、受け口関数を呼出す)
    43144088      end
    43154089    end
     
    43404114  end
    43414115
    4342   #=== Port# アロケータポートの設定
    4343   #port:: Port : send/receive のあった呼び口または受け口
    4344   #fd:: Decl : 関数の declarator
    4345   #par:: ParamDecl : send/receive のあった引数
    4346   # この呼び口が生成されるもとになった呼び口または受け口のæƒ
    4347 å ±ã‚’設定
     4116  #=== Port# アロケータポートの設定
     4117  #port:: Port : send/receive のあった呼び口または受け口
     4118  #fd:: Decl : 関数の declarator
     4119  #par:: ParamDecl : send/receive のあった引数
     4120  # この呼び口が生成されるもとになった呼び口または受け口の情報を設定
    43484121  def set_allocator_port( port, fd, par )
    43494122    @allocator_port = port
     
    43774150  end
    43784151
    4379   #=== Port# require 呼び口が名前を持つ?
    4380   # require 限定
     4152  #=== Port# require 呼び口が名前を持つ?
     4153  # require 限定
    43814154  def has_name?
    43824155    @b_has_name
     
    43914164  end
    43924165
    4393   #=== Port# omit 指定されている?
     4166  #=== Port# omit 指定されている?
    43944167  def is_omit?
    43954168    @b_omit || ( @signature && @signature.is_empty? )
     
    44004173  end
    44014174
    4402   def set_VMT_useless                     # VMT 関数テーブルを使用しない
     4175  def set_VMT_useless                     # VMT 関数テーブルを使用しない
    44034176   @b_VMT_useless = true
    44044177  end
    44054178
    4406   def set_skelton_useless                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     4179  def set_skelton_useless                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    44074180    @b_skelton_useless = true
    44084181  end
    44094182
    4410   def set_cell_unique                     # 呼びå
    4411 ˆã‚»ãƒ«ã¯ä¸€ã¤ã ã‘
     4183  def set_cell_unique                     # 呼び先セルは一つだけ
    44124184    @b_cell_unique = true
    44134185  end
    44144186
    4415   #=== Port# 呼び口/受け口の指定子の設定
    4416   # inline, allocator の指定
     4187  #=== Port# 呼び口/受け口の指定子の設定
     4188  # inline, allocator の指定
    44174189  def set_specifier spec_list
    44184190    spec_list.each { |s|
     
    44674239        dyn_ref = "ref_desc"
    44684240      end
    4469       if @b_omit then     # is_omit? は is_empty? も含んでいるので使えない
     4241      if @b_omit then     # is_omit? は is_empty? も含んでいるので使えない
    44704242        cdl_error( "S9999 omit cannot be specified with $1", dyn_ref  )
    44714243      elsif @signature && @signature.is_empty? then
     
    44804252  end
    44814253
    4482   #=== Port# リレーアロケータ、å†
    4483 éƒ¨ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã‚’設定
    4484   # 呼び口の前方参ç
    4485 §å¯èƒ½ãªã‚ˆã†ã«ã€ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の解釈の最後で行う
     4254  #=== Port# リレーアロケータ、内部アロケータのインスタンスを設定
     4255  # 呼び口の前方参照可能なように、セルタイプの解釈の最後で行う
    44864256  def set_allocator_instance
    44874257    if @allocator_instance_tmp == nil then
     
    44964266      case alloc_type
    44974267      when :INTERNAL_ALLOC
    4498         if ! @owner.instance_of? CompositeCelltype then # ミスを防ぐために composite でなければとした
    4499           cdl_error( "S1081 self allocator not supported yet"  )   # mikan これはサポートされているはず。要調査 12/1/15
     4268        if ! @owner.instance_of? CompositeCelltype then # ミスを防ぐために composite でなければとした
     4269          cdl_error( "S1081 self allocator not supported yet"  )   # mikan これはサポートされているはず。要調査 12/1/15
    45004270          next
    45014271        end
     
    45044274        # OK
    45054275      when :NORMAL_ALLOC
    4506         # ここへ来るのは composite の受け口で右辺が "eEnt.func.param" 形式で指定されていた場合
     4276        # ここへ来るのは composite の受け口で右辺が "eEnt.func.param" 形式で指定されていた場合
    45074277        cdl_error( "S1174 $1 not suitable for lhs, suitable lhs: 'func.param'", "#{ai[1]}.#{ai[3]}.#{ai[4]}" )
    45084278        next
     
    45114281      end
    45124282
    4513       # '=' 左辺(func_name,param_name)は実在するか?
    4514       if @signature then       # signature = nil なら既にエラー
     4283      # '=' 左辺(func_name,param_name)は実在するか?
     4284      if @signature then       # signature = nil なら既にエラー
    45154285        fh = @signature.get_function_head( ai[1] )
    45164286        if fh == nil then
     
    45204290        decl = fh.get_declarator
    45214291        if ! decl.is_function? then
    4522           next   # 既にエラー
     4292          next   # 既にエラー
    45234293        end
    45244294        paramdecl = decl.get_type.get_paramlist.find( ai[2] )
     
    45374307      end
    45384308
    4539       # 重複指定がないか?
     4309      # 重複指定がないか?
    45404310      if @allocator_instance[ "#{@name}_#{ai[1]}_#{ai[2]}" ] then
    45414311        cdl_error( "S1085 duplicate allocator specifier for \'$1_$2\'" , ai[1], ai[2] )
    45424312      end
    45434313
    4544       # 右辺のチェック
     4314      # 右辺のチェック
    45454315      case alloc_type
    45464316      when :INTERNAL_ALLOC
     
    45524322        end
    45534323
    4554         ep_name = ele[1]   # アロケータ受け口名
     4324        ep_name = ele[1]   # アロケータ受け口名
    45554325        ep = @owner.find ep_name.get_path[0]  # mikan "a::b"
    45564326        if ep == nil || ! ep.instance_of?( Port ) || ep.get_port_type != :ENTRY || ! ep.get_signature.is_allocator? then
    45574327          cdl_error( "S1175 $1 not found or not allocator entry port for $2" , ep_name, ai[1] )
    45584328        end
    4559         # 右辺チェック終わり
     4329        # 右辺チェック終わり
    45604330        # ai2 = [ :INTERNAL_ALLOC, func_name, param_name, rhs_ep_name ]
    45614331        ai2 = [ ai[0], ai[1], ai[2], ep_name ]
     
    45694339          #    ele[0]    ele[1][0]  ele[1][1][0]  ele[1][1][1]        ele[1][2]    ele[2]
    45704340          #      name_space_path.Token(1).Token(2) === call_port.func.param
    4571           #  mikan Expression#analyze_cell_join_expression の変種を作成して置き換えるべき
     4341          #  mikan Expression#analyze_cell_join_expression の変種を作成して置き換えるべき
    45724342
    45734343          cdl_error( "S1176 rhs not in 'call_port.func.param' form for for $1_$2" , ai[1], ai[2] )   # S1086
     
    45754345        end
    45764346        func_name = ele[1][2]; cp_name = ele[1][1][1].get_name; param_name = ele[2].to_sym
    4577         cp = @owner.find cp_name    # リレーするå
    4578 ˆã®å‘¼ã³å£
     4347        cp = @owner.find cp_name    # リレーする先の呼び口
    45794348        if cp then
    4580 # mikan cp が呼び口であることのチェック(属性の場合もある)
    4581 # mikan 受け口から受け口へのリレーへの対応 (呼び口から呼び口へのリレーはありえない)  <=== 文法にかかわる事é 
    4582 ï¼ˆå‘¼ã³å£å´ã§ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ãŒæ±ºå®šã•ã‚Œã‚‹ï¼‰
     4349# mikan cp が呼び口であることのチェック(属性の場合もある)
     4350# mikan 受け口から受け口へのリレーへの対応 (呼び口から呼び口へのリレーはありえない)  <=== 文法にかかわる事項(呼び口側でアロケータが決定される)
    45834351          sig = cp.get_signature
    45844352          if sig && @signature then
     
    45904358            decl = fh.get_declarator
    45914359            if ! decl.is_function? then
    4592               next   # 既にエラー
     4360              next   # 既にエラー
    45934361            end
    45944362            paramdecl = decl.get_type.get_paramlist.find( param_name )
     
    46094377
    46104378            # else
    4611             # sig == nil ならば既にエラー
     4379            # sig == nil ならば既にエラー
    46124380          end
    46134381        else
     
    46204388          next
    46214389        end
    4622         # 右辺チェック終わり
     4390        # 右辺チェック終わり
    46234391        # ai2 = [ :RELAY_ALLOC, func_name, param_name, rhs_cp_name, rhs_func_name, rhs_param_name ]
    46244392        ai2 = [ ai[0], ai[1], ai[2], cp_name, func_name, param_name ]
     
    46334401  end
    46344402
    4635   def is_VMT_useless?                     # VMT 関数テーブルを使用しない
     4403  def is_VMT_useless?                     # VMT 関数テーブルを使用しない
    46364404    if @port_type == :ENTRY && $unopt_entry == true then
    4637       # プラグインから $unopt_entry を設定するケースのため
    4638       # ここで読み出すときに、false を返す (reset_optimize での設定変更は速すぎる)
     4405      # プラグインから $unopt_entry を設定するケースのため
     4406      # ここで読み出すときに、false を返す (reset_optimize での設定変更は速すぎる)
    46394407      return false
    46404408    else
     
    46434411  end
    46444412
    4645   def is_skelton_useless?                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
     4413  def is_skelton_useless?                 # スケルトン関数不要   (true の時、受け口関数を呼出す)
    46464414    if @port_type == :ENTRY && $unopt_entry == true then
    4647       # プラグインから $unopt_entry を設定するケースのため
    4648       # ここで読み出すときに、false を返す (reset_optimize での設定変更は速すぎる)
     4415      # プラグインから $unopt_entry を設定するケースのため
     4416      # ここで読み出すときに、false を返す (reset_optimize での設定変更は速すぎる)
    46494417      return false
    46504418    else
     
    46534421  end
    46544422
    4655   def is_cell_unique?                     # 呼びå
    4656 ˆã®ã‚»ãƒ«ã¯ä¸€ã¤ï¼Ÿ
     4423  def is_cell_unique?                     # 呼び先のセルは一つ?
    46574424    @b_cell_unique
    46584425  end
    46594426
    4660   #=== Port# 受け口最適化の設定
    4661   # この受け口を参ç
    4662 §ã™ã‚‹å‘¼ã³å£ãŒ VMT, skelton をå¿
    4663 è¦ã¨ã—ているかどうかを設定
    4664   # 一つでも呼び口がå¿
    4665 è¦ã¨ã—ている(すなわち b_*_useless が false)場合は、
    4666   # この受け口の最適化を false とする
     4427  #=== Port# 受け口最適化の設定
     4428  # この受け口を参照する呼び口が VMT, skelton を必要としているかどうかを設定
     4429  # 一つでも呼び口が必要としている(すなわち b_*_useless が false)場合は、
     4430  # この受け口の最適化を false とする
    46674431  def set_entry_VMT_skelton_useless( b_VMT_useless, b_skelton_useless )
    46684432    if ! b_VMT_useless then
     
    46744438  end
    46754439
    4676   #=== Port# 唯一の結合å
    4677 ˆã‚’設定
    4678   # 最適化で使用
    4679   #  b_VMT_useless == true || b_skelton_useless == true の時に設定される
    4680   #  optional の場合 callee_cell, callee_port が nil となる
     4440  #=== Port# 唯一の結合先を設定
     4441  # 最適化で使用
     4442  #  b_VMT_useless == true || b_skelton_useless == true の時に設定される
     4443  #  optional の場合 callee_cell, callee_port が nil となる
    46814444  def set_only_callee( callee_port, callee_cell )
    46824445    @only_callee_port = callee_port
     
    46844447  end
    46854448
    4686   #=== Port# 唯一の結合å
    4687 ˆãƒãƒ¼ãƒˆã‚’返す(compositeの場合実セル)
    4688   # optional 呼び口で未結合の場合 nil を返す
     4449  #=== Port# 唯一の結合先ポートを返す(compositeの場合実セル)
     4450  # optional 呼び口で未結合の場合 nil を返す
    46894451  def get_real_callee_port
    46904452    if @only_callee_cell then
     
    46934455  end
    46944456
    4695   #=== Port# 唯一の結合å
    4696 ˆã‚»ãƒ«ã‚’返す(compositeの場合実セル)
    4697   # optional 呼び口で未結合の場合 nil を返す
     4457  #=== Port# 唯一の結合先セルを返す(compositeの場合実セル)
     4458  # optional 呼び口で未結合の場合 nil を返す
    46984459  def get_real_callee_cell
    46994460    if @only_callee_cell then
     
    47104471  end
    47114472
    4712   #=== Port# 逆require の結合を生成する
     4473  #=== Port# 逆require の結合を生成する
    47134474  # STAGE: S
    47144475  def create_reverse_require_join cell
     
    47174478    end
    47184479
    4719     # 呼びå
    4720 ƒã‚»ãƒ«ã‚’探す
     4480    # 呼び元セルを探す
    47214481    ct_or_cell = Namespace.find( @reverse_require_cell_path )   # mikan namespace    #1
    47224482    if ct_or_cell.instance_of? Cell then
     
    47244484      ct = cell2.get_celltype
    47254485      if ct == nil then
    4726         return    # 既にエラー
     4486        return    # 既にエラー
    47274487      end
    47284488    elsif ct_or_cell.instance_of? Celltype then
     
    47344494      ct = ct_or_cell
    47354495    else
    4736       # 既にエラー:無視
     4496      # 既にエラー:無視
    47374497      return
    47384498    end
    47394499
    4740     # 結合を生成する
     4500    # 結合を生成する
    47414501    dbgPrint "create_reverse_require_join #{cell2.get_name}.#{@reverse_require_entry_port_name}[] = #{cell.get_name}.#{@name}"
    47424502    nsp = NamespacePath.new( cell.get_name, false, cell.get_namespace )
     
    47504510  end
    47514511
    4752   #=== Port# signature のすべての関数のすべてのパラメータをたどる
    4753   #block:: ブロックを引数として取る(ruby の文法で書かない)
    4754   #  ブロックは3つの引数を受け取る(Port, Decl,      ParamDecl)    Decl: 関数ヘッダ
    4755   # Signature クラスにも each_param がある(同じ働き)
    4756   def each_param # ブロック引数{  |port, func_decl, param_decl| }
    4757     return if @signature == nil                         # signature 未定義(既にエラー)
    4758     fha = @signature.get_function_head_array            # 呼び口または受け口のシグニチャの関数é
    4759 åˆ—
    4760     return if fha == nil                                # nil なら文法エラーで有効値が設定されなかった
    4761 
    4762     pr = Proc.new   # このメソッドのブロック引数を pr に代å
    4763 ¥
     4512  #=== Port# signature のすべての関数のすべてのパラメータをたどる
     4513  #block:: ブロックを引数として取る(ruby の文法で書かない)
     4514  #  ブロックは3つの引数を受け取る(Port, Decl,      ParamDecl)    Decl: 関数ヘッダ
     4515  # Signature クラスにも each_param がある(同じ働き)
     4516  def each_param # ブロック引数{  |port, func_decl, param_decl| }
     4517    return if @signature == nil                         # signature 未定義(既にエラー)
     4518    fha = @signature.get_function_head_array            # 呼び口または受け口のシグニチャの関数配列
     4519    return if fha == nil                                # nil なら文法エラーで有効値が設定されなかった
     4520
     4521    pr = Proc.new   # このメソッドのブロック引数を pr に代入
    47644522    port = self
    4765     fha.each{ |fh|  # fh: FuncHead                      # 関数é
    4766 åˆ—中の各関数頭部
    4767       fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
    4768       if fd.is_function? then                           # fd が関数でなければ、すでにエラー
    4769         fd.get_type.get_paramlist.get_items.each{ |par| # すべてのパラメータについて
     4523    fha.each{ |fh|  # fh: FuncHead                      # 関数配列中の各関数頭部
     4524      fd = fh.get_declarator                            # fd: Decl  (関数頭部からDeclarotorを得る)
     4525      if fd.is_function? then                           # fd が関数でなければ、すでにエラー
     4526        fd.get_type.get_paramlist.get_items.each{ |par| # すべてのパラメータについて
    47704527          pr.call( port, fd, par )
    47714528        }
     
    47744531  end
    47754532
    4776   #=== Port# 逆require指定されている?
     4533  #=== Port# 逆require指定されている?
    47774534  def is_reverse_required?
    47784535    @reverse_require_cell_path != nil
     
    48264583#== Namespace
    48274584#
    4828 # root namespace だけ、Region クラスのインスタンスとして生成される
    4829 # root namespace は、root region をå
    4830 ¼ã­ã‚‹ãŸã‚
     4585# root namespace だけ、Region クラスのインスタンスとして生成される
     4586# root namespace は、root region を兼ねるため
    48314587#
    4832 # @cell_list は Region の場合にのみ持つ (mikan @cell_list 関連は Region に移すべき)
     4588# @cell_list は Region の場合にのみ持つ (mikan @cell_list 関連は Region に移すべき)
    48334589#
    48344590class Namespace < NSBDNode
    4835 # @name::  Symbol     # root の場合 "::" (String)
     4591# @name::  Symbol     # root の場合 "::" (String)
    48364592# @global_name:: str
    48374593# @name_list:: NamedList   Signature,Celltype,CompositeCelltype,Cell,Typedef,Namespace
    48384594# @struct_tag_list:: NamedList : StructType
    4839 # @namespace_list:: Namespace[] : Region は Namespace の子クラスであり、含まれる
     4595# @namespace_list:: Namespace[] : Region は Namespace の子クラスであり、含まれる
    48404596# @signature_list:: Sginature[]
    48414597# @celltype_list:: Celltype[]
     
    48434599# @cell_list:: Cell[]
    48444600# @typedef_list:: Typedef[]
    4845 # @decl_list:: ( Typedef | StructType | EnumType )[]   ä¾å­˜é–¢ä¿‚がある場合に備えて、順番どおりにé
    4846 åˆ—に格納 mikan enum
     4601# @decl_list:: ( Typedef | StructType | EnumType )[]   依存関係がある場合に備えて、順番どおりに配列に格納 mikan enum
    48474602# @const_decl_list:: Decl[]
    4848 # @cache_n_cells:: Integer :  get_n_cells の結果をキャッシュする
    4849 # @cache_generating_region:: Region :  get_n_cells の結果をキャッシュするしているリージョン
    4850 
    4851   # mikan namespace の push, pop
    4852 
    4853   # namespace 階層用のスタック
     4603# @cache_n_cells:: Integer :  get_n_cells の結果をキャッシュする
     4604# @cache_generating_region:: Region :  get_n_cells の結果をキャッシュするしているリージョン
     4605
     4606  # mikan namespace push, pop
     4607
     4608  # namespace 階層用のスタック
    48544609  @@namespace_stack = []      # @@namespace_stack[0] = "::" (generator.rb)
    48554610  @@namespace_sp = -1
    48564611
    4857   # Generator ネスト用のスタック (namespace 階層用のスタックを対比する)
     4612  # Generator ネスト用のスタック (namespace 階層用のスタックを対比する)
    48584613  @@nest_stack_index = -1
    48594614  @@nest_stack = []
     
    48614616  @@root_namespace = nil
    48624617
    4863   # Generator ネスト用スタックの push, pop (クラスメソッド)
     4618  # Generator ネスト用スタックの push, pop (クラスメソッド)
    48644619  def self.push
    48654620    dbgPrint "push Namespace\n"
     
    48814636  end
    48824637
    4883   # namespace 階層用スタックの push, pop (インスタンスメソッド)
     4638  # namespace 階層用スタックの push, pop (インスタンスメソッド)
    48844639  def push ns
    48854640    @@namespace_sp += 1
     
    49034658    if( name == "::" )then
    49044659      if( @@root_namespace != nil )then
    4905         # root は一回のみ生成できる
     4660        # root は一回のみ生成できる
    49064661        raise "try to re-create root namespace"
    49074662      end
     
    49124667      if ns.kind_of? Namespace then
    49134668        dbgPrint "namespace: re-appear #{@name}\n"
    4914         # 登録済み namespace の再登録
     4669        # 登録済み namespace の再登録
    49154670        ns.push ns
    49164671        return
     
    49234678    end
    49244679
    4925     if @@namespace_sp >= 0 then   # root は除外
     4680    if @@namespace_sp >= 0 then   # root は除外
    49264681      @@namespace_stack[@@namespace_sp].new_namespace( self )
    49274682    end
    49284683    push self
    49294684
    4930     @global_name = Namespace.get_global_name    # stack 登録後取る
     4685    @global_name = Namespace.get_global_name    # stack 登録後取る
    49314686    @name_list = NamedList.new( nil, "symbol in namespace '#{@name}'" )
    49324687    @struct_tag_list = NamedList.new( nil, "struct tag" )
     
    49434698    @cache_generating_region = nil
    49444699    if @NamespacePath == nil then
    4945       # root namespace の場合は設定済 (親 namespace が見つからず例外になる)
    4946       set_namespace_path # @NamespacePath の設定
     4700      # root namespace の場合は設定済 (親 namespace が見つからず例外になる)
     4701      set_namespace_path # @NamespacePath の設定
    49474702    end
    49484703  end
     
    49564711  end
    49574712
    4958   #=== Namespace:: global_name を得る
    4959   # parse 中のみこのメソッドは使える
     4713  #=== Namespace:: global_name を得る
     4714  # parse 中のみこのメソッドは使える
    49604715  # STAGE: P
    4961   def self.get_global_name    # parse 中有効
     4716  def self.get_global_name    # parse 中有効
    49624717    if @@namespace_sp <= 0 then
    49634718      return ""
     
    49784733  end
    49794734
    4980   #=== Namespace#セルの個数を得る
    4981   # 子 region が linkunit, node 指定されていれば、含めない(別のリンク単位)
    4982   # プロトタイプ宣言のもののみの個数を含めない
    4983   # mikan namespace 下に cell を置けない仕様になると、このメソッドは Region のものでよい
    4984   # mikan 上記の場合 instance_of? Namespace の条件判定は不要となる
     4735  #=== Namespace#セルの個数を得る
     4736  # 子 region が linkunit, node 指定されていれば、含めない(別のリンク単位)
     4737  # プロトタイプ宣言のもののみの個数を含めない
     4738  # mikan namespace 下に cell を置けない仕様になると、このメソッドは Region のものでよい
     4739  # mikan 上記の場合 instance_of? Namespace の条件判定は不要となる
    49854740  def get_n_cells
    49864741    if @cache_generating_region == $generating_region then
    4987       # このメソッドは繰り返し呼び出されるため、結果をキャッシュする
     4742      # このメソッドは繰り返し呼び出されるため、結果をキャッシュする
    49884743      return @cache_n_cells
    49894744    end
     
    49914746    count = 0
    49924747    @cell_list.each{ |c|
    4993       # 定義かプロトタイプ宣言だけかは、new_cell の段階で判断できないため、カウントしなおす
     4748      # 定義かプロトタイプ宣言だけかは、new_cell の段階で判断できないため、カウントしなおす
    49944749      if c.get_f_def == true then
    49954750        # print "get_n_cells: cell: #{c.get_name}\n"
     
    50024757        count += ns.get_n_cells
    50034758      else
    5004         # ns は Region である
     4759        # ns は Region である
    50054760        rt = ns.get_region_type
    50064761        # print "get_n_cells: region: #{ns.get_name}: #{rt}\n"
    50074762        if rt == :NODE || rt == :LINKUNIT then
    5008           # 別の linkunit なので加算しない
     4763          # 別の linkunit なので加算しない
    50094764        else
    50104765          count += ns.get_n_cells
     
    50184773  end
    50194774
    5020   #=== Namespace.find : in_path で示されるオブジェクトを探す
     4775  #=== Namespace.find : in_path で示されるオブジェクトを探す
    50214776  #in_path:: NamespacePath
    5022   #in_path:: Array : 古い形式
     4777  #in_path:: Array : 古い形式
    50234778  #  path [ "::", "ns1", "ns2" ]   absolute
    50244779  #  path [ "ns1", "ns2" ]         relative
     
    50354790      if name == "::" then
    50364791        i = 1
    5037         name = path[i]   # 構文的にå¿
    5038 ãšå­˜åœ¨
     4792        name = path[i]   # 構文的に必ず存在
    50394793        object = @@root_namespace.find( name )  # root
    50404794      else
    5041         # 相対パス
     4795        # 相対パス
    50424796        i = 0
    50434797        object = @@namespace_stack[@@namespace_sp].find_one( name ) # crrent
     
    50724826
    50734827      unless object.kind_of?( Namespace ) then
    5074         # クラスメソッドå†
    5075 ã§ cdl_error を呼び出すことはできない
    5076         # また、前方参ç
    5077 §å¯¾å¿œå¾Œã€æ­£ç¢ºãªè¡Œç•ªå·ãŒå‡ºãªã„問題も生じる
     4828        # クラスメソッド内で cdl_error を呼び出すことはできない
     4829        # また、前方参照対応後、正確な行番号が出ない問題も生じる
    50784830        # cdl_error( "S1092 \'$1\' not namespace" , name )
    5079         # このメソッドから nil が帰った場合 "not found" が出るので、ここでは出さない
     4831        # このメソッドから nil が帰った場合 "not found" が出るので、ここでは出さない
    50804832        return nil
    50814833      end
     
    50934845  end
    50944846
    5095   #=== Namespace# namespace から探す。見つからなければ親 namespace から探す
     4847  #=== Namespace# namespace から探す。見つからなければ親 namespace から探す
    50964848  def self.find_one( name )
    50974849    return @@namespace_stack[@@namespace_sp].find_one( name )
     
    51014853
    51024854    object = find( name )
    5103     # これは出すぎ
     4855    # これは出すぎ
    51044856    # dbgPrint "in '#{@name}' find '#{name}' object #{object ? object.class : "Not found"}\n"
    51054857
     
    51184870
    51194871  def self.find_tag( name )
    5120     # mikan tag : namespace の path に対応しない
    5121     # namespace の中にあっても、root namespace にあるものと見なされる
    5122     # よって カレント namespace から根に向かって探す
     4872    # mikan tag : namespace の path に対応しない
     4873    # namespace の中にあっても、root namespace にあるものと見なされる
     4874    # よって カレント namespace から根に向かって探す
    51234875    i = @@namespace_sp
    51244876    while i >= 0
     
    51964948  end
    51974949
    5198   #=== Namespace# 参ç
    5199 §ã•ã‚Œã¦ã„るが、未定義のセルを探す
    5200   # プロトタイプ宣言だけで定義されていないケースをエラーとする
    5201   # 受動の未結合セルについて警告する
     4950  #=== Namespace# 参照されているが、未定義のセルを探す
     4951  # プロトタイプ宣言だけで定義されていないケースをエラーとする
     4952  # 受動の未結合セルについて警告する
    52024953  def check_ref_but_undef
    52034954    @cell_list.each { |c|
    5204       if ! c.get_f_def then   # Namespace の @cell_list にはプロトタイプが含まれるケースあり
     4955      if ! c.get_f_def then   # Namespace の @cell_list にはプロトタイプが含まれるケースあり
    52054956        if c.get_f_ref then
    52064957          c.cdl_error( "S1093 $1 : undefined cell" , c.get_namespace_path.get_path_str )
     
    52254976  end
    52264977
    5227   #=== Namespace# セルの受け口の参ç
    5228 §ã‚«ã‚¦ãƒ³ãƒˆã‚’設定する
     4978  #=== Namespace# セルの受け口の参照カウントを設定する
    52294979  def set_port_reference_count
    52304980    @cell_list.each { |c|
     
    52424992
    52434993  def new_structtype( struct )
    5244     # struct.set_owner self   # StructType (Namespace) # StructType は BDNode ではない
     4994    # struct.set_owner self   # StructType (Namespace) # StructType は BDNode ではない
    52454995    dup = @struct_tag_list.get_item(struct.get_name)
    52464996    if dup != nil then
    52474997      if struct.same? dup then
    5248         # 同じものが typedef された
     4998        # 同じものが typedef された
    52494999        # p "#{struct.get_name}"
    52505000        return
     
    52705020      if typedef_type.get_type_str == dup_type.get_type_str &&
    52715021          typedef_type.get_type_str_post == dup_type.get_type_str_post then
    5272         # 同じものが typedef された
    5273         # ここへ来るのは C で関数ポインタを typedef しているケース
    5274         # 以下のように二重に定義されている場合は type_specifier_qualifier_list として扱われる
     5022        # 同じものが typedef された
     5023        # ここへ来るのは C で関数ポインタを typedef しているケース
     5024        # 以下のように二重に定義されている場合は type_specifier_qualifier_list として扱われる
    52755025        #    typedef long LONG;
    52765026        #    typedef long LONG;
    5277         # bnf.y.rb では declarator に TYPE_NAME を許さないので、ここへ来ることはない
     5027        # bnf.y.rb では declarator に TYPE_NAME を許さないので、ここへ来ることはない
    52785028        # p "#{typedef.get_declarator.get_type.get_type_str} #{typedef.get_name} #{typedef.get_declarator.get_type.get_type_str_post}"
    52795029        return
     
    53165066  def new_const_decl( decl )
    53175067    decl.set_owner self   # Decl (Namespace:const)
    5318     if ! decl.is_const? then                    # const 修飾さていること
     5068    if ! decl.is_const? then                    # const 修飾さていること
    53195069      if decl.is_type?( PtrType ) then
    53205070        cdl_error( "S1094 $1: pointer is not constant. check \'const\'" , decl.get_name )
     
    53245074    elsif ! decl.is_type?( IntType ) && ! decl.is_type?( FloatType ) &&
    53255075        ! decl.is_type?( BoolType ) && ! decl.is_type?( PtrType ) then
    5326                                             # IntType, FloatType であること
     5076                                            # IntType, FloatType であること
    53275077      cdl_error( "S1096 $1: should be int, float, bool or pointer type" , decl.get_name )
    5328     elsif decl.get_initializer == nil then   # 初期値を持つこと
     5078    elsif decl.get_initializer == nil then   # 初期値を持つこと
    53295079      cdl_error( "S1097 $1: has no initializer" , decl.get_name )
    5330 #    elsif decl.get_initializer.eval_const(nil) == nil then  #eval_const は check_init で呼出されるので二重チェック
    5331 #                                            # mikan 初期値が型に対し適切であること
     5080#    elsif decl.get_initializer.eval_const(nil) == nil then  #eval_const は check_init で呼出されるので二重チェック
     5081#                                            # mikan 初期値が型に対し適切であること
    53325082#      cdl_error( "S1098 $1: has unsuitable initializer" , decl.get_name )
    53335083    else
     
    53515101 ###
    53525102
    5353   #=== Namespace# すべてのセルの require ポートを設定
     5103  #=== Namespace# すべてのセルの require ポートを設定
    53545104  # STAGE: S
    53555105  def set_require_join
     
    53575107      ct.set_require_join
    53585108    }
    5359     # すべての namespace について require ポートをセット
     5109    # すべての namespace について require ポートをセット
    53605110    @namespace_list.each{ |ns|
    53615111      ns.set_require_join
     
    53635113  end
    53645114
    5365   #=== Namespace# Join への definition の設定とチェック
    5366   # セルタイプに属するすべてのセルに対して実施
     5115  #=== Namespace# Join への definition の設定とチェック
     5116  # セルタイプに属するすべてのセルに対して実施
    53675117  def set_definition_join
    5368     # celltype のコードを生成
     5118    # celltype のコードを生成
    53695119    @cell_list.each { |c|
    53705120      dbgPrint "set_definition_join #{c.get_name}\n"
     
    53775127
    53785128  #=== Namespace# set_max_entry_port_inner_cell
    5379   # セルタイプに属するすべてのセルに対して実施
     5129  # セルタイプに属するすべてのセルに対して実施
    53805130  def set_max_entry_port_inner_cell
    5381     # celltype のコードを生成
     5131    # celltype のコードを生成
    53825132    @cell_list.each { |c|
    53835133      c.set_max_entry_port_inner_cell
     
    53885138  end
    53895139
    5390   #=== Namespace# セルの結合をチェックする
     5140  #=== Namespace# セルの結合をチェックする
    53915141  def check_join
    53925142    @cell_list.each { |c|
     
    54005150  end
    54015151
    5402   #== Namespace# ルートか?
    5403   # ルートネームスペース と ルートリージョンは同じ
     5152  #== Namespace# ルートか?
     5153  # ルートネームスペース と ルートリージョンは同じ
    54045154  def is_root?
    54055155    @name == "::"
    54065156  end
    54075157
    5408   #== Namespace# ルートを得る
    5409   # ルートリージョンとルートネームスペースは同じオブジェクト
     5158  #== Namespace# ルートを得る
     5159  # ルートリージョンとルートネームスペースは同じオブジェクト
    54105160  def self.get_root
    54115161    @@root_namespace
    54125162  end
    54135163
    5414   #== Namespace (Region) に属するセルのリスト
     5164  #== Namespace (Region) に属するセルのリスト
    54155165  def get_cell_list
    54165166    @cell_list
    54175167  end
    54185168
    5419   #== Namespace (Region)# 子リージョンのリスト
     5169  #== Namespace (Region)# 子リージョンのリスト
    54205170  #
    5421   # リージョンは Namespace クラスで namespace として記憶されている
     5171  # リージョンは Namespace クラスで namespace として記憶されている
    54225172  def get_region_list
    54235173    @namespace_list
     
    54415191#
    54425192# available if definition is Port
    5443 # @cell_name:: string : 右辺のセルの名前
    5444 # @cell:: Cell  : 右辺のセル
    5445 # @celltype:: Celltype : 右辺のセルタイプ
    5446 # @port_name:: string : 右辺の受け口名
    5447 # @port:: Port : 右辺の受け口
     5193# @cell_name:: string : 右辺のセルの名前
     5194# @cell:: Cell  : 右辺のセル
     5195# @celltype:: Celltype : 右辺のセルタイプ
     5196# @port_name:: string : 右辺の受け口名
     5197# @port:: Port : 右辺の受け口
    54485198# @array_member:: rhs array : available only for first appear in the same name
    54495199# @array_member2:: Join array : available only for first appear in the same name
    5450 # @rhs_subscript:: nil : not array, >=0: 右辺の添数
     5200# @rhs_subscript:: nil : not array, >=0: 右辺の添数
    54515201#
    54525202
    54535203# @through_list::  @cp_through_list + @region_through_list
    5454 #  以下の構造を持つ(@cp_through_list の構造はå
    5455 ±é€šï¼‰
    5456 # @cp_through_list::  呼び口に指定された through
     5204#  以下の構造を持つ(@cp_through_list の構造は共通)
     5205# @cp_through_list::  呼び口に指定された through
    54575206#   [ [plugin_name, cell_name, plugin_arg], [plugin_name2, cell_name2, plugin_arg], ... ]
    5458 # @region_through_list::  region に指定された through
     5207# @region_through_list::  region に指定された through
    54595208#   [ [plugin_name, cell_name, plugin_arg, region], [plugin_name2, cell_name2, plugin_arg, region2], ... ]
    54605209#
    5461 # @through_generated_list:: [Plugin_class object, ...]: @through_list に対応
    5462 # @region_through_generated_list:: [Plugin_class object, ...]: @region_through_list に対応
     5210# @through_generated_list:: [Plugin_class object, ...]: @through_list に対応
     5211# @region_through_generated_list:: [Plugin_class object, ...]: @region_through_list に対応
    54635212#
    54645213
    54655214  include PluginModule
    54665215
    5467   #=== Join# 初期化
    5468   #name:: string: 名前(属性名、呼び口名)
    5469   #subscript:: Nil=非é
    5470 åˆ—, -1="[]", N="[N]"
    5471   #rhs:: Expression: 右辺の式
     5216  #=== Join# 初期化
     5217  #name:: string: 名前(属性名、呼び口名)
     5218  #subscript:: Nil=非配列, -1="[]", N="[N]"
     5219  #rhs:: Expression: 右辺の式
    54725220  def initialize( name, subscript, rhs, locale = nil )
    54735221    # dbgPrint "Join#new: #{name}, #{subscript} #{rhs.eval_const(nil)}\n"
     
    54815229    @name = name
    54825230    if subscript.instance_of?( Expression ) then
    5483        #mikan é
    5484 åˆ—添数が整数であることを未チェック
     5231       #mikan 配列添数が整数であることを未チェック
    54855232       @subscript = subscript.eval_const(nil)
    54865233       if @subscript == nil then
     
    54945241    @definition = nil
    54955242
    5496     # é
    5497 åˆ—要素を設定
    5498     # 本当は、初出の要素のみ設定するのが適当
    5499     # new_join で add_array_member の中で初出要素の array_member に対し設定する
     5243    # 配列要素を設定
     5244    # 本当は、初出の要素のみ設定するのが適当
     5245    # new_join で add_array_member の中で初出要素の array_member に対し設定する
    55005246    if @subscript == -1 then
    55015247      @array_member  = [self]
     
    55155261  end
    55165262
    5517   #===  Join# 左辺に対応する celltype の定義を設定するとともにチェックする
     5263  #===  Join# 左辺に対応する celltype の定義を設定するとともにチェックする
    55185264  # STAGE:   S
    55195265  #
    5520   #     ä»£å
    5521 ¥å¯èƒ½ã‹ãƒã‚§ãƒƒã‚¯ã™ã‚‹
    5522   #definition:: Decl (attribute,varの時) または Port (callの時) または nil (definition が見つからなかった時)
     5266  #     代入可能かチェックする
     5267  #definition:: Decl (attribute,varの時) または Port (callの時) または nil (definition が見つからなかった時)
    55235268
    55245269  def set_definition( definition )
     
    55265271    dbgPrint "set_definition: #{@owner.get_name}.#{@name} = #{definition.class}\n"
    55275272
    5528     # 二重チェックの防止
     5273    # 二重チェックの防止
    55295274    if @definition then
    5530       # set_definition を個別に行うケースで、二重に行われる可能性がある(異常ではない)
    5531       # 二重に set_definition が実行されると through が二重に適用されてしまう
     5275      # set_definition を個別に行うケースで、二重に行われる可能性がある(異常ではない)
     5276      # 二重に set_definition が実行されると through が二重に適用されてしまう
    55325277      # cdl_warning( "W9999 $1, internal error: set_definition duplicate", @name )
    55335278      return
     
    55365281    @definition = definition
    55375282
    5538     # mikan 左辺値、右辺値の型チェックなど
     5283    # mikan 左辺値、右辺値の型チェックなど
    55395284    if @definition.instance_of?( Decl ) then
    55405285      check_var_init
    55415286    elsif @definition.instance_of?( Port ) then
    55425287      check_call_port_init
    5543       if @definition.get_port_type == :CALL then   # :ENTRY ならエラー。無視しない
     5288      if @definition.get_port_type == :CALL then   # :ENTRY ならエラー。無視しない
    55445289        check_and_gen_through
    5545         create_allocator_join  # through プラグイン生成した後でないと、挿å
    5546 ¥å‰ã®ã‚»ãƒ«ã®ã‚¢ãƒ­ã‚±ãƒ¼ã‚¿ã‚’結合してしまう
     5290        create_allocator_join  # through プラグイン生成した後でないと、挿入前のセルのアロケータを結合してしまう
    55475291      end
    55485292    elsif @definition == nil then
     
    55535297  end
    55545298
    5555   #=== Join# 変数の初期化チェック
     5299  #=== Join# 変数の初期化チェック
    55565300  def check_var_init
    5557     # attribute, var の場合
     5301    # attribute, var の場合
    55585302    if @definition.get_kind == :ATTRIBUTE then
    55595303#        check_cell_cb_init( definition.get_type, @rhs )
    5560       # 右辺で初期化可能かチェック
     5304      # 右辺で初期化可能かチェック
    55615305      @definition.get_type.check_init( @locale, @definition.get_identifier, @rhs, :ATTRIBUTE )
    55625306    elsif @definition.get_kind == :VAR then
    5563       # var は初期化できない
     5307      # var は初期化できない
    55645308      cdl_error( "S1100 $1: cannot initialize var" , @name )
    55655309    else
     
    55695313  end
    55705314
    5571   #=== Join# 呼び口の初期化チェック
     5315  #=== Join# 呼び口の初期化チェック
    55725316  def check_call_port_init
    55735317    ### Port
    55745318
    5575     # 左辺は受け口か(受け口を初期化しようとしている)?
     5319    # 左辺は受け口か(受け口を初期化しようとしている)?
    55765320    if @definition.get_port_type == :ENTRY then
    55775321      cdl_error( "S1101 \'$1\' cannot initialize entry port" , @name )
     
    55795323    end
    55805324
    5581 #      # é
    5582 åˆ—添数の整合性チェック
    5583 #      # 呼び口の定義で、非é
    5584 åˆ—なら添数なし、添数なしé
    5585 åˆ—なら添数なし、添数ありé
    5586 åˆ—なら添数あり
     5325#      # 配列添数の整合性チェック
     5326#      # 呼び口の定義で、非配列なら添数なし、添数なし配列なら添数なし、添数あり配列なら添数あり
    55875327    as = @definition.get_array_size
    55885328    if ( @subscript == nil && as != nil ) then
     
    56075347#    end
    56085348
    5609     # mikan Expression の get_type で型導出させる方がスマート
    5610     # mikan '=' の左辺がé
    5611 åˆ—かどうか未チェック
    5612     #(1) '=' の右辺は "Cell.ePort" の形式か?
    5613     #     æ¼”算子は "."  かつ "." の左辺が :IDENTIFIER
    5614     #     "." の右辺はチェック不要 (synatax 的に :IDENTIFIER)
    5615     #(2) "Cell" は存在するか?(名前が一致するものはあるか)
    5616     #(3) "Cell" は cell か?
    5617     #(4) "Cell" の celltype は有効か? (無効なら既にエラー)
    5618     #(5) "ePort" は "Cell" の celltype å†
    5619 ã«å­˜åœ¨ã™ã‚‹ã‹ï¼Ÿ
    5620     #(6) "ePort" は entry port か?
    5621     #(7) signature は一致するか
    5622 
    5623     # 右辺がない(以前の段階でエラー)
     5349    # mikan Expression の get_type で型導出させる方がスマート
     5350    # mikan '=' の左辺が配列かどうか未チェック
     5351    #(1) '=' の右辺は "Cell.ePort" の形式か?
     5352    #     演算子は "."  かつ "." の左辺が :IDENTIFIER
     5353    #     "." の右辺はチェック不要 (synatax 的に :IDENTIFIER)
     5354    #(2) "Cell" は存在するか?(名前が一致するものはあるか)
     5355    #(3) "Cell" は cell か?
     5356    #(4) "Cell" の celltype は有効か? (無効なら既にエラー)
     5357    #(5) "ePort" は "Cell" の celltype 内に存在するか?
     5358    #(6) "ePort" は entry port か?
     5359    #(7) signature は一致するか
     5360
     5361    # 右辺がない(以前の段階でエラー)
    56245362    return unless @rhs
    56255363
    5626     # cCall = composite.cCall; のチェック.この形式は属性用
    5627     # 呼び口を export するには cCall => composite.cCall; の形式を用いる
     5364    # cCall = composite.cCall; のチェック.この形式は属性用
     5365    # 呼び口を export するには cCall => composite.cCall; の形式を用いる
    56285366    if @rhs.instance_of?( Array ) == true && @rhs[0] == :COMPOSITE then
    56295367      cdl_error( "S1107 to export port, use \'cCall => composite.cCall\'"  )
     
    56335371    end
    56345372
    5635     # 右辺の Expression の要素を取り出す
     5373    # 右辺の Expression の要素を取り出す
    56365374    ret = @rhs.analyze_cell_join_expression
    56375375    if ret == nil then   #1
     
    56415379
    56425380    nsp, @rhs_subscript, @port_name = ret[0], ret[1], ret[2]
    5643     @cell_name = nsp.get_name     # mikan ns::cellname の形式の考æ
    5644 ®
    5645 
    5646     # composite の定義の中なら object は結合å
    5647 ˆ cell か、見つからなければ nil が返る
    5648     # composite の定義外なら false が返る
     5381    @cell_name = nsp.get_name     # mikan ns::cellname の形式の考慮
     5382
     5383    # composite の定義の中なら object は結合先 cell か、見つからなければ nil が返る
     5384    # composite の定義外なら false が返る
    56495385    object = CompositeCelltype.find( @cell_name )
    56505386    if object == false then
    5651 #     mikan 左辺が namespace に対応していないため。 path にして find
     5387#     mikan 左辺が namespace に対応していないため。 path にして find
    56525388      # p nsp.get_path_str, nsp.get_path
    56535389      object = Namespace.find( nsp )    #1
     
    56685404      object.set_f_ref
    56695405
    5670       # 右辺のセルのセルタイプ
     5406      # 右辺のセルのセルタイプ
    56715407      celltype = object.get_celltype
    56725408
     
    56815417          cdl_error( "S1113 \'$1\' signature mismatch" , @port_name )
    56825418        elsif object2.get_array_size then
    5683           # 受け口é
    5684 åˆ—
     5419          # 受け口配列
    56855420
    56865421          unless @rhs_subscript then
    5687             # 右辺に添数指定がなかった
     5422            # 右辺に添数指定がなかった
    56885423            cdl_error( "S1114 \'$1\' should be array" , @port_name )
    56895424          else
     
    56915426            as = object2.get_array_size
    56925427            if( as.kind_of?( Integer ) && as <= @rhs_subscript )then
    5693               # 受け口é
    5694 åˆ—の大きさに対し、右辺の添数が同じか大きい
     5428              # 受け口配列の大きさに対し、右辺の添数が同じか大きい
    56955429              cdl_error( "S1115 $1[$2]: subscript out of range (< $3)" , @port_name, @rhs_subscript, as )
    56965430            else
     
    56995433              @celltype = celltype
    57005434              @port = object2
    5701               # 右辺のセルの受け口 object2 を参ç
    5702 §æ¸ˆã¿ã«ã™ã‚‹
     5435              # 右辺のセルの受け口 object2 を参照済みにする
    57035436              # object2: Port, @definition: Port
    57045437              @cell.set_entry_port_max_subscript( @port, @rhs_subscript )
     
    57105443          end
    57115444        elsif @rhs_subscript then
    5712           # 受け口é
    5713 åˆ—でないのに右辺で添数指定されている
     5445          # 受け口配列でないのに右辺で添数指定されている
    57145446          cdl_error( "S1116 \'$1\' entry port is not array" , @port_name )
    57155447        else
     
    57195451          @celltype = celltype
    57205452
    5721           # 右辺のセル object の受け口 object2 を参ç
    5722 §æ¸ˆã¿ã«ã™ã‚‹
     5453          # 右辺のセル object の受け口 object2 を参照済みにする
    57235454          # object2: Port, @definition: Port
    57245455
    57255456          # debug
    57265457          # p "rhs:  #{@cell}  #{@cell.get_name}"
    5727         end  # end of port (object2) チェック
     5458        end  # end of port (object2) チェック
    57285459
    57295460        #else
    5730         #  celltype == nil (すでにエラー)
    5731       end  # end of celltyep チェック
     5461        #  celltype == nil (すでにエラー)
     5462      end  # end of celltyep チェック
    57325463
    57335464
    57345465      check_region( object )
    57355466
    5736     end  # end of cell (object) チェック
    5737 
    5738   end
    5739 
    5740   #=== Join# アロケータの結合を生成
     5467    end  # end of cell (object) チェック
     5468
     5469  end
     5470
     5471  #=== Join# アロケータの結合を生成
    57415472  # STAGE: S
    5742   #cell::  呼び口の結合å
    5743 ˆã®ã‚»ãƒ«
     5473  #cell::  呼び口の結合先のセル
    57445474  #
    5745   # ここでは呼び口側に生成されるアロケータ呼び口の結合を生成
    5746   # 受け口側は Cell の set_specifier_list で生成
    5747   #  a[*] のå†
    5748 å®¹ã¯ Cell の set_specifier_list を参ç
    5749 §
     5475  # ここでは呼び口側に生成されるアロケータ呼び口の結合を生成
     5476  # 受け口側は Cell の set_specifier_list で生成
     5477  #  a[*] の内容は Cell の set_specifier_list を参照
    57505478  def create_allocator_join
    57515479
    5752     cell = get_rhs_cell2   # 右辺のセルを得る
     5480    cell = get_rhs_cell2   # 右辺のセルを得る
    57535481    port = get_rhs_port2
    57545482
    5755     if( cell && cell.get_allocator_list ) then      # cell == nil なら既にエラー
     5483    if( cell && cell.get_allocator_list ) then      # cell == nil なら既にエラー
    57565484
    57575485      dbgPrint "create_allocator_join: #{@owner.get_name}.#{@name}=>#{cell ? cell.get_name : "nil"}\n"
     
    57605488
    57615489        if( a[0+1] == port && a[1+1] == @rhs_subscript )then
    5762           # 名前の一致するものの結合を生成する
    5763           # 過不足は、別途チェックされる
     5490          # 名前の一致するものの結合を生成する
     5491          # 過不足は、別途チェックされる
    57645492          cp_name = :"#{@name}_#{a[2+1]}_#{a[3+1]}"
    57655493          # p "creating allocator join #{cp_name} #{@subscript} #{a[1+1]}"
     
    57765504  end
    57775505
    5778   #=== Join# リージョン間の結合をチェック
    5779   # リージョン間の through による @region_through_list の作成
    5780   # 実際の生成は check_and_gen_through で行う
    5781   # mikan Cell#distance とRegion へたどり着くまでための処理にå
    5782 ±é€šéƒ¨åˆ†ãŒå¤šã„
     5506  #=== Join# リージョン間の結合をチェック
     5507  # リージョン間の through による @region_through_list の作成
     5508  # 実際の生成は check_and_gen_through で行う
     5509  # mikan Cell#distance とRegion へたどり着くまでための処理に共通部分が多い
    57835510  def check_region( object )
    57845511
     
    57875514    # print "DOMAIN: check_region #{@owner.get_name}.#{@name} => #{object.get_name}\n"
    57885515
    5789     # プラグインで生成されたなかでは生成しない
    5790     # さもないとプラグイン生成されたものとの間で、無限に生成される
     5516    # プラグインで生成されたなかでは生成しない
     5517    # さもないとプラグイン生成されたものとの間で、無限に生成される
    57915518##    if Generator.get_nest >= 1 then
    5792 ##    if Generator.get_plugin then     # mikan これはå¿
    5793 è¦ï¼Ÿ (意味解析段階での実行になるので不適切)
     5519##    if Generator.get_plugin then     # mikan これは必要? (意味解析段階での実行になるので不適切)
    57945520    if @owner.get_plugin.kind_of?( ThroughPlugin ) then
    5795       # プラグイン生成されたセルの場合、結合チェックのみ
     5521      # プラグイン生成されたセルの場合、結合チェックのみ
    57965522      return
    57975523    end
    57985524
    5799     # region のチェック
    5800     r1 = @owner.get_region      # 呼び口セルの region
    5801     r2 = object.get_region      # 受け口セルの region
    5802 
    5803     if ! r1.equal? r2 then      # 同一 region なら呼出し可能
     5525    # region のチェック
     5526    r1 = @owner.get_region      # 呼び口セルの region
     5527    r2 = object.get_region      # 受け口セルの region
     5528
     5529    if ! r1.equal? r2 then      # 同一 region なら呼出し可能
    58045530
    58055531      f1 = r1.get_family_line
     
    58085534      len2 = f2.length
    58095535
    5810       # 不一致になるところ(å
    5811 „弟)を探す
    5812       i = 1  # i = 0 は :RootRegion なのでå¿
    5813 ãšä¸€è‡´
     5536      # 不一致になるところ(兄弟)を探す
     5537      i = 1  # i = 0 は :RootRegion なので必ず一致
    58145538      while( i < len1 && i < len2 )
    58155539        if( f1[i] != f2[i] )then
     
    58195543      end
    58205544
    5821       sibling_level = i     # å
    5822 „弟となるレベル、もしくはどちらか一方が終わったレベル
     5545      sibling_level = i     # 兄弟となるレベル、もしくはどちらか一方が終わったレベル
    58235546
    58245547      dbgPrint "sibling_level: #{i}\n"
     
    58335556
    58345557
    5835       # 呼び側について呼びå
    5836 ƒã®ãƒ¬ãƒ™ãƒ«ã‹ã‚‰å
    5837 „弟レベルまで(out_through をチェックおよび挿å
    5838 ¥ï¼‰
     5558      # 呼び側について呼び元のレベルから兄弟レベルまで(out_through をチェックおよび挿入)
    58395559      i = len1 -1
    58405560      if b_to_through then
     
    58605580
    58615581        out_through_list.each { |ol|
    5862           if ol[0] then    # plugin_name が指定されていなければ登録しない
     5582          if ol[0] then    # plugin_name が指定されていなければ登録しない
    58635583            plugin_arg = CDLString.remove_dquote ol[1]
    58645584            through = [ ol[0], :"Join_out_through_", plugin_arg, f1[i], f1[i-1], :OUT_THROUGH, region_count]
     
    58735593      end
    58745594
    5875       # å
    5876 „弟レベルにおいて(to_through をチェックおよび挿å
    5877 ¥ï¼‰
     5595      # 兄弟レベルにおいて(to_through をチェックおよび挿入)
    58785596      if f1[sibling_level] && f2[sibling_level] then
    58795597        dbgPrint "going from #{f1[sibling_level].get_name} to #{f2[sibling_level].get_name}\n"
    58805598        found = 0
    5881         region_count = f1[i].next_to_through_count( f2[sibling_level].get_name )   # to_through の region カウント
     5599        region_count = f1[i].next_to_through_count( f2[sibling_level].get_name )   # to_through の region カウント
    58825600        f1[sibling_level].get_to_through_list.each { |t|
    5883           if t[0][0] == f2[sibling_level].get_name then   # region 名が一致するか ?
    5884             if t[1] then    # plugin_name が指定されていなければ登録しない
     5601          if t[0][0] == f2[sibling_level].get_name then   # region 名が一致するか ?
     5602            if t[1] then    # plugin_name が指定されていなければ登録しない
    58855603              plugin_arg = CDLString.remove_dquote t[2]
    58865604              through = [ t[1], :"Join_to_through__", plugin_arg, f1[sibling_level], f2[sibling_level], :TO_THROUGH, region_count ]
     
    59055623      end
    59065624
    5907       # 受け側についてå
    5908 „弟レベルから受け側のレベルまで(in_through をチェックおよび挿å
    5909 ¥ï¼‰
     5625      # 受け側について兄弟レベルから受け側のレベルまで(in_through をチェックおよび挿入)
    59105626      if b_to_through then
    5911         i = sibling_level + 1      # to_through を経た場合、最初の in_through は適用しない
     5627        i = sibling_level + 1      # to_through を経た場合、最初の in_through は適用しない
    59125628      else
    59135629        i = sibling_level
     
    59325648        end
    59335649        in_through_list.each { |il|
    5934           if il[0] then    # plugin_name が指定されていなければ登録しない
     5650          if il[0] then    # plugin_name が指定されていなければ登録しない
    59355651            plugin_arg = CDLString.remove_dquote il[1]
    59365652            through = [ il[0], :"Join_in_through_", plugin_arg, f2[i-1], f2[i],:IN_THROUGH, region_count ]
     
    59455661
    59465662
    5947   #=== Join# 生成しないリージョンへの結合かチェック
    5948   # 右辺のセルが、生成されないリージョンにあればエラー
    5949   # 右辺は、プラグイン生成されたセルがあれば、それを対象とする
     5663  #=== Join# 生成しないリージョンへの結合かチェック
     5664  # 右辺のセルが、生成されないリージョンにあればエラー
     5665  # 右辺は、プラグイン生成されたセルがあれば、それを対象とする
    59505666  def check_region2
    59515667    lhs_cell = @owner
    59525668
    5953     # 生成しないリージョンのセルへの結合か?
     5669    # 生成しないリージョンのセルへの結合か?
    59545670    # if join.get_cell && ! join.get_cell.is_generate? then
    5955     # if get_rhs_cell && ! get_rhs_cell.is_generate? then # composite セルがプロタイプ宣言の場合例外
     5671    # if get_rhs_cell && ! get_rhs_cell.is_generate? then # composite セルがプロタイプ宣言の場合例外
    59565672    # print "Link root: (caller #{@owner.get_name}) '#{@owner.get_region.get_link_root.get_name}'"
    59575673    # print " #{@owner.get_region.get_link_root == get_rhs_region.get_link_root ? "==" : "!="} "
     
    59665682      end
    59675683    else
    5968       # rhs のセルが存在しなかった (既にエラー)
     5684      # rhs のセルが存在しなかった (既にエラー)
    59695685    end
    59705686  end
     
    59745690  end
    59755691
    5976   #=== Join# specifier を設定
     5692  #=== Join# specifier を設定
    59775693  # STAGE: B
    5978   # set_specifier_list は、join の解析の最後で呼び出される
    5979   # through 指定子を設定
    5980   #  check_and_gen_through を呼出して、through 生成
     5694  # set_specifier_list は、join の解析の最後で呼び出される
     5695  # through 指定子を設定
     5696  #  check_and_gen_through を呼出して、through 生成
    59815697  def set_specifier_list( specifier_list )
    59825698
     
    59865702        # set plugin_name
    59875703        plugin_name = s[1].to_s
    5988         plugin_name[0] = "#{plugin_name[/^./].upcase}"     # å
    5989 ˆé ­æ–‡å­—を大文字に : ruby のクラス名の制約
     5704        plugin_name[0] = "#{plugin_name[/^./].upcase}"     # 先頭文字を大文字に : ruby のクラス名の制約
    59905705
    59915706        # set cell_name
     
    59945709        # set plugin_arg
    59955710        plugin_arg = CDLString.remove_dquote s[2].to_s
    5996         # plugin_arg = s[2].to_s.gsub( /\A"(.*)/, '\1' )   # 前後の "" を取り除く
     5711        # plugin_arg = s[2].to_s.gsub( /\A"(.*)/, '\1' )   # 前後の "" を取り除く
    59975712        # plugin_arg.sub!( /(.*)"\z/, '\1' )
    59985713
     
    60035718  end
    60045719
    6005   #=== Join# through のチェックと生成
    6006   # new_join の中の check_region で region 間の through が @region_through に設定される
    6007   # set_specifier で呼び口の結合で指定された through が @cp_through 設定される
    6008   # その後、このメソッドが呼ばれる
     5720  #=== Join# through のチェックと生成
     5721  # new_join の中の check_region で region 間の through が @region_through に設定される
     5722  # set_specifier で呼び口の結合で指定された through が @cp_through 設定される
     5723  # その後、このメソッドが呼ばれる
    60095724  def check_and_gen_through
    60105725
     
    60275742
    60285743    @through_list = @cp_through_list + @region_through_list
    6029       # 後から @cp_through_list と @region_through_list に分けたため、このような実è£
    6030 ã«ãªã£ãŸ
     5744      # 後から @cp_through_list と @region_through_list に分けたため、このような実装になった
    60315745
    60325746    if @through_list then           # nil when the join is not Port
    6033       len = @through_list.length    # through が連接している数
     5747      len = @through_list.length    # through が連接している数
    60345748    else
    60355749      len = 0
     
    60425756    end
    60435757
    6044     # 連続した through について、受け口側から順にセルを生成し解釈する
     5758    # 連続した through について、受け口側から順にセルを生成し解釈する
    60455759    i = len - 1
    60465760    while i >= 0
     
    60725786
    60735787      else
    6074         # 最後のセルの場合、次のセルの名前、ポート名
     5788        # 最後のセルの場合、次のセルの名前、ポート名
    60755789        next_cell      = @cell
    60765790        next_port_name = @port_name
     
    60785792
    60795793        if next_cell == nil then
    6080           # 結合å
    6081 ˆãŒãªã„
     5794          # 結合先がない
    60825795          return
    60835796        end
     
    60855798
    60865799      if i >= cp_len then
    6087         # region_through_list 部分
    6088         # region から @cell_name.@port_name への through がないか探す
     5800        # region_through_list 部分
     5801        # region から @cell_name.@port_name への through がないか探す
    60895802        # rp = @through_list[i][3].find_cell_port_through_plugin( @cell_name, @port_name ) #762
    60905803        rp = @through_list[i][3].find_cell_port_through_plugin( @cell.get_global_name, @port_name, @rhs_subscript )
    6091            # @through_list[i] と @region_through_list[i-cp_len] は同じ
    6092         # å
    6093 ±ç”¨ã—ないようにするには、見つからなかったことにすればよい
     5804           # @through_list[i] と @region_through_list[i-cp_len] は同じ
     5805        # 共用しないようにするには、見つからなかったことにすればよい
    60945806        # rp = nil
    60955807      else
    6096         # region 以外のものはå
    6097 ±æœ‰ã—ない
    6098         # 呼び口側に指定されているし、plugin_arg が異なるかもしれない
     5808        # region 以外のものは共有しない
     5809        # 呼び口側に指定されているし、plugin_arg が異なるかもしれない
    60995810        rp = nil
    61005811      end
     
    61065817        end
    61075818      else
    6108         # 見つかったものをå
    6109 ±ç”¨ã™ã‚‹
     5819        # 見つかったものを共用する
    61105820        @through_generated_list[ i ] = rp
    61115821      end
    61125822
    61135823      if i >= cp_len then
    6114         # @through_generated_list のうち @region_through_listに対応する部分
     5824        # @through_generated_list のうち @region_through_listに対応する部分
    61155825        @region_through_generated_list[ i - cp_len ] = @through_generated_list[ i ]
    61165826        if rp == nil then
    6117           # 生成したものを region(@through_list[i][3]) のリストに追加
     5827          # 生成したものを region(@through_list[i][3]) のリストに追加
    61185828          # @through_list[i][3].add_cell_port_through_plugin( @cell_name, @port_name, @through_generated_list[i] ) #762
    61195829          @through_list[i][3].add_cell_port_through_plugin( @cell.get_global_name, @port_name, @rhs_subscript, @through_generated_list[i] )
     
    61225832
    61235833      if i == 0 then
    6124         # 最も呼び口側のセルは、CDL 上の結合がないため、参ç
    6125 §ã•ã‚ŒãŸã“とにならない
    6126         # mikan namespace 対応
     5834        # 最も呼び口側のセルは、CDL 上の結合がないため、参照されたことにならない
     5835        # mikan namespace 対応
    61275836        # cell = Namespace.find( [ @through_generated_list[0].get_cell_name] )    #1
    61285837        if @through_generated_list[0] == nil then
    6129           return  # plugin_object の生成に失敗している
     5838          return  # plugin_object の生成に失敗している
    61305839        end
    61315840        cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
     
    61515860  end
    61525861
    6153   #=== Join# through プラグインを呼び出して CDL 生成させるとともに、import する
     5862  #=== Join# through プラグインを呼び出して CDL 生成させるとともに、import する
    61545863  def gen_through_cell_code_and_parse( plugin_name, i, next_cell, next_port_name, next_port_subscript, plClass )
    61555864
     
    61595868    plugin_arg            = through[ 2 ]
    61605869    if through[ 3 ] then
    6161       # region 間の through の場合
     5870      # region 間の through の場合
    61625871      @@start_region      = through[ 3 ]
    61635872      if next_cell.get_region.equal? @@start_region then
     
    61695878      @@region_count      = through[ 6 ]
    61705879    else
    6171       # 呼び口の through の場合
    6172       @@start_region      = @owner.get_region    # 呼び口側セルの region
    6173       @@end_region        = next_cell.get_region # 次のセルの region
    6174       @@through_type      = :THROUGH             # 呼び口の through 指定
     5880      # 呼び口の through の場合
     5881      @@start_region      = @owner.get_region    # 呼び口側セルの region
     5882      @@end_region        = next_cell.get_region # 次のセルの region
     5883      @@through_type      = :THROUGH             # 呼び口の through 指定
    61755884      @@region_count      = 0
    61765885    end
     
    61945903    @through_generated_list[ i ] = plugin_object
    61955904
    6196     # Region に関するæƒ
    6197 å ±ã‚’設定
    6198     # 後から追加したので、new の引数外で設定
     5905    # Region に関する情報を設定
     5906    # 後から追加したので、new の引数外で設定
    61995907    # plugin_object.set_through_info( start_region, end_region, through_type )
    62005908
     
    62025910  end
    62035911
    6204   #プラグインへの引数で渡さないものを、一時的に記憶しておく
    6205   # プラグインの initialize の中でコールバックして設定する
     5912  #プラグインへの引数で渡さないものを、一時的に記憶しておく
     5913  # プラグインの initialize の中でコールバックして設定する
    62065914  @@plugin_creating_join = nil
    62075915  @@start_region = nil
     
    62105918  @@region_count = nil
    62115919
    6212   #=== Join# ThroughPlugin の追加æƒ
    6213 å ±ã‚’設定する
    6214   # このメソッドは ThroughPlugin#initialize から呼び出される
    6215   # plugin_object を生成する際の引数では不足するæƒ
    6216 å ±ã‚’追加する
     5920  #=== Join# ThroughPlugin の追加情報を設定する
     5921  # このメソッドは ThroughPlugin#initialize から呼び出される
     5922  # plugin_object を生成する際の引数では不足する情報を追加する
    62175923  def self.set_through_info plugin_object
    62185924    plugin_object.set_through_info( @@start_region, @@end_region, @@through_type,
     
    62265932  end
    62275933
    6228   #=== Join#é
    6229 åˆ—添数を得る
    6230   # @subscript の説明を参ç
    6231 §ã®ã“と
     5934  #=== Join#配列添数を得る
     5935  # @subscript の説明を参照のこと
    62325936  def get_subscript
    62335937    @subscript
    62345938  end
    62355939
    6236   def get_cell_name         # 受け口セル名
     5940  def get_cell_name         # 受け口セル名
    62375941    @cell_name
    62385942  end
     
    62465950  end
    62475951
    6248   #=== Join# 右辺の実セルを得る
    6249   #    実セルとは through で挿å
    6250 ¥ã•ã‚ŒãŸã‚‚の、composite のå†
    6251 éƒ¨ãªã©å®Ÿéš›ã«çµåˆã•ã‚Œã‚‹å
    6252 ˆ
    6253   #    このメソッドは get_rhs_port と対になっている
    6254   #    このメソッドは、意味解析段階では呼び出してはならない (対象セルの意味解析が済む前には正しい結果を返さない)
     5952  #=== Join# 右辺の実セルを得る
     5953  #    実セルとは through で挿入されたもの、composite の内部など実際に結合される先
     5954  #    このメソッドは get_rhs_port と対になっている
     5955  #    このメソッドは、意味解析段階では呼び出してはならない (対象セルの意味解析が済む前には正しい結果を返さない)
    62555956  def get_rhs_cell
    6256     # through 指定あり?
     5957    # through 指定あり?
    62575958    if @through_list[0] then
    6258       # mikan through で生成したものが root namespace 限定
     5959      # mikan through で生成したものが root namespace 限定
    62595960      if @through_generated_list[0] then
    62605961        # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] )    #1
    62615962        cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
    6262         # cell が nil になるのはプラグインの get_cell_namespace_path が正しくないか、
    6263         # プラグイン生成コードがエラーになっている。
    6264         # できの悪いプラグインが多ければ、cell == nil をはじいた方がよい。
     5963        # cell が nil になるのはプラグインの get_cell_namespace_path が正しくないか、
     5964        # プラグイン生成コードがエラーになっている。
     5965        # できの悪いプラグインが多ければ、cell == nil をはじいた方がよい。
    62655966        return cell.get_real_cell( @through_generated_list[0].get_through_entry_port_name )
    62665967      else
    6267         return nil            # generate に失敗している
     5968        return nil            # generate に失敗している
    62685969      end
    62695970    elsif @cell then
    62705971      return @cell.get_real_cell( @port_name )
    62715972    else
    6272       # 右辺が未定義の場合 @cell は nil (既にエラー)
     5973      # 右辺が未定義の場合 @cell は nil (既にエラー)
    62735974      return nil
    62745975    end
    62755976  end
    62765977
    6277   #=== Join# 右辺のセルを得る
    6278   # 右辺のセルを得る。ただし、composite 展開されていない
    6279   # composite 展開されたものを得るには get_rhs_cell を使う
    6280   # プロトタイプ宣言しかされていない場合には、こちらしか使えない
    6281   # このメソッドは get_rhs_port2 と対になっている
     5978  #=== Join# 右辺のセルを得る
     5979  # 右辺のセルを得る。ただし、composite 展開されていない
     5980  # composite 展開されたものを得るには get_rhs_cell を使う
     5981  # プロトタイプ宣言しかされていない場合には、こちらしか使えない
     5982  # このメソッドは get_rhs_port2 と対になっている
    62825983  def get_rhs_cell2
    6283     # through 指定あり?
     5984    # through 指定あり?
    62845985    if @through_list[0] then
    6285       # mikan through で生成したものが root namespace 限定
     5986      # mikan through で生成したものが root namespace 限定
    62865987      # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name ] )
    62875988      if @through_generated_list[0] then
     
    62895990        cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
    62905991      else
    6291         cell = @cell            # generate に失敗している
     5992        cell = @cell            # generate に失敗している
    62925993      end
    62935994    else
     
    62985999  end
    62996000
    6300   #=== Join# 右辺のセルを得る
    6301   # through は適用しないが、composite は展開した後のセル
    6302   # (意味解析が終わっていないと、composite 展開が終わっていない)
    6303   # このメソッドは get_rhs_port3 と対になっている
     6001  #=== Join# 右辺のセルを得る
     6002  # through は適用しないが、composite は展開した後のセル
     6003  # (意味解析が終わっていないと、composite 展開が終わっていない)
     6004  # このメソッドは get_rhs_port3 と対になっている
    63046005  def get_rhs_cell3
    63056006    if @cell then
     
    63086009  end
    63096010
    6310   #=== Join# 右辺のセルのリージョンを得る
    6311   # 右辺が未定義の場合、nil を返す
    6312   # composite の場合、実セルではなく composite cell の region を返す(composite はすべて同じ region に属する)
    6313   # composite の cell がプロトタイプ宣言されているとき get_rhs_cell/get_real_cell は ruby の例外となる
     6011  #=== Join# 右辺のセルのリージョンを得る
     6012  # 右辺が未定義の場合、nil を返す
     6013  # composite の場合、実セルではなく composite cell の region を返す(composite はすべて同じ region に属する)
     6014  # composite の cell がプロトタイプ宣言されているとき get_rhs_cell/get_real_cell は ruby の例外となる
    63146015  def get_rhs_region
    6315     # through 指定あり?
     6016    # through 指定あり?
    63166017    if @through_list[0] then
    63176018      if @through_generated_list[0] then
    6318         # mikan through で生成したものが root namespace 限定
     6019        # mikan through で生成したものが root namespace 限定
    63196020        # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] )    #1
    63206021        cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
     
    63236024        end
    63246025      else
    6325         return nil       # generate に失敗している
     6026        return nil       # generate に失敗している
    63266027      end
    63276028    elsif @cell then
    63286029      return @cell.get_region
    63296030    end
    6330     # 右辺が未定義の場合 @cell は nil (既にエラー)
     6031    # 右辺が未定義の場合 @cell は nil (既にエラー)
    63316032    return nil
    63326033  end
    63336034
    6334   def get_cell_global_name  # 受け口セル名(コンポジットなら展開したå†
    6335 å´ã®ã‚»ãƒ«ï¼‰
     6035  def get_cell_global_name  # 受け口セル名(コンポジットなら展開した内側のセル)
    63366036
    63376037    # debug
     
    63476047  end
    63486048
    6349   #===  Join# 結合の右辺の受け口の名前
    6350   #     namespace 名 + '_' + セル名 + '_' + 受け口名   ï¼ˆã“のセルが composite ならば展開後のセル名、受け口名)
    6351   #subscript:: Integer  呼び口é
    6352 åˆ—の時添数 または nil 呼び口é
    6353 åˆ—でない時
    6354   def get_port_global_name( subscript = nil )  # 受け口名(コンポジットなら展開したå†
    6355 å´ã®ã‚»ãƒ«ï¼‰
     6049  #===  Join# 結合の右辺の受け口の名前
     6050  #     namespace 名 + '_' + セル名 + '_' + 受け口名   (このセルが composite ならば展開後のセル名、受け口名)
     6051  #subscript:: Integer  呼び口配列の時添数 または nil 呼び口配列でない時
     6052  def get_port_global_name( subscript = nil )  # 受け口名(コンポジットなら展開した内側のセル)
    63566053
    63576054    # debug
    63586055    dbgPrint "Cell get_port_global_name:  #{@cell_name}\n"
    63596056
    6360     # through 指定あり?
     6057    # through 指定あり?
    63616058    if @through_list[0] then
    63626059
    6363       # mikan through で生成したものが root namespace 限定
     6060      # mikan through で生成したものが root namespace 限定
    63646061      # cell = Namespace.find( [ "::", @through_generated_list[0].get_cell_name.to_sym ] )    #1
    63656062      cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
    63666063
    6367       # through で挿å
    6368 ¥ã•ã‚ŒãŸã‚»ãƒ«ã§ã€å®Ÿéš›ã«æŽ¥ç¶šã•ã‚Œã‚‹ã‚»ãƒ«ï¼ˆcompositeの場合å†
    6369 éƒ¨ã®)の受け口の C 言語名前
     6064      # through で挿入されたセルで、実際に接続されるセル(compositeの場合内部の)の受け口の C 言語名前
    63706065      return cell.get_real_global_port_name( @through_generated_list[0].get_through_entry_port_name )
    63716066    else
    63726067
    6373       # 実際に接続されるセルの受け口の C 言語名前
     6068      # 実際に接続されるセルの受け口の C 言語名前
    63746069      if @cell then
    63756070        return @cell.get_real_global_port_name( @port_name )
     
    63906085  end
    63916086
    6392   # 末尾数字1 : CDL で指定された、右辺のセルを返す
    6393   def get_rhs_cell1   # get_cell と同じ
     6087  # 末尾数字1 : CDL で指定された、右辺のセルを返す
     6088  def get_rhs_cell1   # get_cell と同じ
    63946089    @cell
    63956090  end
    6396   def get_rhs_port1   # get_port_name 同じ
     6091  def get_rhs_port1   # get_port_name 同じ
    63976092    @port_name
    63986093  end
     
    64016096  end
    64026097
    6403   #=== Join# 右辺のポートを得る
    6404   #    右辺が composite の場合は、å†
    6405 éƒ¨ã®ç¹‹ãŒã‚‹ã‚»ãƒ«ã®ãƒãƒ¼ãƒˆ, through の場合は挿å
    6406 ¥ã•ã‚ŒãŸã‚»ãƒ«ã®ãƒãƒ¼ãƒˆ
    6407   #    このメソッドは get_rhs_cell と対になっている
     6098  #=== Join# 右辺のポートを得る
     6099  #    右辺が composite の場合は、内部の繋がるセルのポート, through の場合は挿入されたセルのポート
     6100  #    このメソッドは get_rhs_cell と対になっている
    64086101  def get_rhs_port
    6409     # through 指定あり?
     6102    # through 指定あり?
    64106103    if @through_list[0] then
    6411       # through で生成されたセルを探す
     6104      # through で生成されたセルを探す
    64126105      cell = Namespace.find( @through_generated_list[0].get_cell_namespace_path )    #1
    6413       # cell のプラグインで生成されたポート名のポートを探す (composite ならå†
    6414 éƒ¨ã®ç¹‹ãŒã‚‹ãƒãƒ¼ãƒˆ)
     6106      # cell のプラグインで生成されたポート名のポートを探す (composite なら内部の繋がるポート)
    64156107      return cell.get_real_port( @through_generated_list[0].get_through_entry_port_name )
    64166108    else
    6417       # ポートを返す(composite ならå†
    6418 éƒ¨ã®ç¹‹ãŒã‚‹ãƒãƒ¼ãƒˆã‚’返す)
     6109      # ポートを返す(composite なら内部の繋がるポートを返す)
    64196110      return @cell.get_real_port( @port_name )
    64206111    end
    64216112  end
    64226113
    6423   #=== Join# 右辺のé
    6424 åˆ—添数を得る
    6425   #    右辺が through の場合は挿å
    6426 ¥ã•ã‚ŒãŸã‚»ãƒ«ã®æ·»æ•°
    6427   #    右辺が composite の場合は、å†
    6428 éƒ¨ã®ç¹‹ãŒã‚‹ã‚»ãƒ«ã®ãƒãƒ¼ãƒˆã®æ·»æ•° (composite では変わらない)
    6429   #    このメソッドは get_rhs_cell,  と対になっている
     6114  #=== Join# 右辺の配列添数を得る
     6115  #    右辺が through の場合は挿入されたセルの添数
     6116  #    右辺が composite の場合は、内部の繋がるセルのポートの添数 (composite では変わらない)
     6117  #    このメソッドは get_rhs_cell,  と対になっている
    64306118  def get_rhs_subscript
    64316119    if @through_list[0] then
     
    64366124  end
    64376125
    6438   #=== Join# 右辺のポートを得る
    6439   # 右辺のポートを得る。
    6440   # これはプロトタイプ宣言しかされていない場合には、こちらしか使えない
     6126  #=== Join# 右辺のポートを得る
     6127  # 右辺のポートを得る。
     6128  # これはプロトタイプ宣言しかされていない場合には、こちらしか使えない
    64416129  def get_rhs_port2
    6442     # through 指定あり?
     6130    # through 指定あり?
    64436131    if @through_list[0] then
    64446132      if @through_generated_list[0] then
    64456133        port = @through_generated_list[0].get_through_entry_port_name.to_sym
    64466134      else
    6447         port = @port_name    # generate に失敗している
     6135        port = @port_name    # generate に失敗している
    64486136      end
    64496137    else
     
    64546142  end
    64556143
    6456   #=== Join# 右辺のポートを得る
    6457   # through は適用しないが、composite は展開した後のセルの対応するポート
     6144  #=== Join# 右辺のポートを得る
     6145  # through は適用しないが、composite は展開した後のセルの対応するポート
    64586146  def get_rhs_port3
    64596147    if @cell then
     
    64626150  end
    64636151
    6464   #=== Join# 呼び口é
    6465 åˆ—の2番目以降の要素を追加する
    6466   #     ä¸€ç•ªæœ€åˆã«å®šç¾©ã•ã‚ŒãŸé
    6467 åˆ—要素がå
    6468 ¨è¦ç´ ã®åˆæœŸå€¤ã®é
    6469 åˆ—を持つ
    6470   #     ã“のメソッドは非é
    6471 åˆ—の場合も呼出される(join 重複エラーの場合)
    6472   #join2:: Join  呼び口é
    6473 åˆ—要素の Join
     6152  #=== Join# 呼び口配列の2番目以降の要素を追加する
     6153  #     一番最初に定義された配列要素が全要素の初期値の配列を持つ
     6154  #     このメソッドは非配列の場合も呼出される(join 重複エラーの場合)
     6155  #join2:: Join  呼び口配列要素の Join
    64746156  def add_array_member join2
    64756157
    6476     # subscript2: join2 の左辺添数
     6158    # subscript2: join2 の左辺添数
    64776159    subscript2 = join2.get_subscript
    64786160
    64796161    if @subscript == nil then           # not array : initialize duplicate
    6480       # 非é
    6481 åˆ—の場合、join が重複している
     6162      # 非配列の場合、join が重複している
    64826163      cdl_error( "S1127 \'$1\' duplicate", @name )
    64836164      # print "add_array_member2: #{@owner.get_name}\n"
    64846165
    64856166    elsif @subscript >= 0 then
    6486       # 添数指定ありの場合
     6167      # 添数指定ありの場合
    64876168      if( subscript2 == nil || subscript2 < 0 ) then
    6488         # join2 左辺は非é
    6489 åˆ—または添数なし
    6490         # é
    6491 åˆ—が不一致
     6169        # join2 左辺は非配列または添数なし
     6170        # 配列が不一致
    64926171        cdl_error( "S1128 \'$1\' inconsistent array definition", @name )
    64936172      elsif @array_member[subscript2] != nil then
    6494         # 同じ添数が既に定義済み
     6173        # 同じ添数が既に定義済み
    64956174        cdl_error( "S1129 \'$1\' redefinition of subscript $2" ,@name, subscript2 )
    64966175      else
    6497         # 添数の位置に要素を追加
     6176        # 添数の位置に要素を追加
    64986177        @array_member[subscript2] = join2.get_rhs
    64996178        @array_member2[subscript2] = join2
     
    65026181
    65036182    else
    6504       # 添数指定なしの場合
     6183      # 添数指定なしの場合
    65056184      if( subscript2 == nil || subscript2 >= 0 ) then
    6506         # join2 左辺は非é
    6507 åˆ—または添数有
    6508         # é
    6509 åˆ—が不一致
     6185        # join2 左辺は非配列または添数有
     6186        # 配列が不一致
    65106187        cdl_error( "S1130 \'R1\' inconsistent array definition", @name )
    65116188      end
    65126189
    6513       # 添数なしé
    6514 åˆ—の場合、é
    6515 åˆ—要素を追加
     6190      # 添数なし配列の場合、配列要素を追加
    65166191      @array_member  << join2.get_rhs
    65176192      @array_member2 << join2
     
    65376212      while i < @array_member2.length
    65386213        if @array_member2[i] != self && @array_member[i] != nil then
    6539           # @array_member2[i] が nil になるのは optional の時と、
    6540           # Join の initialize で無駄に @array_member2 が設定されている場合
    6541           # 無駄に設定されているものについては、再帰的に呼び出すå¿
    6542 è¦ã¯ãªã„(clone_for_composite では対策している)
     6214          # @array_member2[i] が nil になるのは optional の時と、
     6215          # Join の initialize で無駄に @array_member2 が設定されている場合
     6216          # 無駄に設定されているものについては、再帰的に呼び出す必要はない(clone_for_composite では対策している)
    65436217          @array_member2[i].change_name( name )
    65446218        end
     
    65486222  end
    65496223
    6550   # composite cell を展開したセルの結合を clone したセルの名前に変更
     6224  # composite cell を展開したセルの結合を clone したセルの名前に変更
    65516225  def change_rhs_port( clone_cell_list, celltype )
    65526226    dbgPrint "change_rhs_port: name=#{@name}\n"
     
    65726246    dbgPrint "  REWRITE cell_name:  #{@owner.get_name}   #{@cell_name} => #{c.get_global_name}, #{c.get_name}\n"
    65736247
    6574     # @rhs のå†
    6575 å®¹ã‚’調整しておく(このå†
    6576 å®¹ã¯ã€subscript を除いて、後から使われていない)
     6248    # @rhs の内容を調整しておく(この内容は、subscript を除いて、後から使われていない)
    65776249    elements = @rhs.get_elements
    6578     if elements[0] == :OP_SUBSC then  # 右辺:受け口é
    6579 åˆ—?
     6250    if elements[0] == :OP_SUBSC then  # 右辺:受け口配列?
    65806251      elements  = elements[1]
    65816252    end
    65826253
    6583     # 右辺が cell.ePort の形式でない
     6254    # 右辺が cell.ePort の形式でない
    65846255    if elements[0] != :OP_DOT || elements[1][0] != :IDENTIFIER then   #1
    65856256      return
    65866257    else
    6587       # セル名を composite å†
    6588 éƒ¨ã®åå‰ã‹ã‚‰ã€å¤–部の名前にå
    6589 ¥ã‚Œæ›¿ãˆã‚‹
     6258      # セル名を composite 内部の名前から、外部の名前に入れ替える
    65906259      # elements[1][1] = Token.new( c.get_name, nil, nil, nil )
    65916260      elements[1][1] = NamespacePath.new( c.get_name, false, c.get_namespace )
     
    65946263    @cell_name = c.get_name
    65956264    @cell = c
    6596     # @definition = nil          # @definition が有効: チェック済み(とは、しない)
     6265    # @definition = nil          # @definition が有効: チェック済み(とは、しない)
    65976266
    65986267    if @array_member2 then
     
    66036272      i = 0
    66046273      while i < @array_member2.length
    6605         # @array_member2[i] が nil になるのは optional の時と、
    6606         # Join の initialize で無駄に @array_member2 が設定されている場合
    6607         # 無駄に設定されているものについては、再帰的に呼び出すå¿
    6608 è¦ã¯ãªã„(clone_for_composite では対策している)
     6274        # @array_member2[i] が nil になるのは optional の時と、
     6275        # Join の initialize で無駄に @array_member2 が設定されている場合
     6276        # 無駄に設定されているものについては、再帰的に呼び出す必要はない(clone_for_composite では対策している)
    66096277        if @array_member2[i] != self && @array_member[i] != nil then
    66106278          dbgPrint "change_rhs array_member #{i}: #{@name}  #{@cell_name}\n"
     
    66176285  end
    66186286
    6619   #=== Join# composite セル用にクローン
    6620   #cell_global_name:: string : 親セルのグローバル名
    6621   # 右辺の C_EXP に含まれる $id$, $cell$, $ct$ を置換
    6622   # ここで置換するのは composite の attribute の C_EXP を composite セルタイプおよびセル名に置換するため
    6623   # (å†
    6624 éƒ¨ã‚»ãƒ«ã® C_EXP もここで置換される)
    6625   # @through_list などもコピーされるので、これが呼び出される前に確定するå¿
    6626 è¦ãŒã‚ã‚‹
     6287  #=== Join# composite セル用にクローン
     6288  #cell_global_name:: string : 親セルのグローバル名
     6289  # 右辺の C_EXP に含まれる $id$, $cell$, $ct$ を置換
     6290  # ここで置換するのは composite の attribute の C_EXP を composite セルタイプおよびセル名に置換するため
     6291  # (内部セルの C_EXP もここで置換される)
     6292  # @through_list などもコピーされるので、これが呼び出される前に確定する必要がある
    66276293  def clone_for_composite( ct_name, cell_name, locale, b_need_recursive = true )
    66286294    # debug
     
    66436309
    66446310  def clone_array_member( ct_name, cell_name, prev, locale )
    6645     # é
    6646 åˆ—のコピーを作る
     6311    # 配列のコピーを作る
    66476312    am  = @array_member.clone
    66486313    am2 = @array_member2.clone
    66496314
    6650     # é
    6651 åˆ—要素のコピーを作る
     6315    # 配列要素のコピーを作る
    66526316    i = 0
    66536317    while i < am2.length
    66546318      if @array_member2[i] == prev then
    6655         # 自分自身である(ので、呼出すと無限再帰呼出しとなる)
     6319        # 自分自身である(ので、呼出すと無限再帰呼出しとなる)
    66566320        am2[i] = self
    66576321        am[i] = am2[i].get_rhs
     
    66616325        am[i] = am2[i].get_rhs
    66626326      else
    6663         # 以前のエラーで array_member2[i] は nil になっている
     6327        # 以前のエラーで array_member2[i] は nil になっている
    66646328      end
    66656329
     
    66706334    end
    66716335
    6672     # i = 0 は、ここで自分自身を設定
     6336    # i = 0 は、ここで自分自身を設定
    66736337    # am2[0] = self
    66746338
     
    66786342  end
    66796343
    6680   #=== Join# rhs をå
    6681 ¥ã‚Œæ›ãˆã‚‹
     6344  #=== Join# rhs を入れ換える
    66826345  #rhs:: Expression | initializer
    6683   # 右辺をå
    6684 ¥ã‚Œæ›ãˆã‚‹ï¼Ž
    6685   # このメソッドは、composite で cell の属性の初期値を attribute の値で置き換えるのに使われる
    6686   # このメソッドは composite å†
    6687 ã® cell の属性の初期値が定数ではなく式になった場合、不要になる
     6346  # 右辺を入れ換える.
     6347  # このメソッドは、composite で cell の属性の初期値を attribute の値で置き換えるのに使われる
     6348  # このメソッドは composite 内の cell の属性の初期値が定数ではなく式になった場合、不要になる
    66886349  def change_rhs rhs
    66896350    @rhs = rhs
    66906351  end
    66916352
    6692   #=== Join# clone された join の owner を変更
     6353  #=== Join# clone された join の owner を変更
    66936354  def set_cloned( owner )
    66946355    dbgPrint "Join#set_cloned: #{@name}  prev owner: #{@owner.get_name} new owner: #{owner.get_name}\n"
     
    67846445end
    67856446
    6786 #== 逆結合
     6447#== 逆結合
    67876448class ReverseJoin < BDNode
    67886449#@ep_name:: Symbol
     
    68096470end
    68106471
    6811 # CLASS: CompositeCelltype 用の Join
    6812 # REM:   CompositeCelltype が export するもの
     6472# CLASS: CompositeCelltype 用の Join
     6473# REM:   CompositeCelltype が export するもの
    68136474class CompositeCelltypeJoin < BDNode
    6814 # @export_name:: string     :  CompositeCelltype が export する名前(呼び口、受け口、属性)
    6815 # @internal_cell_name:: string : CompositeCelltype å†
    6816 éƒ¨ã®ã‚»ãƒ«ã®åå‰
    6817 # @internal_cell_elem_name:: string : CompositeCelltype å†
    6818 éƒ¨ã®ã‚»ãƒ«ã®å‘¼ã³å£ã€å—け口、属性の名前
    6819 # @cell : Cell : Cell::  internal cell  : CompositeCelltyep å†
    6820 éƒ¨ã®ã‚»ãƒ«ï¼ˆin_compositeセル)
     6475# @export_name:: string     :  CompositeCelltype が export する名前(呼び口、受け口、属性)
     6476# @internal_cell_name:: string : CompositeCelltype 内部のセルの名前
     6477# @internal_cell_elem_name:: string : CompositeCelltype 内部のセルの呼び口、受け口、属性の名前
     6478# @cell : Cell : Cell::  internal cell  : CompositeCelltyep 内部のセル(in_compositeセル)
    68216479# @port_decl:: Port | Decl
    68226480# @b_pseudo: bool :
     
    68336491  end
    68346492
    6835   #=== CompositeCelltypeJoin# CompositeCelltypeJoin の対象セルか?
    6836   #cell::  Cell 対象かどうかチェックするセル
     6493  #=== CompositeCelltypeJoin# CompositeCelltypeJoin の対象セルか?
     6494  #cell::  Cell 対象かどうかチェックするセル
    68376495  #
    6838   #     CompositeCelltypeJoin と cell の名前が一致するかチェックする
    6839   #     port_decl が指定された場合は、現状使われていない
     6496  #     CompositeCelltypeJoin と cell の名前が一致するかチェックする
     6497  #     port_decl が指定された場合は、現状使われていない
    68406498  def match?( cell, port_decl = nil )
    68416499
     
    68536511
    68546512#    if @cell.equal?( cell ) && ( port_decl == nil || @port_decl.equal?( port_decl ) ) then
    6855     # なぜ port_decl が一致しなければならなかったか忘れた。
    6856     # recursive_composite で名前の一致に変更   060917
     6513    # なぜ port_decl が一致しなければならなかったか忘れた。
     6514    # recursive_composite で名前の一致に変更   060917
    68576515    if((@cell.get_name == cell.get_name) && (port_decl == nil || @port_decl.get_name == port_decl.get_name))then
    68586516      true
     
    68866544  end
    68876545
    6888   # @port_decl が Port の場合のみ呼び出してよい
     6546  # @port_decl が Port の場合のみ呼び出してよい
    68896547  def get_port_type
    68906548    if @port_decl then
     
    69086566  end
    69096567
    6910   # @port_decl が Port の場合のみ呼び出してよい
     6568  # @port_decl が Port の場合のみ呼び出してよい
    69116569  def is_require?
    69126570    if @port_decl then
     
    69156573  end
    69166574
    6917   # @port_decl が Port の場合のみ呼び出してよい
     6575  # @port_decl が Port の場合のみ呼び出してよい
    69186576  def is_allocator_port?
    69196577    if @port_decl then
     
    69226580  end
    69236581
    6924   # @port_decl が Port の場合のみ呼び出してよい
     6582  # @port_decl が Port の場合のみ呼び出してよい
    69256583  def is_optional?
    69266584    if @port_decl then
     
    69296587  end
    69306588
    6931   #=== CompositeCelltypeJoin# 右辺が Decl ならば初期化子(式)を返す
    6932   # このメソッドは Cell の check_join から初期値チェックのために呼び出される
     6589  #=== CompositeCelltypeJoin# 右辺が Decl ならば初期化子(式)を返す
     6590  # このメソッドは Cell の check_join から初期値チェックのために呼び出される
    69336591  def get_initializer
    69346592    if @port_decl.instance_of? Decl then
     
    69436601  end
    69446602
    6945   #=== CompositeCelltypeJoin# é
    6946 åˆ—サイズを得る
    6947   #RETURN:: nil: not array, "[]": 大きさ指定なし, Integer: 大きさ指定あり
     6603  #=== CompositeCelltypeJoin# 配列サイズを得る
     6604  #RETURN:: nil: not array, "[]": 大きさ指定なし, Integer: 大きさ指定あり
    69486605  def get_array_size
    69496606    @port_decl.get_array_size
    69506607  end
    69516608
    6952   #=== CompositeCelltypeJoin# signature を得る
    6953   # @port_decl が Port の時のみ呼び出してもよい
     6609  #=== CompositeCelltypeJoin# signature を得る
     6610  # @port_decl が Port の時のみ呼び出してもよい
    69546611  def get_signature
    69556612    @port_decl.get_signature
     
    69946651# @file_name:: string
    69956652# @format:: string
    6996 # @arg_list:: Expression の elements と同じ形式 [ [:IDENTIFIER, String], ... ]
     6653# @arg_list:: Expression の elements と同じ形式 [ [:IDENTIFIER, String], ... ]
    69976654# @f_celltype:: bool : true: celltype factory, false: cell factory
    69986655
     
    70056662    case name
    70066663    when :write
    7007       # write 関数
     6664      # write 関数
    70086665      @name = name
    70096666
    7010       # write 関数の第一引数:出力å
    7011 ˆãƒ•ã‚¡ã‚¤ãƒ«å
    7012         # 式を評価する(通常単一の文字列であるから、単一の文字列が返される)
     6667      # write 関数の第一引数:出力先ファイル名
     6668        # 式を評価する(通常単一の文字列であるから、単一の文字列が返される)
    70136669      @file_name = file_name.eval_const(nil).val  # file_name : Expression
    70146670      if ! @file_name.instance_of?( String ) then
    7015         # 文字列定数ではなかった
     6671        # 文字列定数ではなかった
    70166672        cdl_error( "S1132 $1: 1st parameter is not string(file name)" , @name )
    70176673        @file_name = nil
    70186674      end
    70196675
    7020       # write 関数の第二引数:フォーマット文字列
     6676      # write 関数の第二引数:フォーマット文字列
    70216677      @format    = format.eval_const(nil).val     # format : Expression
    7022         # 式を評価する(通常単一の文字列であるから、単一の文字列が返される)
     6678        # 式を評価する(通常単一の文字列であるから、単一の文字列が返される)
    70236679      if ! @format.instance_of?( String ) then
    7024         # 文字列定数ではなかった
     6680        # 文字列定数ではなかった
    70256681        cdl_error( "S1133 $1: 2nd parameter is not string(fromat)" , @name )
    70266682        @format = nil
    70276683      end
    70286684
    7029       # 第三引数以降を引数リストとする mikan 引数のチェック
     6685      # 第三引数以降を引数リストとする mikan 引数のチェック
    70306686      @arg_list = arg_list
    70316687
     
    71046760#== DomainType
    71056761#
    7106 # region の domain を記憶するクラス
     6762# region の domain を記憶するクラス
    71076763class DomainType < Node
    7108 #@name::Symbol : ドメインタイプの名前 ex) HRP2
     6764#@name::Symbol : ドメインタイプの名前 ex) HRP2
    71096765#@region::Region
    71106766#@plugin_name::Symbol : ex) HRP2Plugin
    71116767#@option::String : ex) "trusted", "nontrusted"
    7112 #@plugin::DomainPlugin の子クラス
     6768#@plugin::DomainPlugin の子クラス
    71136769
    71146770  include PluginModule
    71156771
    7116   # ドメインに属する region の Hash
    7117   # domain 指定が一度も行われない場合、このリストは空である
    7118   # ルートリージョンは option = "OutOfDomain" で登録される (domain 指定が無ければ登録されない)
     6772  # ドメインに属する region の Hash
     6773  # domain 指定が一度も行われない場合、このリストは空である
     6774  # ルートリージョンは option = "OutOfDomain" で登録される (domain 指定が無ければ登録されない)
    71196775  @@domain_regions = { }  # { :domain_type => [ region, ... ] }
    71206776
     
    71596815  end
    71606816
    7161   #== DomainType リージョンの Hash を得る
    7162   # @@domain_regions の説明参ç
    7163 §
     6817  #== DomainType リージョンの Hash を得る
     6818  # @@domain_regions の説明参照
    71646819  def self.get_domain_regions
    71656820    return @@domain_regions
     
    71746829  end
    71756830
    7176   #== DomainType#ドメイン種別を得る
     6831  #== DomainType#ドメイン種別を得る
    71776832  #return::Symbol :kernel, :user, :OutOfDomain
    71786833  def get_kind
     
    71866841end
    71876842
    7188 #== Region クラス
     6843#== Region クラス
    71896844#
    7190 # Region は Namespace を継承している
    7191 # root region は特殊で、root namespace と同じである
     6845# Region は Namespace を継承している
     6846# root region は特殊で、root namespace と同じである
    71926847#
    7193 # cell は region に属する
    7194 # region に属する cell のリストは Namespace クラスのインスタンス変数として記憶される
     6848# cell は region に属する
     6849# region に属する cell のリストは Namespace クラスのインスタンス変数として記憶される
    71956850#
    71966851class Region < Namespace
    71976852# @name:: string
    7198 # @in_through_list:: [ [ plugin_name, plugin_arg ], ... ] : plungin_name = nil の時 in 禁止
    7199 # @out_through_list:: [ [ plugin_name, plugin_arg ], ... ] : plungin_name = nil の時 out 禁止
     6853# @in_through_list:: [ [ plugin_name, plugin_arg ], ... ] : plungin_name = nil の時 in 禁止
     6854# @out_through_list:: [ [ plugin_name, plugin_arg ], ... ] : plungin_name = nil の時 out 禁止
    72006855# @to_through_list:: [ [ dst_region, plugin_name, plugin_arg ], ... ]
    7201 # @cell_port_throug_plugin_list:: { "#{cell_name}.#{port_name}" => through_generated_list の要素 }
    7202 #    この region から cell_name.port_name への through プラグインで生成されたオブジェクト
     6856# @cell_port_throug_plugin_list:: { "#{cell_name}.#{port_name}" => through_generated_list の要素 }
     6857#    この region から cell_name.port_name への through プラグインで生成されたオブジェクト
    72036858# @region_type::Symbol : :NODE, :LINKUNIT, :DOMAIN, :CLASS
    7204 # @region_type_param::Symbol : domain, class の名前. node, linkunit では nil
    7205 # @link_root:: Region : linkUnit の根っことなる region (node, linkunit が指定された region)
    7206 # @family_line:: [ @region_root, ...,@region_me ]  家系
    7207 # @in_through_count:: Integer :  n 番目の in_through 結合 (n>=0)
    7208 # @out_through_count:: Integer : n 番目の out_through 結合 (n>=0)
    7209 # @to_through_count:: { :RegionName => Integer }: RegionName への n 番目の to_through 結合 (n>=0)
    7210 # @domain_type::DomainType : domain 指定されていない場合、nil
    7211 # @domain_root::Region : domain 指定されていなる Region (root の場合 nil)
     6859# @region_type_param::Symbol : domain, class の名前. node, linkunit では nil
     6860# @link_root:: Region : linkUnit の根っことなる region (node, linkunit が指定された region)
     6861# @family_line:: [ @region_root, ...,@region_me ]  家系
     6862# @in_through_count:: Integer :  n 番目の in_through 結合 (n>=0)
     6863# @out_through_count:: Integer : n 番目の out_through 結合 (n>=0)
     6864# @to_through_count:: { :RegionName => Integer }: RegionName への n 番目の to_through 結合 (n>=0)
     6865# @domain_type::DomainType : domain 指定されていない場合、nil
     6866# @domain_root::Region : domain 指定されていなる Region (root の場合 nil)
    72126867
    72136868  @@in_through_list  = []
     
    72176872  @@region_type_param = nil
    72186873  @@domain_name = nil
    7219   @@domain_option = nil    # Token がå
    7220 ¥ã‚‹
     6874  @@domain_option = nil    # Token が入る
    72216875
    72226876  @@link_roots = []
    72236877
    72246878  def initialize( name )
    7225     # mikan name の Namespace 修飾
    7226     # object = Namespace.find( [ name ] )   # 親まで捜しにいく
     6879    # mikan name の Namespace 修飾
     6880    # object = Namespace.find( [ name ] )   # 親まで捜しにいく
    72276881    if name != "::" then
    72286882      object = Namespace.get_current.find( name )    #1
    72296883    else
    7230       # root リージョン
     6884      # root リージョン
    72316885      object = nil
    72326886      @@region_type = :NODE
     
    72656919        dbgPrint "Region.new: re-appear #{@name}\n"
    72666920
    7267         # # Region path が前回出現と一致するか?
     6921        # # Region path が前回出現と一致するか?
    72686922        # if @@region_stack[ @@region_stack_sp - 1 ] then
    72696923        #   my_path = @@region_stack[ @@region_stack_sp - 1 ].get_path_string.to_s + "." + @name.to_s
     
    72756929        # end
    72766930
    7277         # 再出現
     6931        # 再出現
    72786932        # @@region_stack[@@region_stack_sp] = object
    72796933
    7280         # 再出現時に specifier が指定されているか?
     6934        # 再出現時に specifier が指定されているか?
    72816935        if( @in_through_list.length != 0 || @out_through_list.length != 0 || @to_through_list.length != 0 ||
    72826936            @region_type != nil || @domain_type != nil )then
     
    72866940
    72876941      else
    7288         # エラー用ダミー定義
    7289 
    7290         # 異なる同名のオブジェクトが定義済み
     6942        # エラー用ダミー定義
     6943
     6944        # 異なる同名のオブジェクトが定義済み
    72916945        cdl_error( "S1141 $1 duplication, previous one : $2" , name, object.class )
    7292         # @@region_stack[@@region_stack_sp] = self    # エラー時暫定 region
    7293       end
    7294     else
    7295       # 初出現
     6946        # @@region_stack[@@region_stack_sp] = self    # エラー時暫定 region
     6947      end
     6948    else
     6949      # 初出現
    72966950      dbgPrint "Region.new: #{@name}\n"
    72976951      set_region_family_line
     
    73467000  end
    73477001
    7348   #== Region ルートリージョンを得る
    7349   # ルートリージョンは、ルートネームスペースと同じである
     7002  #== Region ルートリージョンを得る
     7003  # ルートリージョンは、ルートネームスペースと同じである
    73507004  def self.get_root
    73517005    Namespace.get_root
     
    73557009
    73567010    dbgPrint  "set_region_family_line: Region: #{@name}  \n"
    7357     # root namespace (root region) の region type は :NODE
     7011    # root namespace (root region) の region type は :NODE
    73587012    if @name == "::" then
    73597013      @region_type = :NODE
     
    73737027
    73747028    if @domain_type then
    7375       # ルートリージョンが最初から @domain_type 設定されることはないの
    7376       # で @owner == nil を調べるå¿
    7377 è¦ã¯ãªã„
     7029      # ルートリージョンが最初から @domain_type 設定されることはないの
     7030      # で @owner == nil を調べる必要はない
    73787031      @owner.set_domain_type @domain_type
    73797032    end
     
    73897042    @link_root = nil
    73907043
    7391     # @family_line を作成する
    7392     # @link_root もみつける
    7393     # (上位にたどっていって Region で node または linkunit のいずれかå
    7394 ˆã«è¦‹ã¤ã‹ã£ãŸã‚‚のが @link_root となる)
    7395     # root namespace は Region かつ node なのでå¿
    7396 ãš @link_root は見つかる
    7397     # mikan: self が node, linkUnit の場合、ここで期å¾
    7398 ã—たとおりに設定されないため、Region#initialize で再設定
     7044    # @family_line を作成する
     7045    # @link_root もみつける
     7046    # (上位にたどっていって Region で node または linkunit のいずれか先に見つかったものが @link_root となる)
     7047    # root namespace は Region かつ node なので必ず @link_root は見つかる
     7048    # mikan: self が node, linkUnit の場合、ここで期待したとおりに設定されないため、Region#initialize で再設定
    73997049    obj = self
    74007050    while 1
     
    74077057        end
    74087058      else
    7409         # さもなければ Namespace
    7410         # namespace の下に region がある場合
    7411       end
    7412 
    7413       # root namespace にたどり着けば終り
     7059        # さもなければ Namespace
     7060        # namespace の下に region がある場合
     7061      end
     7062
     7063      # root namespace にたどり着けば終り
    74147064      break if obj.get_name == "::"
    74157065
     
    74227072  end
    74237073
    7424   #== Region#ドメインを設定する
     7074  #== Region#ドメインを設定する
    74257075  def set_domain_type domain_type
    74267076    if @region_type == :NODE then
     
    74667116  end
    74677117
    7468   #== Region# domain の根っことなる region を得る
    7469   # Region のインスタンスを返す
    7470   # domain 指定子があれば、そのリージョンがドメインルートである
    7471   # なければ、親リージョンのドメインルートとする
     7118  #== Region# domain の根っことなる region を得る
     7119  # Region のインスタンスを返す
     7120  # domain 指定子があれば、そのリージョンがドメインルートである
     7121  # なければ、親リージョンのドメインルートとする
    74727122  def get_domain_root
    74737123    @domain_root
     
    74937143  end
    74947144
    7495   #== Region# ルートリージョン
    7496   # ルートリージョンは、namespace のルートと同じインスタンス
     7145  #== Region# ルートリージョン
     7146  # ルートリージョンは、namespace のルートと同じインスタンス
    74977147  def selfget_root
    74987148    Namespace.get_root
     
    75157165  end
    75167166
    7517   #=== Region# 構文解析中の region を得る
    7518   # 構文解析中 Namespace (あるいは子クラスの Region) の上位をたどって Region を見つける
    7519   # cell が namespace 下におくことができなければ、ループをまわすå¿
    7520 è¦ã¯ãªã„
     7167  #=== Region# 構文解析中の region を得る
     7168  # 構文解析中 Namespace (あるいは子クラスの Region) の上位をたどって Region を見つける
     7169  # cell が namespace 下におくことができなければ、ループをまわす必要はない
    75217170  def self.get_current
    75227171    # @@region_stack[@@region_stack_sp]
     
    75317180  end
    75327181
    7533   #=== Region# through プラグインで、この region から cell_name.port_name へのプラグインオブジェクトを登録
    7534   # mikan namesppace 対応 (cell_name)
     7182  #=== Region# through プラグインで、この region から cell_name.port_name へのプラグインオブジェクトを登録
     7183  # mikan namesppace 対応 (cell_name)
    75357184  def add_cell_port_through_plugin( cell_name, port_name, subscript, through_plugin_object )
    75367185    if subscript then
     
    75537202  end
    75547203
    7555   #=== Region# to_region への距離(unreachable な場合 nil)
    7556   # mikan Cell#check_region とRegion へたどり着くまでための処理にå
    7557 ±é€šæ€§ãŒé«˜ã„
    7558   # region#distance は require で用いられる
     7204  #=== Region# to_region への距離(unreachable な場合 nil)
     7205  # mikan Cell#check_region とRegion へたどり着くまでための処理に共通性が高い
     7206  # region#distance は require で用いられる
    75597207  def distance( to_region )
    75607208
    7561     r1 = self                   # 出発 region
    7562     r2 = to_region              # 目的 region
     7209    r1 = self                   # 出発 region
     7210    r2 = to_region              # 目的 region
    75637211    dist = 0
    75647212
    7565     if ! r1.equal? r2 then      # 同一 region なら呼出し可能
    7566 
    7567       # mikan namespace 対応
     7213    if ! r1.equal? r2 then      # 同一 region なら呼出し可能
     7214
     7215      # mikan namespace 対応
    75687216      f1 = r1.get_family_line
    75697217      len1 = f1.length
     
    75717219      len2 = f2.length
    75727220
    7573       # 不一致になるところ(å
    7574 „弟)を探す
    7575       i = 1  # i = 0 は :RootRegion なのでå¿
    7576 ãšä¸€è‡´
     7221      # 不一致になるところ(兄弟)を探す
     7222      i = 1  # i = 0 は :RootRegion なので必ず一致
    75777223      while( i < len1 && i < len2 )
    75787224        if( f1[i] != f2[i] )then
     
    75827228      end
    75837229
    7584       sibling_level = i     # å
    7585 „弟となるレベル、もしくはどちらか一方が終わったレベル
     7230      sibling_level = i     # 兄弟となるレベル、もしくはどちらか一方が終わったレベル
    75867231
    75877232      # p "sibling_level: #{i}"
     
    75897234      # p "to: #{f2[i].get_name}" if f2[i]
    75907235
    7591       # 呼び側について呼びå
    7592 ƒã®ãƒ¬ãƒ™ãƒ«ã‹ã‚‰å
    7593 „弟レベルまで(out_through をチェックおよび挿å
    7594 ¥ï¼‰
     7236      # 呼び側について呼び元のレベルから兄弟レベルまで(out_through をチェックおよび挿入)
    75957237      i = len1 -1
    75967238      while i >= sibling_level
     
    76157257      end
    76167258
    7617       # å
    7618 „弟レベルにおいて(to_through をチェックおよび挿å
    7619 ¥ï¼‰
     7259      # 兄弟レベルにおいて(to_through をチェックおよび挿入)
    76207260      if f1[sibling_level] && f2[sibling_level] then
    76217261        dbgPrint "going from #{f1[sibling_level].get_name} to #{f2[sibling_level].get_name}\n"
     
    76327272          found = 0
    76337273          f1[sibling_level].get_to_through_list.each { |t|
    7634             if t[0][0] == f2[sibling_level].get_name then   # region 名が一致するか ?
     7274            if t[0][0] == f2[sibling_level].get_name then   # region 名が一致するか ?
    76357275              found = 1
    76367276            end
     
    76437283      end
    76447284
    7645       # 受け側についてå
    7646 „弟レベルから受け側のレベルまで(in_through をチェックおよび挿å
    7647 ¥ï¼‰
     7285      # 受け側について兄弟レベルから受け側のレベルまで(in_through をチェックおよび挿入)
    76487286      i = sibling_level
    76497287      while i < len2
     
    77567394class Import_C < Node
    77577395
    7758   # ヘッダの名前文字列のリスト
     7396  # ヘッダの名前文字列のリスト
    77597397  @@header_list = {}
    77607398  @@header_list2 = []
     
    77637401  include Importable
    77647402
    7765   #=== Import_C# import_C の生成(ヘッダファイルを取込む)
    7766   #header:: Token : import_C の第一引数文字列リテラルトークン
    7767   #define:: Token : import_C の第二引数文字列リテラルトークン
     7403  #=== Import_C# import_C の生成(ヘッダファイルを取込む)
     7404  #header:: Token : import_C の第一引数文字列リテラルトークン
     7405  #define:: Token : import_C の第二引数文字列リテラルトークン
    77687406  def initialize( header, define = nil )
    77697407    super()
    7770     # ヘッダファイル名文字列から前後の "" を取り除く
     7408    # ヘッダファイル名文字列から前後の "" を取り除く
    77717409    # header = header.to_s.gsub( /\A"(.*)"\z/, '\1' )
    77727410    header = CDLString.remove_dquote header.to_s
    77737411
    77747412    if define then
    7775       # 前後の "" を取り除く
     7413      # 前後の "" を取り除く
    77767414      # def_opt = define.to_s.gsub( /\A"(.*)/, '\1' )
    77777415      # def_opt.sub!( /(.*)"\z/, '\1' )
    77787416      def_opt = CDLString.remove_dquote define.to_s
    77797417
    7780       # "," を -D に置き換え
     7418      # "," を -D に置き換え
    77817419      def_opt = def_opt.gsub( /,/, " -D " )
    77827420
    7783       # å
    7784 ˆé ­ã« -D を挿å
    7785 ¥ # mikan 不適切な define å
    7786 ¥åŠ›ãŒã‚った場合、CPP 時にエラー
     7421      # 先頭に -D を挿入 # mikan 不適切な define 入力があった場合、CPP 時にエラー
    77877422      def_opt = def_opt.gsub( /^/, "-D " )
    77887423
    77897424    end
    77907425
    7791     # コマンドライン指定された DEFINE
     7426    # コマンドライン指定された DEFINE
    77927427    $define.each{ |define|
    77937428      if $IN_EXERB then
     
    78137448      if found == false then
    78147449        begin
    7815           # ファイルの stat を取ってみる(なければ例外発生)
     7450          # ファイルの stat を取ってみる(なければ例外発生)
    78167451          File.stat( "#{path}/#{header}" )
    78177452
    7818           # cdl を見つかったファイルパスに再設定
     7453          # cdl を見つかったファイルパスに再設定
    78197454          header_path = "#{path}/#{header}"
    78207455          found = true
     
    78437478    }
    78447479
    7845     # 読込み済み?
     7480    # 読込み済み?
    78467481    if( @@header_list[ header ] ) then
    7847       # 第二引数 define が以前と異なる
     7482      # 第二引数 define が以前と異なる
    78487483      if @@define_list[ header ].to_s != define.to_s then
    78497484        cdl_error( "S1143 import_C: arg2: mismatch with previous one"  )
    78507485      end
    7851       # いずれにせよ読み込まない
     7486      # いずれにせよ読み込まない
    78527487      return
    78537488    end
    78547489
    7855     # ヘッダのリストを記録
     7490    # ヘッダのリストを記録
    78567491    @@header_list[ header ] = header_path
    78577492    @@header_list2 << header
     
    78817516    end
    78827517
    7883     # CPP 出力用 tmp ファイル名
     7518    # CPP 出力用 tmp ファイル名
    78847519    tmp_header = header.gsub( /\//, "_" )
    78857520    tmp_header = "#{$gen}/tmp_#{tmp_header}"
    78867521
    7887     # CPP コマンドラインを作成
     7522    # CPP コマンドラインを作成
    78887523    cmd = "#{$cpp} #{def_opt} #{include_opt} #{tmp_C}"
    78897524
     
    78937528      end
    78947529
    7895       # プリプロセッサコマンドを pipe として開く
    7896           # cmd は cygwin/Linux では bash(sh) 経由で実行される
    7897           # Exerb 版では cmd.exe 経由で実行される
    7898           # この差は引き数の (), $, % などシェルの特別な文字の評価に現れるので注意
     7530      # プリプロセッサコマンドを pipe として開く
     7531          # cmd は cygwin/Linux では bash(sh) 経由で実行される
     7532          # Exerb 版では cmd.exe 経由で実行される
     7533          # この差は引き数の (), $, % などシェルの特別な文字の評価に現れるので注意
    78997534          cpp = IO.popen( cmd, "r:ASCII-8BIT" )
    79007535      begin
     
    79097544        print_exception( evar )
    79107545      ensure
    7911         tmp_file.close if tmp_file    # mikan File.open に失敗した時 tmp_file == nil は保証されている ?
     7546        tmp_file.close if tmp_file    # mikan File.open に失敗した時 tmp_file == nil は保証されている ?
    79127547        cpp.close
    79137548      end
     
    79177552    end
    79187553
    7919     # C 言語のパーサインスタンスを生成
     7554    # C 言語のパーサインスタンスを生成
    79207555    c_parser = C_parser.new
    79217556
    7922     # tmp_header をパース
     7557    # tmp_header をパース
    79237558    c_parser.parse( [tmp_header] )
    79247559
    7925     # 終期化 パーサスタックを戻す
     7560    # 終期化 パーサスタックを戻す
    79267561    c_parser.finalize
    79277562
     
    79847619
    79857620class Import < Node
    7986 # @b_reuse::bool:       å†åˆ©ç”¨ï¼Žã‚»ãƒ«ã‚¿ã‚¤ãƒ—の template 生成不要
    7987 # @b_reuse_real::bool:  実際に再利用
    7988 # @cdl::      string:   import する CDL
    7989 # @cdl_path:: string:   CDL のパス
    7990 # @b_imported:: bool:   import された(コマンドライン指定されていない)
     7621# @b_reuse::bool:       再利用.セルタイプの template 生成不要
     7622# @b_reuse_real::bool:  実際に再利用
     7623# @cdl::      string:   import する CDL
     7624# @cdl_path:: string:   CDL のパス
     7625# @b_imported:: bool:   import された(コマンドライン指定されていない)
    79917626
    79927627  include Importable
    79937628
    7994   # ヘッダの名前文字列のリスト  添字:expand したパス、値:Import
     7629  # ヘッダの名前文字列のリスト  添字:expand したパス、値:Import
    79957630  @@import_list = {}
    79967631
     
    80137648  end
    80147649
    8015   #=== Import# import を行う
    8016   #cdl::      string   cdl へのパス."" で囲まれていることを仮定
    8017   #b_reuse::  bool     true: template を生成しない
     7650  #=== Import# import を行う
     7651  #cdl::      string   cdl へのパス."" で囲まれていることを仮定
     7652  #b_reuse::  bool     true: template を生成しない
    80187653  def initialize( cdl, b_reuse = false, b_imported = true )
    80197654    Import.push self
     
    80217656    super()
    80227657    @@current_import = self
    8023     # ヘッダファイル名文字列から前後の "", <> を取り除くn
     7658    # ヘッダファイル名文字列から前後の "", <> を取り除くn
    80247659    @cdl = cdl.to_s.gsub( /\A["<](.*)[">]\z/, '\1' )
    80257660
    8026     # サーチパスから探す
     7661    # サーチパスから探す
    80277662    found = false
    80287663    @cdl_path = ""
     
    80477682    end
    80487683
    8049     # 読込み済みなら、読込まない
     7684    # 読込み済みなら、読込まない
    80507685    prev = @@import_list[ File.expand_path( @cdl_path ) ]
    80517686    if( prev ) then
     
    80567691    end
    80577692
    8058     # import リストを記録
     7693    # import リストを記録
    80597694    @@import_list[ File.expand_path( @cdl_path ) ] = self
    80607695
    8061     # plugin から import されている場合
     7696    # plugin から import されている場合
    80627697    plugin = Generator.get_plugin
    80637698
    8064     # パーサインスタンスを生成(別パーサで読み込む)
     7699    # パーサインスタンスを生成(別パーサで読み込む)
    80657700    parser = Generator.new
    80667701
    8067     # plugin から import されている場合の plugin 設定
     7702    # plugin から import されている場合の plugin 設定
    80687703    parser.set_plugin plugin
    80697704
    8070     # reuse フラグを設定
     7705    # reuse フラグを設定
    80717706    parser.set_reuse @b_reuse_real
    80727707
    8073     # cdl をパース
     7708    # cdl をパース
    80747709    parser.parse( [@cdl_path] )
    80757710
    8076     # 終期化 パーサスタックを戻す
     7711    # 終期化 パーサスタックを戻す
    80777712    parser.finalize
    80787713    Import.pop
     
    80997734  end
    81007735
    8101   #=== cdl の名前を返す
    8102   # 引数で指定されている cdl 名。一部パスを含む可能性がある
     7736  #=== cdl の名前を返す
     7737  # 引数で指定されている cdl 名。一部パスを含む可能性がある
    81037738  def get_cdl_name
    81047739    @cdl
     
    81067741end
    81077742
    8108 #== generate: signature, celltype, cell へのプラグインのロードと適用
     7743#== generate: signature, celltype, cell へのプラグインのロードと適用
    81097744class Generate < Node
    81107745#@plugin_name:: Symbol
    81117746#@object_nsp:: NamespacePath
    8112 #@option::         String '"', '"' で囲まれている
     7747#@option::         String '"', '"' で囲まれている
    81137748#@plugin_object:: Plugin
    81147749
     
    81197754    @plugin_name = plugin_name
    81207755    @object_nsp = object_nsp
    8121     option = option.to_s    # option は Token
     7756    option = option.to_s    # option Token
    81227757    @option = option
    81237758    @plugin_object = nil
     
    81327767      @plugin_object = object.apply_plugin( @plugin_name, @option )
    81337768    elsif object then
    8134       # V1.5.0 以前の仕様では、signature のみ可能だった
     7769      # V1.5.0 以前の仕様では、signature のみ可能だった
    81357770#      cdl_error( "S1149 $1 not signature" , signature_nsp )
    81367771      cdl_error( "S9999 generate: '$1' neither signature, celltype nor cell", object_nsp )
     
    81427777end
    81437778
    8144 #== 名前空間パス
     7779#== 名前空間パス
    81457780class NamespacePath < Node
    81467781#@b_absolute::Bool
    81477782#@path::[ Symbol,... ]
    8148 #@namespace::Namespace:  @b_absolute == false のとき、基点となる namespace
     7783#@namespace::Namespace:  @b_absolute == false のとき、基点となる namespace
    81497784
    81507785  #=== NamespacePath# initialize
    8151   #ident::Symbol           æœ€åˆã®åå‰, ただし "::" のみの場合は String
    8152   #b_absolute:Bool         "::" で始まっている場合 true
    8153   #namespace::Namespace    b_absolute = false かつ、構文解釈段階以外で呼び出す場合は、å¿
    8154 ãšæŒ‡å®šã™ã‚‹ã“と
     7786  #ident::Symbol           最初の名前, ただし "::" のみの場合は String
     7787  #b_absolute:Bool         "::" で始まっている場合 true
     7788  #namespace::Namespace    b_absolute = false かつ、構文解釈段階以外で呼び出す場合は、必ず指定すること
    81557789  def initialize( ident, b_absolute, namespace = nil )
    81567790    super()
     
    81787812  end
    81797813
    8180   #=== NamespacePath# append する
     7814  #=== NamespacePath# append する
    81817815  #RETURN self
    8182   # このメソッドは、å
    8183 ƒã® NamespacePath オブジェクトを変形して返す
     7816  # このメソッドは、元の NamespacePath オブジェクトを変形して返す
    81847817  def append!( ident )
    81857818    @path << ident
    81867819    return self
    81877820  end
    8188   #=== NamespacePath# append する
    8189   # このメソッドは、å
    8190 ƒã® NamespacePath オブジェクトを変形しない
    8191   #RETURN:: 複製した NamespacePath
     7821  #=== NamespacePath# append する
     7822  # このメソッドは、元の NamespacePath オブジェクトを変形しない
     7823  #RETURN:: 複製した NamespacePath
    81927824  def append( ident )
    81937825    cl = self.clone
     
    82057837  end
    82067838
    8207   #=== NamespacePath#クローンを作成して名前を変更する
     7839  #=== NamespacePath#クローンを作成して名前を変更する
    82087840  def change_name name
    82097841    cl = self.clone
     
    82147846  alias :change_name_clone :change_name
    82157847
    8216   #=== NamespacePath#名前を変更する
    8217   # このインスタンスを参ç
    8218 §ã™ã‚‹ã™ã¹ã¦ã«å½±éŸ¿ã‚’与えることに注意
     7848  #=== NamespacePath#名前を変更する
     7849  # このインスタンスを参照するすべてに影響を与えることに注意
    82197850  def change_name_no_clone name
    82207851    @path[ @path.length - 1 ] = name
     
    82227853  end
    82237854
    8224   #=== NamespacePath:: path 文字列を得る
    8225   # CDL 用の path 文字列を生成
     7855  #=== NamespacePath:: path 文字列を得る
     7856  # CDL 用の path 文字列を生成
    82267857  def to_s
    82277858    get_path_str
     
    82527883  end
    82537884
    8254   #=== NamespacePath:: パスのé
    8255 åˆ—を返す
    8256   # is_absolute? true の場合、ルートからのパス
    8257   #              false の場合、base_namespace からの相対
    8258   # ルート namespace の場合、長さ0のé
    8259 åˆ—を返す
     7885  #=== NamespacePath:: パスの配列を返す
     7886  # is_absolute? true の場合、ルートからのパス
     7887  #              false の場合、base_namespace からの相対
     7888  # ルート namespace の場合、長さ0の配列を返す
    82607889  #
    82617890  def get_path
     
    82637892  end
    82647893
    8265   #=== NamespacePath#フルパスのé
    8266 åˆ—を返す
    8267   # 返されたé
    8268 åˆ—を書き換えてはならない
     7894  #=== NamespacePath#フルパスの配列を返す
     7895  # 返された配列を書き換えてはならない
    82697896  def get_full_path
    82707897    if @b_absolute then
     
    82757902  end
    82767903
    8277   #=== NamespacePath:: 相対パスのベースとなる namespace
    8278   # is_absolute? == false の時のみ有効な値を返す (true なら nil)
     7904  #=== NamespacePath:: 相対パスのベースとなる namespace
     7905  # is_absolute? == false の時のみ有効な値を返す (true なら nil)
    82797906  def get_base_namespace
    82807907    @namespace
    82817908  end
    82827909
    8283   #=== NamespacePath:: C 言語グローバル名を得る
     7910  #=== NamespacePath:: C 言語グローバル名を得る
    82847911  def get_global_name
    82857912    if @b_absolute then
     
    82997926  end
    83007927
    8301   #=== NamespacePath:: 分解して NamespacePath インスタンスを生成する
    8302   #path_str:: String       : namespace または region のパス ex) "::path::A" , "::", "ident"
    8303   #b_force_absolute:: Bool : "::" で始まっていない場合でも絶対パスに扱う
     7928  #=== NamespacePath:: 分解して NamespacePath インスタンスを生成する
     7929  #path_str:: String       : namespace または region のパス ex) "::path::A" , "::", "ident"
     7930  #b_force_absolute:: Bool : "::" で始まっていない場合でも絶対パスに扱う
    83047931  #
    8305   # NamespacePath は通常構文解析されて作成される
    8306   # このメソッドは、オプションなどで指定される文字列を分解して NamespacePath を生成するのに用いる
    8307   # チェックはゆるい。不適切なパス指定は、不適切な NamespacePath が生成される
     7932  # NamespacePath は通常構文解析されて作成される
     7933  # このメソッドは、オプションなどで指定される文字列を分解して NamespacePath を生成するのに用いる
     7934  # チェックはゆるい。不適切なパス指定は、不適切な NamespacePath が生成される
    83087935  def self.analyze( path_str, b_force_absolute = false )
    83097936
     
    83447971end
    83457972
    8346 # 以下単体テストコード
     7973# 以下単体テストコード
    83477974if $unit_test then
    83487975  root_namespace = Namespace.new("::")
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/ctypes.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2017 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
    5237#   $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    elsif self.instance_of?( CFloatType ) then
    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 )
     
    145130  end
    146131
    147   #=== qualifier を設定する
    148   #     å
    149 ƒã® Type クラスでは矛盾チェックしない(TECSの本来の文法では重複指定できないため)
     132  #=== qualifier を設定する
     133  #     元の Type クラスでは矛盾チェックしない(TECSの本来の文法では重複指定できないため)
    150134  def set_qualifier( qual )
    151135
     
    184168
    185169  def initialize( bit_size )
    186     #p super.class   mikan super.class が Symbol だ、なぜ?
     170    #p super.class   mikan super.class が Symbol だ、なぜ?
    187171    super( bit_size )
    188172  end
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/expression.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2017 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
    5237#   $Id$
     
    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
     
    247230  end
    248231
    249   #=== Expression# 逆ポーランド文字列化
    250   #param_list:: ParamlList  関数の引数リスト
     232  #=== Expression# 逆ポーランド文字列化
     233  #param_list:: ParamlList  関数の引数リスト
    251234  def get_rpn( param_list = nil, name_list2 = nil )
    252235    return elements_rpn( @elements, param_list, name_list2 )
    253236  end
    254237
    255   #=== Expression# 逆ポーランド文字列化 (private)
    256   #name_list:: ParamlList  関数の引数リスト
     238  #=== Expression# 逆ポーランド文字列化 (private)
     239  #name_list:: ParamlList  関数の引数リスト
    257240  def elements_rpn( elements, name_list = nil, name_list2 = nil )
    258241    if elements.instance_of? Token then
    259242      print "rpn: #{elements.to_s}\n"
    260       return elements.to_s    # OP_DOT, OP_REF の右辺
     243      return elements.to_s    # OP_DOT, OP_REF の右辺
    261244    end
    262245
     
    354337  end
    355338
    356   # 定数式(elements)を評価する
     339  # 定数式(elements)を評価する
    357340  #
    358   # このメソッドは Expression クラスのメソッドであるå¿
    359 è¦ã¯ãªã„(関数化できる)
     341  # このメソッドは Expression クラスのメソッドである必要はない(関数化できる)
    360342  #
    361   # elements は式の要素
     343  # elements は式の要素
    362344  #
    363   # name_list, name_list2 は eval_const を参ç
    364 §
     345  # name_list, name_list2 は eval_const を参照
    365346  #
    366   # RETURN: 評価した定数、評価できなかった場合は nil を返す
    367 
    368   MAX_NEST_LEVEL = 64    # 簡易のループ検出(参ç
    369 §ã®ãƒã‚¹ãƒˆã‚’ 64 まで許可する)
     347  # RETURN: 評価した定数、評価できなかった場合は nil を返す
     348
     349  MAX_NEST_LEVEL = 64    # 簡易のループ検出(参照のネストを 64 まで許可する)
    370350  def elements_eval_const( elements, name_list, name_list2 = nil, nest = nil )
    371351
     
    374354      nsp = elements[1]
    375355
    376       # #809 の修正しかけ (別の問題が解決しきれていない)
    377       # nest += 1     # 参ç
    378 §ãŒãƒ«ãƒ¼ãƒ—になっていないかのチェック
    379       #               # mikan 本当にループしているかどうかではなく、単純に多数の参ç
    380 §ã‚’繰り返していることで判定している
     356      # #809 の修正しかけ (別の問題が解決しきれていない)
     357      # nest += 1     # 参照がループになっていないかのチェック
     358      #               # mikan 本当にループしているかどうかではなく、単純に多数の参照を繰り返していることで判定している
    381359      # if nest > MAX_NEST_LEVEL then
    382360      #   cdl_error( "E9999: '$1' too many reference (maybe loop) max=$1" , nsp.to_s, MAX_NEST_LEVEL )
     
    393371      end
    394372
    395       # 見つからなければ定数定義から探す
     373      # 見つからなければ定数定義から探す
    396374      if object == nil then
    397         object = Namespace.find( nsp )# mikan namespace の対応 #1
    398       end
    399 
    400 # この実è£
    401 ã¯ã€ã‚‚う少し整理されるべき
    402 # これが呼出されるのは、以下の場合
    403 #   ãƒ»attribute, var の右辺式の評価
    404 #   ãƒ»size_is 引数の評価:関数パラメータの場合とattribute, var の場合がある
    405 # 以下のエラーチェックでは、これらがごっちゃになって誤りを検出しようとしている
    406 
    407       # IDENTIFIER は見つからなかった?
     375        object = Namespace.find( nsp )# mikan namespace の対応 #1
     376      end
     377
     378# この実装は、もう少し整理されるべき
     379# これが呼出されるのは、以下の場合
     380#   ・attribute, var の右辺式の評価
     381#   ・size_is 引数の評価:関数パラメータの場合とattribute, var の場合がある
     382# 以下のエラーチェックでは、これらがごっちゃになって誤りを検出しようとしている
     383
     384      # IDENTIFIER は見つからなかった?
    408385      if object == nil then
    409386        cdl_error( "E1001 $1: not found" , nsp.get_path_str )
     
    411388        return nil
    412389      elsif object.instance_of?( Join ) then
    413         # Join の場合: cell の中の attribute, var, call のどれかが見つかった
    414         # Decl (attribute, var) でない?
     390        # Join の場合: cell の中の attribute, var, call のどれかが見つかった
     391        # Decl (attribute, var) でない?
    415392        if ! object.get_definition.instance_of?( Decl ) then
    416393          cdl_error( "E1002 $1: not constant (port)" , nsp.get_path_str )
     
    419396        return object.get_rhs.eval_const2( name_list, name_list2, nest )
    420397      elsif ! object.instance_of?( Decl ) then
    421         # Decl でない場合: 定数でもない
     398        # Decl でない場合: 定数でもない
    422399        if ( ! object.instance_of?( ParamDecl ) ) then
    423                                                       # mikan paramdecl は無視する
    424                                                       # ParamList から呼ばれたとき
     400                                                      # mikan paramdecl は無視する
     401                                                      # ParamList から呼ばれたとき
    425402          cdl_error( "E1003 $1: not constant" , nsp.get_path_str )
    426403        else
     
    432409        object.referenced
    433410        if object.get_initializer == nil then
    434           # 初期化子の存在しない変数   # mikan ここへくるのは、通常ありえないはず(未検証)
     411          # 初期化子の存在しない変数   # mikan ここへくるのは、通常ありえないはず(未検証)
    435412          return IntegerVal.new( 0 )
    436413        else
    437           # Decl の右辺の評価
    438           # mikan size_is 引数に現れる変数の型が適切かのチェックする
     414          # Decl の右辺の評価
     415          # mikan size_is 引数に現れる変数の型が適切かのチェックする
    439416          if object.get_initializer.instance_of?( Expression ) || object.get_initializer.instance_of?( C_EXP ) then
    440417            return object.get_initializer.eval_const2( name_list, name_list2, nest )
    441418          else
    442             # Array の場合
     419            # Array の場合
    443420            return object.get_initializer
    444421          end
     
    556533# p "val.respond_to?( \"-@\" )=#{val.respond_to?( "-@" )} #{val.class}"
    557534# p "val.respond_to?( \"~@\" )=#{val.respond_to?( "~@" )}"
    558 #2.0      if val.respond_to?( "~@" ) then  # Ruby 1.9, 2.0 preview 版では例外が発生してしまう
     535#2.0      if val.respond_to?( "~@" ) then  # Ruby 1.9, 2.0 preview 版では例外が発生してしまう
    559536      if val.kind_of? IntegerVal then
    560537        return ~ val
     
    702679  def elements_get_type( elements, namedList )
    703680    type = elements_get_type_sub( elements, namedList )
    704     # 返された方が DefinedType の場合 å
    705 ƒã®åž‹ã‚’返す
     681    # 返された方が DefinedType の場合 元の型を返す
    706682    if type.kind_of?( DefinedType ) then
    707683      type = type.get_type
     
    742718      unless type.kind_of?( PtrType ) then
    743719        cdl_error( "E1013 \'*\': operand is not pointer value"  )
    744         return IntType.new( 8 )    # IntType を返しておく
     720        return IntType.new( 8 )    # IntType を返しておく
    745721      end
    746722      return type.get_referto
    747723
    748724    when :OP_U_PLUS, :OP_U_MINUS
    749       # mikan operand が適切な型かチェックしていない
     725      # mikan operand が適切な型かチェックしていない
    750726      return elements_get_type( elements[1], namedList )
    751727
    752728    when :OP_ADD, :OP_SUB, :OP_MULT, :OP_DIV, :OP_REMAIN
    753       # mikan operand が適切な型かチェックしていない&左辺の型を採用している
     729      # mikan operand が適切な型かチェックしていない&左辺の型を採用している
    754730      return elements_get_type( elements[1], namedList )
    755731
    756732    when :OP_U_TILDE
    757       # mikan operand が整数かチェックしていない
     733      # mikan operand が整数かチェックしていない
    758734      return elements_get_type( elements[1], namedList )
    759735    when :OP_AND, :OP_EOR, :OP_OR, :OP_LSFT, :OP_RSFT
    760       # mikan operand が整数かチェックしていない
     736      # mikan operand が整数かチェックしていない
    761737      return BoolType.new
    762738    when :OP_U_EXCLAM
    763       # mikan operand が整数かチェックしていない
     739      # mikan operand が整数かチェックしていない
    764740      return BoolType.new
    765741
     
    771747  end
    772748
    773   # 式が size_is, count_is, string の引数である場合の方向のチェック
     749  # 式が size_is, count_is, string の引数である場合の方向のチェック
    774750  def elements_check_dir_for_param( elements, namedList, dir, spec )
    775    # dir : å
    776 ƒã®å¼•æ•°ã®æ–¹å‘
    777    # direct: size_is などの引数の変数の方向
     751   # dir : 元の引数の方向
     752   # direct: size_is などの引数の変数の方向
    778753
    779754    case elements[0]
     
    806781          judge = true if ( direct == :IN || direct == :INOUT )
    807782          req_direct = "in or inout"
    808         when :OUT, :RECEIVE     # mikan out で count_is のみ指定されている場合 in でなくてはならない
     783        when :OUT, :RECEIVE     # mikan out で count_is のみ指定されている場合 in でなくてはならない
    809784          judge = true if ( direct == :OUT || direct == :INOUT )
    810785          req_direct = "out or inout"
     
    822797      return true
    823798
    824     # 単é 
    825 æ¼”算子
     799    # 単項演算子
    826800    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,
    827801      elements_check_dir_for_param( elements[1], namedList, dir, spec )
    828802
    829     # 2é 
    830 æ¼”算子
     803    # 2項演算子
    831804    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
    832805      return elements_check_dir_for_param( elements[1], namedList, dir, spec ) && elements_check_dir_for_param( elements[2], namedList, dir, spec )
    833806
    834     # 3é 
    835 æ¼”算子
     807    # 3項演算子
    836808    when :OP_CEX
    837809      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 )
     
    845817  #Express# get_allocator_rhs_elem
    846818  #alloc_type::Symbol  :NORMAL_ALLOC|:INTERNAL_ALLOC|:RELAY_ALLOC
    847   #式がアロケータ指定子の右辺として妥当かチェックし、正しければ分解した値を返す
     819  #式がアロケータ指定子の右辺として妥当かチェックし、正しければ分解した値を返す
    848820  #return:
    849821  #  :NORMAL_ALLOC      [ cell_nsp, ep_name ]               # rhs = cell_nsp.ep_name    ex) Alloc.eAlloc
     
    883855  end
    884856
    885   #Expression#Expression のクローンを作成する
     857  #Expression#Expression のクローンを作成する
    886858  def clone_for_composite
    887859    cl = self.clone
     
    891863  end
    892864
    893   #Expression#elements のクローンを作成
     865  #Expression#elements のクローンを作成
    894866  #elements::Array
    895   # このメソッドは、Array のディープコピーを行う
     867  # このメソッドは、Array のディープコピーを行う
    896868  def clone_elements elements
    897869    elements = elements.clone
     
    910882  end
    911883
    912   #=== Expression#セル結合の式を解析する
     884  #=== Expression#セル結合の式を解析する
    913885  # Cell.eEntry  => [ :OP_DOT, [ :IDENTIFIER, token ], token ]
    914886  # Cell.eEntry[expression] => [ :OP_SUBSC, [ :OP_DOT, [ :IDENTIFIER, token ], token ], expression ]
    915887  # Return: [ NamespacePath(cell_name), Integer(subscript) or nil, Token(port_name)]
    916888  def analyze_cell_join_expression
    917     # 右辺の Expression の要素を取り出す
     889    # 右辺の Expression の要素を取り出す
    918890    elements = @elements
    919     if elements[0] == :OP_SUBSC then  # 右辺:受け口é
    920 åˆ—?
     891    if elements[0] == :OP_SUBSC then  # 右辺:受け口配列?
    921892      # elements = [ :OP_SUBSC, [ :OP_DOT, [ :IDENTIFIER, token ], token ], expression ]
    922       subscript = elements[2].eval_const(nil)  # 受け口é
    923 åˆ—の添数
    924       elements  = elements[1]          # mikan é
    925 åˆ—だった場合
     893      subscript = elements[2].eval_const(nil)  # 受け口配列の添数
     894      elements  = elements[1]          # mikan 配列だった場合
    926895    else
    927896      subscript = nil
     
    939908  end
    940909
    941   #=== Expression# セルへの結合の式を生成する
     910  #=== Expression# セルへの結合の式を生成する
    942911  #nsp:: NamespacePath
    943912  #subscript:: Integer
    944913  #port_name:: Symbol
    945   # analyze_cell_join_expression と対になっている
     914  # analyze_cell_join_expression と対になっている
    946915  def self.create_cell_join_expression( nsp, subscript, port_name, locale = nil )
    947916    if ! port_name.instance_of?( Symbol ) then
     
    959928  end
    960929
    961   #=== Expression#整数定数の式を生成する
    962   #val:: Integer : 値: 整数
     930  #=== Expression#整数定数の式を生成する
     931  #val:: Integer : 値: 整数
    963932  def self.create_integer_constant( val, locale = nil )
    964933    if val != Integer( val ) || val < 0 then
     
    968937  end
    969938
    970   #=== Expression#単一の識別子の式を解析する
     939  #=== Expression#単一の識別子の式を解析する
    971940  # Identifier  => [ :IDENTIFIER, token ]
    972941  # Return: NamespacePath(Identifier)
    973942  def analyze_single_identifier
    974     # 右辺の Expression の要素を取り出す
     943    # 右辺の Expression の要素を取り出す
    975944    elements = @elements
    976945    if elements[0] == :IDENTIFIER
     
    982951
    983952  #=== Expression#
    984   #nsp:: NamespacePath :  参ç
    985 §ã™ã‚‹ã‚‚の識別子
     953  #nsp:: NamespacePath :  参照するもの識別子
    986954  def self.create_single_identifier( nsp, locale )
    987955    if ! nsp.instance_of?( NamespacePath ) then
     
    991959  end
    992960
    993   #=== 評価可能かチェックする
    994   #*v:: 可変個引数(任意の型)
    995   # すべてが BaseVal の子クラス(値)であれば、評価可能と判断する
     961  #=== 評価可能かチェックする
     962  #*v:: 可変個引数(任意の型)
     963  # すべてが BaseVal の子クラス(値)であれば、評価可能と判断する
    996964  def evaluable?( *v )
    997965    v.each{ |val|
     
    1012980
    1013981  #c_exp_string::String
    1014   #b_renew::Bool  : true なら C_EXP の clone 作成(エスケープ処理等をしない)
     982  #b_renew::Bool  : true なら C_EXP の clone 作成(エスケープ処理等をしない)
    1015983  def initialize( c_exp_string, b_renew = false )
    1016984    if b_renew then
    1017985      @c_exp_string = c_exp_string
    1018986    else
    1019       # 前後の " を取り除く
     987      # 前後の " を取り除く
    1020988      # str = c_exp_string.to_s.sub( /^\"(.*)\"$/, "\\1" )
    1021989      str = CDLString.remove_dquote c_exp_string.to_s
     
    1024992  end
    1025993
    1026   #=== composite 用に C_EXP を clone する
     994  #=== composite 用に C_EXP を clone する
    1027995  #ct_name::
    1028996  #cell_name::
    1029   # composite の attribute に現れる C_EXP を文字列置換して生成しなおす.
    1030   # この文字列置換は、意味解釈段階で行う.
    1031   # 他の C_EXP の文字列置換は、コード生成段階で行う.
     997  # composite の attribute に現れる C_EXP を文字列置換して生成しなおす.
     998  # この文字列置換は、意味解釈段階で行う.
     999  # 他の C_EXP の文字列置換は、コード生成段階で行う.
    10321000  def clone_for_composite( ct_name, cell_name, locale )
    10331001    dbgPrint "C_EXP: #{ct_name} #{cell_name} #{@c_exp_string}\n"
     
    10441012  end
    10451013
    1046   #=== C_EXP を評価する
    1047   # C_EXP の引き数文字列を返す
    1048   # 本来 C_EXP は eval_const する対象ではないが、便宜上 eval_const で対応
     1014  #=== C_EXP を評価する
     1015  # C_EXP の引き数文字列を返す
     1016  # 本来 C_EXP は eval_const する対象ではないが、便宜上 eval_const で対応
    10491017  def eval_const( name_list, name_list2 = nil )
    10501018     return self
  • azure_iot_hub/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
    r388 r389  
    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
    5237#   $Id$
     
    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
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/generate.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2019 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
    5237#   $Id$
     
    134119end
    135120
    136 # celltype_private.h を生成
     121# celltype_private.h を生成
    137122
    138123class Namespace
     
    141126
    142127    begin
    143       # root namespace ならば makefile を出力する(å
    144 ¨ã‚»ãƒ«ã‚¿ã‚¤ãƒ—に関わるものだけ)
    145       # å
    146 ˆã«å‡ºåŠ›ã™ã‚‹
     128      # root namespace ならば makefile を出力する(全セルタイプに関わるものだけ)
     129      # 先に出力する
    147130      if @name == "::" then
    148131
     
    159142
    160143      dbgPrint "generating region: #{$generating_region.get_name} namespace=#{@name} gen_dir=#{$gen}\n"
    161       # global_tecsgen.h (typedef, struct, const) の生成
     144      # global_tecsgen.h (typedef, struct, const) の生成
    162145      gen_global_header
    163146
     
    171154      end
    172155     
    173       # signature のコードを生成
     156      # signature のコードを生成
    174157      @signature_list.each { |s|
    175158        s.generate
    176159      }
    177160
    178       # celltype のコードを生成
     161      # celltype のコードを生成
    179162      @celltype_list.each { |t|
    180163        t.generate
    181164      }
    182165
    183       # サブネームスペースのコードを生成
     166      # サブネームスペースのコードを生成
    184167      @namespace_list.each { |n|
    185168        n.generate
     
    187170
    188171    rescue => evar
    189       # もしスタックトレースが出るまでい時間がかかるようならば、次をコメントアウトしてみるべし
     172      # もしスタックトレースが出るまでい時間がかかるようならば、次をコメントアウトしてみるべし
    190173      cdl_error( "H1001 tecsgen: fatal internal error during code generation"  )
    191174      print_exception( evar )
     
    200183
    201184    begin
    202       # global_tecsgen.h (typedef, struct, const) の終わりのガードコード生成
     185      # global_tecsgen.h (typedef, struct, const) の終わりのガードコード生成
    203186      gen_global_header_post
    204187
    205       # signature のコードを生成
     188      # signature のコードを生成
    206189      @signature_list.each { |s|
    207190        s.generate_post
    208191      }
    209192
    210       # celltype のコードを生成
     193      # celltype のコードを生成
    211194      @celltype_list.each { |t|
    212195        t.generate_post
    213196      }
    214197
    215       # サブネームスペースのコードを生成
     198      # サブネームスペースのコードを生成
    216199      @namespace_list.each { |n|
    217200        n.generate_post
     
    227210  def gen_global_header
    228211
    229     # global_tecs.h の生成
     212    # global_tecs.h の生成
    230213    f = AppFile.open( "#{$gen}/global_tecsgen.#{$h_suffix}" )
    231214
     
    233216      print_note f
    234217
    235       # ガードコードを出力
     218      # ガードコードを出力
    236219      f.print <<EOT
    237220#ifndef GLOBAL_TECSGEN_H
     
    240223EOT
    241224
    242       # import_C で指定されたヘッダファイルの #include を出力
     225      # import_C で指定されたヘッダファイルの #include を出力
    243226      if Import_C.get_header_list2.length > 0 then
    244         # ヘッダ include の出力
     227        # ヘッダ include の出力
    245228        f.printf TECSMsg.get( :IMP_comment ), "#_IMP_#"
    246229        Import_C.get_header_list2.each{ |h|
     
    253236    end
    254237
    255     # typedef, struct, enum を生成
     238    # typedef, struct, enum を生成
    256239    @decl_list.each { |d|
    257240
    258       # d は Typedef, StructType, EnumType のいずれか
     241      # d は Typedef, StructType, EnumType のいずれか
    259242      if d.instance_of?( Typedef ) then
    260243
    261         # Typedef の場合、declarator の @type が CType でないか
     244        # Typedef の場合、declarator の @type が CType でないか
    262245        if ! d.get_declarator.get_type.kind_of?( CType ) then
    263246          d.gen_gh f
     
    265248      elsif ! d.kind_of?( CType ) then
    266249
    267         # CType ではない (StructType または EnumType)
     250        # CType ではない (StructType または EnumType)
    268251        d.gen_gh f
    269252#     else
    270 #       ã“こに該当するのは CStructType, CEnumType
     253#       ここに該当するのは CStructType, CEnumType
    271254      end
    272255    }
     
    297280    end
    298281
    299     # const を生成  mikan
     282    # const を生成  mikan
    300283    @const_decl_list.each { |d|
    301284      f.printf( "#define %-14s ((%s%s)%s)\n", d.get_global_name,
     
    310293  def gen_global_header_post
    311294
    312     # global_tecs.h を開く
     295    # global_tecs.h を開く
    313296    f = AppFile.open( "#{$gen}/global_tecsgen.#{$h_suffix}" )
    314297
     
    324307  end
    325308
    326   #=== Makefile.tecsgen, Makefile.templ の出力
    327   # å
    328 ¨ã‚»ãƒ«ã‚¿ã‚¤ãƒ—名を出力する部分を出力
    329   #    (本メソッドは root namespace に対して呼出す)
    330   #     å€‹ã€
    331 ã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—のメークルールは Celltype クラスで出力
     309  #=== Makefile.tecsgen, Makefile.templ の出力
     310  # 全セルタイプ名を出力する部分を出力
     311  #    (本メソッドは root namespace に対して呼出す)
     312  #     個々のセルタイプのメークルールは Celltype クラスで出力
    332313  def gen_makefile
    333314    gen_makefile_template
     
    339320    return if $generate_no_template
    340321
    341     ### Makefile.templ の生成
     322    ### Makefile.templ の生成
    342323    f = AppFile.open( "#{$gen}/Makefile.templ" )
    343324
    344325    print_Makefile_note f
    345326
    346     # Makefile の変数の出力
     327    # Makefile の変数の出力
    347328    f.printf TECSMsg.get( :MVAR_comment ), "#_MVAR_#"
    348329    f.printf "# fixed variable (unchangeable by config or plugin)\n"
    349330
    350     # TARGET の出力 (第一引数 $target に region 名および .exe を付加)
     331    # TARGET の出力 (第一引数 $target に region 名および .exe を付加)
    351332    target = $target
    352333    if $generating_region != @@root_namespace then
    353       # 子 region のリンクターゲットの場合
     334      # 子 region のリンクターゲットの場合
    354335      target += "-#{$generating_region.get_global_name}"
    355336    end
     
    433414EOT
    434415
    435     # make ルールの出力
     416    # make ルールの出力
    436417    f.printf( TECSMsg.get( :MRUL_comment), "#_MRUL_#" )
    437418
     
    461442    f.print "-include $(GEN_DIR)/Makefile.tecsgen\n"
    462443    if $generating_region.get_n_cells != 0 then
    463       # Makefile.depend の include
     444      # Makefile.depend include
    464445      f.print "-include $(GEN_DIR)/Makefile.depend\n\n"
    465446
     
    471452      f.print "\nsub_regions:$(TIMESTAMP)\n"
    472453      Region.get_link_roots.each {|region|
    473         if region.get_global_name != "" then  # Root region: この Makefile 自身
     454        if region.get_global_name != "" then  # Root region: この Makefile 自身
    474455          f.print "\tcd #{region.get_global_name}; make all\n"
    475456        end
     
    478459    end
    479460
    480     # clean: ターゲット
     461    # clean: ターゲット
    481462    f.print "clean :\n"
    482463    if $generating_region == @@root_namespace then
    483464      Region.get_link_roots.each {|region|
    484         if region.get_global_name != "" then  # Root region: この Makefile 自身
     465        if region.get_global_name != "" then  # Root region: この Makefile 自身
    485466          f.print "\tcd #{region.get_global_name}; make clean\n"
    486467        end
     
    493474    f.print "\n"
    494475
    495     # tecs: ターゲット
     476    # tecs: ターゲット
    496477    if $generating_region == @@root_namespace then
    497478      f.print "tecs : $(PRE_TECSGEN_TARGET) $(TIMESTAMP) $(POST_TECSGEN_TARGET)\n\n"
     
    504485    end
    505486
    506     # tecsflow:, tcflow ターゲット
     487    # tecsflow:, tcflow ターゲット
    507488    if $generating_region.get_n_cells != 0 || $generating_region == @@root_namespace then
    508489      f.print "#####  TECSFlow targets  #####\n"
     
    561542
    562543  def gen_makefile_tecsgen
    563     ### Makefile.tecsgen の生成
     544    ### Makefile.tecsgen の生成
    564545    f = AppFile.open( "#{$gen}/Makefile.tecsgen" )
    565546
     
    658639    domain_regions = nil
    659640    DomainType.get_domain_regions.each{ |dt, regions|
    660       # domain_type は一つのノードには、一つしかないので、このループは、å¿
    661 ãšä¸€å›žã—か回らない
    662         ###   mikan 複数のノードがあり、異なる domain_type が指定される可能性はある
     641      # domain_type は一つのノードには、一つしかないので、このループは、必ず一回しか回らない
     642        ###   mikan 複数のノードがあり、異なる domain_type が指定される可能性はある
    663643      domain_regions = regions
    664644      domain_type = dt
     
    836816  end
    837817
    838   #=== すべてのセルタイプの名前を出力
    839   #f::       FILE:   å‡ºåŠ›å
    840 ˆãƒ•ã‚¡ã‚¤ãƒ«
    841   #prepend:: string: 前置文字列
    842   #append::  string: 後置文字列
    843   #b_plguin::  bool:   plugin により生成されたセルタイプを出力
    844   ##b_inline_only::  bool:   true ならば inline の entry port のみのセルタイプを含める
    845   #b_inline_only_or_proc::  bool|Proc:   true ならば inline の entry port のみ、かつインアクティブなセルタイプを含める
    846   #                                      Proc ならば Proc を実行した結果 true ならば含める
    847   #  namespace "::" から呼出される
     818  #=== すべてのセルタイプの名前を出力
     819  #f::       FILE:   出力先ファイル
     820  #prepend:: string: 前置文字列
     821  #append::  string: 後置文字列
     822  #b_plguin::  bool:   plugin により生成されたセルタイプを出力
     823  ##b_inline_only::  bool:   true ならば inline の entry port のみのセルタイプを含める
     824  #b_inline_only_or_proc::  bool|Proc:   true ならば inline の entry port のみ、かつインアクティブなセルタイプを含める
     825  #                                      Proc ならば Proc を実行した結果 true ならば含める
     826  #  namespace "::" から呼出される
    848827  def gen_celltype_names( f, prepend, append, b_plugin, b_inline_only_or_proc = true )
    849828    dbgPrint "gen_celltype_names #{@name}\n"
     
    865844  end
    866845
    867   #=== すべてのセルタイプの名前を出力
     846  #=== すべてのセルタイプの名前を出力
    868847  #region:: Region:
    869   # gen_celltype_names とgen_celltype_names_domain の相違:
    870   #   region を domain_roots に含む場合、出力する.
    871   #   ã¾ãŸã¯ã€region を含まないが、domain_roots が複数かつルートリージョンの場合、出力する.
    872   # それ以外は、gen_celltype_names の説明を参ç
    873 §
     848  # gen_celltype_names とgen_celltype_names_domain の相違:
     849  #   region を domain_roots に含む場合、出力する.
     850  #   または、region を含まないが、domain_roots が複数かつルートリージョンの場合、出力する.
     851  # それ以外は、gen_celltype_names の説明を参照
    874852  def gen_celltype_names_domain( f, prepend, append, domain_type, region, b_plugin, b_inline_only = true )
    875853    dbgPrint "gen_celltype_names #{@name}\n"
     
    901879    }
    902880  end
    903   #== Namespace#すべてのセルタイプの名前を出力
    904   # セルタイプコードのための名前出力
    905   # gen_celltype_names_domain と gen_celltype_names_domain2 の相違
    906   # ・どれか一つのリージョンにしか出さない
    907   #     domain_roots が1つだけで、指定リージョンを含む
    908   #     domain_roots が2つ以上で、指定リージョンがルートリージョン
    909   # ・ドメイン名を付加しない
     881  #== Namespace#すべてのセルタイプの名前を出力
     882  # セルタイプコードのための名前出力
     883  # gen_celltype_names_domain と gen_celltype_names_domain2 の相違
     884  # ・どれか一つのリージョンにしか出さない
     885  #     domain_roots が1つだけで、指定リージョンを含む
     886  #     domain_roots が2つ以上で、指定リージョンがルートリージョン
     887  # ・ドメイン名を付加しない
    910888  def gen_celltype_names_domain2( f, prepend, append, domain_type, region, b_plugin, b_inline_only = true )
    911889    dbgPrint "gen_celltype_names #{@name}\n"
     
    933911  end
    934912
    935   #=== Namespace#すべてのシグニチャをたどる
    936   def travers_all_signature # ブロック引数 { |signature|  }
    937     proc = Proc.new    # このメソッドのブロック引数
     913  #=== Namespace#すべてのシグニチャをたどる
     914  def travers_all_signature # ブロック引数 { |signature|  }
     915    proc = Proc.new    # このメソッドのブロック引数
    938916    @signature_list.each{ |sig|
    939917      proc.call sig
     
    952930  end
    953931
    954   #=== Namespace#すべてのセルタイプをたどる
    955   def travers_all_celltype # ブロック引数 { |celltype|  }
    956     proc = Proc.new    # このメソッドのブロック引数
     932  #=== Namespace#すべてのセルタイプをたどる
     933  def travers_all_celltype # ブロック引数 { |celltype|  }
     934    proc = Proc.new    # このメソッドのブロック引数
    957935    @celltype_list.each{ |ct|
    958936      proc.call ct
     
    10781056  def gen_sh_func_tab f
    10791057
    1080     # シグニチャディスクリプタの出力
     1058    # シグニチャディスクリプタの出力
    10811059    f.printf TECSMsg.get(:SD_comment), "#_SD_#"
    10821060    f.print "struct tag_#{@global_name}_VDES {\n"
     
    10841062    f.print "};\n\n"
    10851063
    1086     # シグニチャ関数テーブルの出力
     1064    # シグニチャ関数テーブルの出力
    10871065    f.printf TECSMsg.get(:SFT_comment), "#_SFT_#"
    10881066    f.print( "struct tag_#{@global_name}_VMT {\n" )
     
    10991077        len = items.length
    11001078      else
    1101         # ここで nil になるのは、引数なしの時に void がなかった場合
     1079        # ここで nil になるのは、引数なしの時に void がなかった場合
    11021080        items = []
    11031081        len = 0
     
    11291107  end
    11301108
    1131   #=== Signature# 関数の ID の define を出力
     1109  #=== Signature# 関数の ID の define を出力
    11321110  def gen_sh_func_id f
    11331111    f.print "/* function id */\n"
     
    11481126  def generate
    11491127
    1150     if need_generate?    # セルのないセルタイプは生成しない
     1128    if need_generate?    # セルのないセルタイプは生成しない
    11511129
    11521130      generate_private_header
     
    11591137      generate_makefile
    11601138
    1161     elsif $generate_all_template   # テンプレートコード生成オプション
     1139    elsif $generate_all_template   # テンプレートコード生成オプション
    11621140
    11631141      generate_template_code
    11641142      generate_inline_template_code
    11651143
    1166       # generate_makefile_template は Makefile に追記するものだから、呼び出さない
     1144      # generate_makefile_template は Makefile に追記するものだから、呼び出さない
    11671145
    11681146    end
     
    11711149
    11721150  def generate_post
    1173     return if ! need_generate?    # セルのないセルタイプは生成しない
     1151    return if ! need_generate?    # セルのないセルタイプは生成しない
    11741152
    11751153    generate_private_header_post
     
    11911169    gen_ph_cell_cb_type f
    11921170    gen_ph_INIB_as_CB f
    1193     gen_ph_extern_cell f          # セルタイプグルコード以外は参ç
    1194 §ã—ない
    1195     gen_ph_typedef_idx f          # mikan 参ç
    1196 §ã™ã‚‹ã‚‚のができていない
     1171    gen_ph_extern_cell f          # セルタイプグルコード以外は参照しない
     1172    gen_ph_typedef_idx f          # mikan 参照するものができていない
    11971173    gen_ph_ep_fun_prototype f
    11981174    end_extern_C f
     
    12021178
    12031179    if @n_entry_port_inline == 0 then
    1204       # inline がなければ CB_TYPE_ONLY とする
    1205       # inline ありの場合、いったん define しておいて、後ですべて undef する
     1180      # inline がなければ CB_TYPE_ONLY とする
     1181      # inline ありの場合、いったん define しておいて、後ですべて undef する
    12061182      ifndef_cb_type_only f
    12071183    end
     
    12291205#    gen_ph_cell_cb_type f
    12301206#    gen_ph_INIB_as_CB f
    1231 #    gen_ph_extern_cell f          # セルタイプグルコード以外は参ç
    1232 §ã—ない
    1233     # gen_ph_typedef_idx f          # mikan 参ç
    1234 §ã™ã‚‹ã‚‚のができていない
     1207#    gen_ph_extern_cell f          # セルタイプグルコード以外は参照しない
     1208    # gen_ph_typedef_idx f          # mikan 参照するものができていない
    12351209#    gen_ph_ep_fun_prototype f
    12361210    gen_ph_ep_skel_prototype f
    12371211
    1238     #--- CB_TYPE_ONLY の場合、ref_desc, set_desc 関数は含めない (マクロ参ç
    1239 §ã™ã‚‹ãŸã‚)
     1212    #--- CB_TYPE_ONLY の場合、ref_desc, set_desc 関数は含めない (マクロ参照するため)
    12401213    if @n_entry_port_inline == 0 then
    12411214      ifndef_cb_type_only f
     
    12491222    endif_macro_only f
    12501223
    1251     # 短縮形などのマクロ出力
     1224    # 短縮形などのマクロ出力
    12521225    if @n_entry_port_inline == 0 then
    12531226      ifndef_cb_type_only f
     
    12611234    gen_ph_test_optional_call_port_abbrev f
    12621235    gen_ph_ep_fun_macro f         if @n_entry_port > 0
    1263     gen_ph_foreach_cell f         # FOREACH マクロの出力
    1264     gen_ph_cb_initialize_macro f   # CB 初期化マクロの出力.消費しないので ram_initializer フラグに関わらず出力
     1236    gen_ph_foreach_cell f         # FOREACH マクロの出力
     1237    gen_ph_cb_initialize_macro f   # CB 初期化マクロの出力.消費しないので ram_initializer フラグに関わらず出力
    12651238    gen_ph_dealloc_code f, ""
    12661239    gen_ph_dealloc_code f, "_RESET"
     
    13091282        next if p.get_port_type != :CALL
    13101283
    1311         # is_...joined は omit するケースでも出力されるため、omit を検査する前に出力
     1284        # is_...joined は omit するケースでも出力されるため、omit を検査する前に出力
    13121285        if p.is_optional? then
    13131286          f.print( "#undef is_#{p.get_name}_joined\n" )
     
    13531326  end
    13541327
    1355   #=== CELLTYPE_tecsgen.c を生成
     1328  #=== CELLTYPE_tecsgen.c を生成
    13561329  def generate_cell_code
    13571330    fs = { }
     
    13881361    end
    13891362
    1390     # すべての _tecsgen.c に出力
     1363    # すべての _tecsgen.c に出力
    13911364    print_note f
    13921365    gen_cell_private_header f
     
    13941367    gen_cell_ep_des_type f
    13951368
    1396     # すべての _tecsgen.c に出力
     1369    # すべての _tecsgen.c に出力
    13971370    fs.each{ |r,f2|
    13981371      if f == f2 then
     
    14051378    }
    14061379
    1407     # 一つの _tecsgen.c に出力
     1380    # 一つの _tecsgen.c に出力
    14081381    gen_cell_skel_fun f
    14091382    gen_cell_fun_table f
    14101383    gen_cell_var_init f
    14111384
    1412     # セルごとに _tecsgen.c に出力
     1385    # セルごとに _tecsgen.c に出力
    14131386    gen_cell_ep_vdes fs
    14141387    gen_cell_ep_vdes_array fs
    1415     gen_cell_cb_out_init fs         # INITIALIZE_CB で参ç
    1416 §ã•ã‚Œã‚‹ãŸã‚ ram_initializer=false でも消せない
     1388    gen_cell_cb_out_init fs         # INITIALIZE_CB で参照されるため ram_initializer=false でも消せない
    14171389    gen_cell_cb fs
    14181390    gen_cell_extern_mt fs
    14191391    gen_cell_ep_des fs
    14201392
    1421     # 一つの _tecsgen.c に出力
     1393    # 一つの _tecsgen.c に出力
    14221394    gen_cell_cb_tab f
    14231395    if $ram_initializer then
     
    14811453
    14821454  def gen_ph_include f
    1483     # ランタイムヘッダの include
     1455    # ランタイムヘッダの include
    14841456#    f.printf TECSMsg.get( :IRTH_comment), "#_IRTH_#"
    14851457#    f.print "#include \"tecs.#{$h_suffix}\"\n\n"
    14861458
    1487     # グローバルヘッダの include
     1459    # グローバルヘッダの include
    14881460    f.printf TECSMsg.get( :IGH_comment ), "#_IGH_#"
    14891461    f.print "#include \"global_tecsgen.#{$h_suffix}\"\n\n"
    14901462
    1491     # シグニチャヘッダの include
     1463    # シグニチャヘッダの include
    14921464    f.printf TECSMsg.get( :ISH_comment ), "#_ISH_#"
    14931465    @port.each { |p|
     
    15071479    end
    15081480
    1509     # 最適化のため参ç
    1510 §ã™ã‚‹ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の CB 型の定義を取込む
    1511     # _CB_TYPE_ONLY を定義した上で include する
     1481    # 最適化のため参照するセルタイプの CB 型の定義を取込む
     1482    # _CB_TYPE_ONLY を定義した上で include する
    15121483    f.printf( TECSMsg.get( :ICT_comment ), "#_ICT_#" )
    15131484
     
    15221493
    15231494      if p.is_skelton_useless? || p.is_cell_unique? || p.is_VMT_useless? then
    1524         # 最適化コード (optimize) # スケルトン不要など
     1495        # 最適化コード (optimize) # スケルトン不要など
    15251496        p2 = p.get_real_callee_port
    15261497        if p2 then
     
    15311502          end
    15321503        # else
    1533           # optional で未結合
     1504          # optional で未結合
    15341505        end
    15351506      end
     
    15431514#      next if p.get_port_type != :CALL
    15441515#      if p.is_skelton_useless? || p.is_cell_unique? || p.is_VMT_useless? then
    1545 #        # 最適化コード (optimize) # スケルトン不要など
     1516#        # 最適化コード (optimize) # スケルトン不要など
    15461517#        p2 = p.get_real_callee_port
    15471518#        ct = p2.get_celltype
     
    15591530    return if @singleton
    15601531
    1561     # ID の基数および個数の define を出力
     1532    # ID の基数および個数の define を出力
    15621533    f.printf("#define %-20s %10s  /* %s #_NIDB_# */\n", "#{@global_name}_ID_BASE", "(#{@id_base})", TECSMsg.get(:NIDB_comment))
    15631534    f.printf("#define %-20s %10s  /* %s  #_NCEL_# */\n\n", "#{@global_name}_N_CELL", "(#{@n_cell_gen})", TECSMsg.get(:NCEL_comment))
     
    15671538    return if @singleton
    15681539
    1569     # mikan  最適化
    1570     # IDX 正当性チェックマクロの出力
     1540    # mikan  最適化
     1541    # IDX 正当性チェックマクロの出力
    15711542    f.printf( TECSMsg.get( :CVI_comment ), "#_CVI_#" )
    15721543    if @idx_is_id_act then
     
    15811552    return if @singleton
    15821553
    1583     # IDX 正当性チェックマクロ(短縮形)の出力
     1554    # IDX 正当性チェックマクロ(短縮形)の出力
    15841555    f.printf( TECSMsg.get( :CVIA_comment ), "#_CVIA_#")
    15851556    f.print("#define VALID_IDX(IDX)  #{@global_name}_VALID_IDX(IDX)\n\n")
     
    15871558  end
    15881559
    1589   #=== 呼び口é
    1590 åˆ—の大きさを得るマクロの出力
     1560  #=== 呼び口配列の大きさを得るマクロの出力
    15911561  #
    1592   #セルタイプヘッダへ呼び口の個数を出力
     1562  #セルタイプヘッダへ呼び口の個数を出力
    15931563  def gen_ph_n_cp f
    15941564
     
    16041574      end
    16051575
    1606       if p.get_array_size != "[]" then       # 固定長é
    1607 åˆ—
     1576      if p.get_array_size != "[]" then       # 固定長配列
    16081577        f.print( "#define N_CP_#{p.get_name}    (#{p.get_array_size})\n" )
    16091578        f.print( "#define NCP_#{p.get_name}     (#{p.get_array_size})\n" )
    1610       else                                   # 可変長é
    1611 åˆ—
     1579      else                                   # 可変長配列
    16121580        if @singleton then
    16131581          if has_INIB? then
     
    16181586          f.print( "#define N_CP_#{p.get_name}  (#{@global_name}_SINGLE_CELL_#{inib}.n_#{p.get_name})\n" )
    16191587          f.print( "#define NCP_#{p.get_name}   (#{@global_name}_SINGLE_CELL_#{inib}.n_#{p.get_name})\n" )
    1620           # mikan singleton ならば、固定長化できる
     1588          # mikan singleton ならば、固定長化できる
    16211589        else
    16221590          if has_CB? && has_INIB? then
     
    16321600  end
    16331601
    1634   #=== 受け口é
    1635 åˆ—の大きさを得るマクロの出力
     1602  #=== 受け口配列の大きさを得るマクロの出力
    16361603  #
    1637   #セルタイプヘッダへ受け口の個数を出力
     1604  #セルタイプヘッダへ受け口の個数を出力
    16381605  def gen_ph_n_ep f
    16391606
     
    16411608    @port.each { |p|
    16421609      next if p.get_port_type != :ENTRY
    1643       # next if p.is_omit?                       # 受け口é
    1644 åˆ—の個数は省略しない
     1610      # next if p.is_omit?                       # 受け口配列の個数は省略しない
    16451611      next if p.get_array_size == nil
    16461612
     
    16501616      end
    16511617
    1652       if p.get_array_size != "[]" then       # 固定長é
    1653 åˆ—
     1618      if p.get_array_size != "[]" then       # 固定長配列
    16541619        f.print( "#define NEP_#{p.get_name}     (#{p.get_array_size})\n" )
    1655       else                                   # 可変長é
    1656 åˆ—
     1620      else                                   # 可変長配列
    16571621        if @singleton then
    16581622          if has_INIB? then
     
    16621626          end
    16631627          f.print( "#define NEP_#{p.get_name}   (#{@global_name}_SINGLE_CELL_#{inib}.n_#{p.get_name})\n" )
    1664           # mikan singleton ならば、固定長化できる
     1628          # mikan singleton ならば、固定長化できる
    16651629        else
    16661630          if has_CB? && has_INIB? then
     
    16751639  end
    16761640
    1677   #=== optional な呼び口が結合されているかテストするコードの生成
     1641  #=== optional な呼び口が結合されているかテストするコードの生成
    16781642  def gen_ph_test_optional_call_port f
    16791643    b_comment = false
     
    16961660      next if p.get_port_type != :CALL
    16971661      next if ! p.is_optional?
    1698       # next if p.is_omit?  # omit でも test コードは生成する
     1662      # next if p.is_omit?  # omit でも test コードは生成する
    16991663
    17001664      if b_comment == false then
     
    17201684      end
    17211685
    1722       # 関数名の出力(標準:受け口ディスクリプタから VMT の関数名、最適化:受け口関数 or 受け口ディスクリプタ)
    1723       # mikan  å
    1724 ¨éƒ¨ã¤ãªãŒã£ã¦ã„るかどうかで (1) を判定する
     1686      # 関数名の出力(標準:受け口ディスクリプタから VMT の関数名、最適化:受け口関数 or 受け口ディスクリプタ)
     1687      # mikan  全部つながっているかどうかで (1) を判定する
    17251688      if ! p.is_VMT_useless? then
    17261689        if p.is_dynamic? then
     
    17341697        end
    17351698
    1736         # 標準コード
     1699        # 標準コード
    17371700        if p.get_array_size == nil then
    17381701          if @singleton then
     
    17421705          end
    17431706        else
    1744           # é
    1745 åˆ—の場合
     1707          # 配列の場合
    17461708          if @singleton then
    17471709            f.print( "\t  ((#{@global_name}_SINGLE_CELL_#{inib_tmp}.#{p.get_name}!=0) \\\n" )
     
    17531715        end
    17541716      else
    1755         # 最適化コード (optimize) # VMT 不要(é
    1756 åˆ—要素すべて同じ)
     1717        # 最適化コード (optimize) # VMT 不要(配列要素すべて同じ)
    17571718        p2 = p.get_real_callee_port
    17581719        if p2 then
    17591720          ct = p2.get_celltype
    17601721          if p.is_skelton_useless? then
    1761             # 受け口関数を直接呼出す
     1722            # 受け口関数を直接呼出す
    17621723            f.print( "\t  (1)\n" )
    17631724          else
    1764             # 受け口スケルトン関数を直接呼出す
     1725            # 受け口スケルトン関数を直接呼出す
    17651726            f.print( "\t  (1)\n" )
    17661727          end
    17671728        else
    1768           # optional で未結合
     1729          # optional で未結合
    17691730          f.print( "\t  (0)    /* not joined */\n" )
    17701731        end
     
    17731734  end
    17741735
    1775   #=== optional な呼び口が結合されているかテストするコードの生成(短縮形)
     1736  #=== optional な呼び口が結合されているかテストするコードの生成(短縮形)
    17761737  def gen_ph_test_optional_call_port_abbrev f
    17771738    b_comment = false
     
    17801741      next if p.get_port_type != :CALL
    17811742      next if ! p.is_optional?
    1782       # next if p.is_omit?  # omit でも test コードは生成する
     1743      # next if p.is_omit?  # omit でも test コードは生成する
    17831744
    17841745      if b_comment == false then
     
    18051766  end
    18061767
    1807   #=== CELLCB へのポインタを得るマクロを出力
    1808   #   ã‚»ãƒ«ã‚¿ã‚¤ãƒ—ヘッダへ出力
     1768  #=== CELLCB へのポインタを得るマクロを出力
     1769  #   セルタイプヘッダへ出力
    18091770  def gen_ph_get_cellcb f
    18101771    f.printf( TECSMsg.get( :GCB_comment ), "#_GCB_#" )
    18111772    if ( ! has_CB? && ! has_INIB? ) || @singleton then
    18121773      f.print( "#define #{@global_name}_GET_CELLCB(idx) ((void *)0)\n" )
    1813     elsif @idx_is_id_act then   # mikan 単一のセルの場合の最適化, idx_is_id でない場合
     1774    elsif @idx_is_id_act then   # mikan 単一のセルの場合の最適化, idx_is_id でない場合
    18141775      f.print( "#define #{@global_name}_GET_CELLCB(idx) (#{@global_name}_CB_ptab[(idx) - #{@global_name}_ID_BASE])\n" )
    18151776    else
     
    18181779  end
    18191780
    1820   #=== CELLCB へのポインタを得るマクロ(短縮形)を出力
    1821   #  セルタイプヘッダへ出力
     1781  #=== CELLCB へのポインタを得るマクロ(短縮形)を出力
     1782  #  セルタイプヘッダへ出力
    18221783  def gen_ph_get_cellcb_abbrev f
    18231784    f.printf( TECSMsg.get( :GCBA_comment ), "#_GCBA_#" )
     
    18351796  end
    18361797
    1837   #===  attribute, var をアクセスするマクロを出力
    1838   #    セルタイプヘッダへ出力
     1798  #===  attribute, var をアクセスするマクロを出力
     1799  #    セルタイプヘッダへ出力
    18391800  def gen_ph_attr_access f
    18401801    if @n_attribute_rw > 0 || @n_attribute_ro > 0 then
     
    18461807      next if a.is_omit?
    18471808
    1848       # mikan const_value の場合
     1809      # mikan const_value の場合
    18491810      f.print( "#define " )
    18501811      if @singleton then
     
    18561817        f.printf( "%-20s", "#{@global_name}_ATTR_#{a.get_name}" )
    18571818        f.print( "\t(#{@global_name}_SINGLE_CELL_#{inib}.#{a.get_name})\n" )
    1858         # mikan ここでは cell ではなく celltype の名前
     1819        # mikan ここでは cell ではなく celltype の名前
    18591820      else
    18601821        if ! a.is_rw? && has_CB? && has_INIB? then
     
    18871848      end
    18881849
    1889       # mikan const_value の場合
     1850      # mikan const_value の場合
    18901851      f.print( "#define " )
    18911852      if @singleton then
    18921853        f.printf( "%-20s", "#{@global_name}_GET_#{a.get_name}()" )
    18931854        f.print( "\t(#{@global_name}_SINGLE_CELL_#{inib}.#{a.get_name})\n" )
    1894         # mikan ここでは cell ではなく celltype の名前
     1855        # mikan ここでは cell ではなく celltype の名前
    18951856      else
    18961857        f.printf( "%-20s", "#{@global_name}_GET_#{a.get_name}(p_that)" )
     
    19031864          f.printf( "%-20s", "#{@global_name}_SET_#{a.get_name}(val)" )
    19041865          f.print( "\t(#{@global_name}_SINGLE_CELL_#{inib}.#{a.get_name} = (val))\n" )
    1905           # mikan ここでは cell ではなく celltype の名前
     1866          # mikan ここでは cell ではなく celltype の名前
    19061867        else
    19071868          f.printf( "%-20s", "#{@global_name}_SET_#{a.get_name}(p_that,val)" )
     
    19351896      end
    19361897
    1937       # mikan const_value の場合
     1898      # mikan const_value の場合
    19381899      f.print( "#define " )
    19391900      if @singleton then
    19401901        f.printf( "%-20s", "#{@global_name}_VAR_#{v.get_name}" )
    19411902        f.print( "\t(#{@global_name}_SINGLE_CELL_#{inib}.#{v.get_name})\n" )
    1942         # mikan ここでは cell ではなく celltype の名前
     1903        # mikan ここでは cell ではなく celltype の名前
    19431904      else
    19441905        f.printf( "%-20s", "#{@global_name}_VAR_#{v.get_name}(p_that)" )
     
    19511912      next if v.is_omit?
    19521913
    1953       # mikan const_value の場合
     1914      # mikan const_value の場合
    19541915      f.print( "#define " )
    19551916      if @singleton then
    19561917        f.printf( "%-20s", "#{@global_name}_GET_#{v.get_name}()" )
    19571918        f.print( "\t(#{@global_name}_SINGLE_CELL_CB.#{v.get_name})\n" )
    1958         # mikan ここでは cell ではなく celltype の名前
     1919        # mikan ここでは cell ではなく celltype の名前
    19591920      else
    19601921        f.printf( "%-20s", "#{@global_name}_GET_#{v.get_name}(p_that)" )
     
    19661927        f.printf( "%-20s", "#{@global_name}_SET_#{v.get_name}(val)" )
    19671928        f.print( "\t(#{@global_name}_SINGLE_CELL_CB.#{v.get_name}=(val))\n" )
    1968         # mikan ここでは cell ではなく celltype の名前
     1929        # mikan ここでは cell ではなく celltype の名前
    19691930      else
    19701931        f.printf( "%-20s", "#{@global_name}_SET_#{v.get_name}(p_that,val)" )
     
    19761937  end
    19771938
    1978   #===  attribute/var アクセスマクロ(短縮形)コードの生成
     1939  #===  attribute/var アクセスマクロ(短縮形)コードの生成
    19791940  def gen_ph_attr_access_abbrev f
    19801941    if @n_attribute_rw > 0 || @n_attribute_ro > 0 then
     
    19851946      next if a.is_omit?
    19861947
    1987       # mikan const_value の場合
     1948      # mikan const_value の場合
    19881949      f.print( "#define " )
    19891950      f.printf( "%-20s", "ATTR_#{a.get_name}" )
     
    20031964      next if v.is_omit?
    20041965
    2005       # mikan const_value の場合
     1966      # mikan const_value の場合
    20061967      f.print( "#define " )
    20071968      f.printf( "%-20s", "VAR_#{v.get_name}" )
     
    20722033        delim = ""
    20732034
    2074         # 関数名の出力(標準:受け口ディスクリプタから VMT の関数名、最適化:受け口関数 or 受け口ディスクリプタ)
     2035        # 関数名の出力(標準:受け口ディスクリプタから VMT の関数名、最適化:受け口関数 or 受け口ディスクリプタ)
    20752036        if b_flow then
    20762037          f.print( "\t  (p_that)->#{p.get_name}#{subsc}.#{fun.get_name}__T( \\\n" )
    20772038        elsif ! p.is_VMT_useless? then
    2078           # 標準コード
     2039          # 標準コード
    20792040          if @singleton then
    20802041            f.print( "\t  #{@global_name}_SINGLE_CELL_#{inib}.#{p.get_name}" )
     
    20842045          f.print( "#{subsc}->VMT->#{fun.get_name}__T( \\\n" )
    20852046        else
    2086           # 最適化コード (optimize) # VMT 不要
     2047          # 最適化コード (optimize) # VMT 不要
    20872048          p2 = p.get_real_callee_port
    20882049          if p2 then
    20892050            ct = p2.get_celltype
    20902051            if p.is_skelton_useless? then
    2091               # 受け口関数を直接呼出す
     2052              # 受け口関数を直接呼出す
    20922053              f.print( "\t  #{ct.get_global_name}_#{p2.get_name}_#{fun.get_name}( \\\n" )
    20932054            else
    2094               # 受け口スケルトン関数を直接呼出す
     2055              # 受け口スケルトン関数を直接呼出す
    20952056              f.print( "\t  #{ct.get_global_name}_#{p2.get_name}_#{fun.get_name}_skel( \\\n" )
    20962057              # print "skelton: #{@name} #{ct.get_global_name}_#{p2.get_name}\n"
    20972058            end
    20982059          else
    2099             # optional で未結合
     2060            # optional で未結合
    21002061            f.print( "\t  ((#{fun.get_declarator.get_type.get_type.get_type_str} (*)()" )
    21012062            f.print( "#{fun.get_declarator.get_type.get_type.get_type_str_post})0)()\n" )
     
    21072068        end
    21082069
    2109         b_join = true    # optional で結合していない場合 false
    2110 
    2111         # 受け口æƒ
    2112 å ±ã®å‡ºåŠ›(標準:受け口ディスクリプタ、最適化:IDX など)
     2070        b_join = true    # optional で結合していない場合 false
     2071
     2072        # 受け口情報の出力(標準:受け口ディスクリプタ、最適化:IDX など)
    21132073        if b_flow then
    21142074        elsif ! p.is_skelton_useless? && ! p.is_cell_unique? then
    2115           # 標準コード
     2075          # 標準コード
    21162076          if @singleton then
    21172077            f.print( "\t  #{@global_name}_SINGLE_CELL_#{inib}.#{p.get_name}#{subsc}" )
     
    21222082          end
    21232083        else
    2124           # 最適化コード (optimize) # スケルトン不要
    2125           c2 = p.get_real_callee_cell               # 唯一のセル(でない場合もある、複数セルがある場合)
    2126           p2 = p.get_real_callee_port               # 唯一のポート(でない場合は、ない)
     2084          # 最適化コード (optimize) # スケルトン不要
     2085          c2 = p.get_real_callee_cell               # 唯一のセル(でない場合もある、複数セルがある場合)
     2086          p2 = p.get_real_callee_port               # 唯一のポート(でない場合は、ない)
    21272087          if p2 then
    2128             ct = p2.get_celltype                    # 呼びå
    2129 ˆã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—
     2088            ct = p2.get_celltype                    # 呼び先のセルタイプ
    21302089            if ! ct.is_singleton? then
    21312090              if ct.has_CB? || ct.has_INIB? then
     
    21342093                  f.print( "\t   #{name_array[7]}" )
    21352094                else
    2136                   # CELLCB IDX を渡す (標準コードと同じだが、扱う型は異なる)
    2137                   # p.is_skelton_useless? == true/false ともに同じ
     2095                  # CELLCB IDX を渡す (標準コードと同じだが、扱う型は異なる)
     2096                  # p.is_skelton_useless? == true/false ともに同じ
    21382097                  f.print( "\t   (p_that)#{inib}->#{p.get_name}#{subsc}" )
    21392098                end
     
    21462105            end
    21472106          else
    2148             # optional で未結合
     2107            # optional で未結合
    21492108            b_join = false
    21502109          end
     
    21632122  end
    21642123
    2165   #=== ref_desc 指定された呼び口に対するディスクリプタ参ç
    2166 §é–¢æ•°ã®ç”Ÿæˆ
     2124  #=== ref_desc 指定された呼び口に対するディスクリプタ参照関数の生成
    21672125  def gen_ph_ref_desc_func f
    21682126    if @n_call_port_ref_desc >0 then
     
    22192177  end
    22202178
    2221   #=== dynamic 指定された呼び口に対するディスクリプタ設定関数の生成
     2179  #=== dynamic 指定された呼び口に対するディスクリプタ設定関数の生成
    22222180  def gen_ph_set_desc_func f
    22232181    if @n_call_port_dynamic >0 then
     
    22912249  end
    22922250
    2293   #=== send/receive で受け取ったメモリ領域を dealloc するマクロコード
     2251  #=== send/receive で受け取ったメモリ領域を dealloc するマクロコード
    22942252  #f:: File
    2295   #b_undef:: bool : true = #undef コードの生成,  false = #define コードの生成
     2253  #b_undef:: bool : true = #undef コードの生成,  false = #define コードの生成
    22962254  def  gen_ph_dealloc_code( f, append_name, b_undef = false )
    22972255    b_msg = false
     
    23002258
    23012259      p.each_param{ |port, fd, par|
    2302         case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
     2260        case par.get_direction                        # 引数の方向指定子 (in, out, inout, send, receive )
    23032261        when :SEND
    23042262          # next if port.get_port_type == :CALL
     
    23172275        end
    23182276
    2319         #                      ポート名         é–¢æ•°å         ãƒ‘ラメータ名
     2277        #                      ポート名         関数名         パラメータ名
    23202278        dealloc_func_name = "#{port.get_name}_#{fd.get_name}_#{par.get_name}_dealloc"
    23212279        dealloc_macro_name = dealloc_func_name.upcase
     
    23562314    @port.each { |p|
    23572315      next if p.get_port_type != :CALL
    2358       # next if p.is_omit?  呼び出すとエラーを起こすコードを生成
     2316      # next if p.is_omit?  呼び出すとエラーを起こすコードを生成
    23592317
    23602318      p.get_signature.get_function_head_array.each{ |fun|
     
    25312489        f.print( "struct tag_#{@global_name}_CB *" )
    25322490      elsif has_INIB? then
    2533         # f.print( "struct tag_#{@global_name}_INIB *" )  # const を出力していない
     2491        # f.print( "struct tag_#{@global_name}_INIB *" )  # const を出力していない
    25342492        f.print( "const struct tag_#{@global_name}_INIB *" )
    25352493      else
     
    25672525
    25682526        if p.get_array_size then
    2569           f.print( "#{delim} int_t subscript" )     # mikan singleton 時の ',' の始末
     2527          f.print( "#{delim} int_t subscript" )     # mikan singleton 時の ',' の始末
    25702528          delim = ","
    25712529        end
     
    25752533          len = items.length
    25762534        else
    2577           # ここで nil になるのは、引数なしの時に void がなかった場合
     2535          # ここで nil になるのは、引数なしの時に void がなかった場合
    25782536          items = []
    25792537          len = 0
     
    25962554
    25972555  def gen_ph_ep_skel_prototype f
    2598     # 受け口スケルトン関数のプロトタイプ宣言を出力
     2556    # 受け口スケルトン関数のプロトタイプ宣言を出力
    25992557    if @n_entry_port >0 then
    26002558      f.printf( TECSMsg.get( :EPSP_comment ), "#_EPSP_#" )
     
    26032561      next if p.get_port_type != :ENTRY
    26042562      next if p.is_omit?
    2605 #      if p.is_skelton_useless? || ! p.is_VMT_useless? then    # 受け口最適化
    2606       if p.is_skelton_useless? then    # 受け口最適化
     2563#      if p.is_skelton_useless? || ! p.is_VMT_useless? then    # 受け口最適化
     2564      if p.is_skelton_useless? then    # 受け口最適化
    26072565#        f.print( "/* #{p.get_name} : omitted by entry port optimize */\n" )
    26082566        next
     
    26232581          len = items.length
    26242582        else
    2625           # ここで nil になるのは、引数なしの時に void がなかった場合
     2583          # ここで nil になるのは、引数なしの時に void がなかった場合
    26262584          items = []
    26272585          len = 0
     
    26462604
    26472605    if ( $rom )then
    2648       # 定数部は ROM, 変数部は RAM
     2606      # 定数部は ROM, 変数部は RAM
    26492607
    26502608      if has_INIB? then
     
    26802638
    26812639    else
    2682       # å
    2683 ¨ã¦ RAM
     2640      # 全て RAM
    26842641      f.printf( TECSMsg.get( :CCTPO_comment ), "#_CCTPO_#" )
    26852642
     
    26952652
    26962653
    2697   #===   attribute の型宣言出力
    2698   #inib_cb::  :INIB または :CB
     2654  #===   attribute の型宣言出力
     2655  #inib_cb::  :INIB または :CB
    26992656  def gen_cell_cb_type_attribute( f, inib_cb )
    27002657    if inib_cb == :INIB && @n_attribute_ro > 0 then
     
    27292686      next if v.is_omit?
    27302687      next if v.get_size_is == nil
    2731       next if $rom && inib_cb == :CB      # size_is 指定されたものは INIB にのみ出力する
     2688      next if $rom && inib_cb == :CB      # size_is 指定されたものは INIB にのみ出力する
    27322689
    27332690      f.print "    "
     
    27382695
    27392696  def gen_cell_cb_type_var f
    2740     # 変数の出力
     2697    # 変数の出力
    27412698    if @n_var > 0 then
    27422699      f.print "    /* var #_VA_# */ \n"
     
    27462703
    27472704      next if v.is_omit?
    2748       next if v.get_size_is != nil    # size_is 指定された var は attribute へ出力する
     2705      next if v.get_size_is != nil    # size_is 指定された var は attribute へ出力する
    27492706
    27502707      f.print "    "
     
    27602717
    27612718  def gen_cell_cb_type_call_port( f, inib_cb )
    2762     # 呼び口
     2719    # 呼び口
    27632720    if @n_call_port >0 then
    27642721      f.print "    /* call port #_TCP_# */\n"
     
    27852742
    27862743        if ! p.is_skelton_useless? then
    2787           # 標準形
     2744          # 標準形
    27882745          if inib_cb == :INIB && p.is_dynamic? && p.get_array_size != nil && $ram_initializer then
    27892746            f.print( "    struct tag_#{p.get_signature.get_global_name}_VDES #{ptr}#{const2}*#{p.get_name;}_init_;\n" )
     
    27952752          end
    27962753        else
    2797           # 最適化 skelton 関数を呼出さない(受け口関数を直接呼出す)
    2798           # 呼びå
    2799 ˆã‚»ãƒ«ã‚¿ã‚¤ãƒ—の CB の IDX 型
     2754          # 最適化 skelton 関数を呼出さない(受け口関数を直接呼出す)
     2755          # 呼び先セルタイプの CB の IDX 型
    28002756          if p.get_real_callee_cell then
    28012757            f.print( "    " )
    28022758            p.get_real_callee_cell.get_celltype.gen_ph_idx_type f
    28032759            f.print( " #{ptr}#{p.get_name;};\n" )
    2804             # 相互参ç
    2805 §ã«å‚™ãˆã¦ã€typedef した型を使わない
     2760            # 相互参照に備えて、typedef した型を使わない
    28062761            # f.print( "    #{p.get_real_callee_cell.get_celltype.get_global_name}_IDX #{ptr}#{p.get_name;};\n" )
    28072762            if p.get_array_size == "[]" then
     
    28092764            end
    28102765          #else
    2811           #  optional で未結合
     2766          #  optional で未結合
    28122767          end
    28132768        end
    28142769      # else
    2815         # 最適化 一つしかセルがない場合、受け口ディスクリプタまたは受け側の IDX は呼び口関数マクロに埋め込まれる
    2816       end
    2817     }
    2818   end
    2819 
    2820   #=== Celltype#受け口é
    2821 åˆ—添数を記憶する変数の定義
     2770        # 最適化 一つしかセルがない場合、受け口ディスクリプタまたは受け側の IDX は呼び口関数マクロに埋め込まれる
     2771      end
     2772    }
     2773  end
     2774
     2775  #=== Celltype#受け口配列添数を記憶する変数の定義
    28222776  def gen_cell_cb_type_entry_port( f, inib_cb )
    2823     # 呼び口
     2777    # 呼び口
    28242778    if @n_entry_port >0 then
    28252779      f.print "    /* call port #_NEP_# */ \n"
     
    28272781
    28282782    @port.each{ |p|
    2829       # next if p.is_omit?                       # 受け口é
    2830 åˆ—の個数は省略しない
     2783      # next if p.is_omit?                       # 受け口配列の個数は省略しない
    28312784      if p.get_port_type == :ENTRY && p.get_array_size == "[]"
    28322785        f.print( "    int_t n_#{p.get_name};\n" )
     
    28502803        f.print "extern #{@global_name}_CB  *const #{@global_name}_CB_ptab[];\n"
    28512804        @ordered_cell_list.each{ |c|
    2852           if c.is_generate? then                           # 生成対象か?
     2805          if c.is_generate? then                           # 生成対象か?
    28532806            name_array = get_name_array c
    28542807            f.print "extern #{@global_name}_CB  #{name_array[4]};\n"
     
    28582811        f.print "extern #{@global_name}_INIB  *const #{@global_name}_INIB_ptab[];\n"
    28592812        @ordered_cell_list.each{ |c|
    2860           if c.is_generate? then                           # 生成対象か?
     2813          if c.is_generate? then                           # 生成対象か?
    28612814            name_array = get_name_array c
    28622815            f.print "extern #{@global_name}_INIB  #{name_array[11]};\n"
     
    28752828
    28762829  def gen_ph_INIB_as_CB f
    2877     # ここは、手抜きである。本来なら INIB を出力すべき
     2830    # ここは、手抜きである。本来なら INIB を出力すべき
    28782831    if ! has_CB? && has_INIB? then
    28792832      f.printf( TECSMsg.get( :DCI_comment ),  "#_DCI_#" )
     
    28922845  end
    28932846
    2894   #===  イテレータコード (FOREACH_CELL)の生成
    2895   #      singleton では出力しない
     2847  #===  イテレータコード (FOREACH_CELL)の生成
     2848  #      singleton では出力しない
    28962849  def gen_ph_foreach_cell f
    28972850
     
    29362889
    29372890
    2938   #===  変数var初期化コード
     2891  #===  変数var初期化コード
    29392892  #
    29402893  def gen_ph_cb_initialize_macro f
     
    29472900        type = v.get_type
    29482901        if( type.kind_of? PtrType )then
    2949           # PtrType は ArrayType にすり替える
    2950 
    2951           # 初期化子の要素数とする (後は 0 である)
     2902          # PtrType は ArrayType にすり替える
     2903
     2904          # 初期化子の要素数とする (後は 0 である)
    29522905          t2 = ArrayType.new( Expression.create_integer_constant( init.length, nil ) )
    29532906          t2.set_type( type.get_type )
     
    30052958      }
    30062959
    3007       # dynamic call port の初期化コード
     2960      # dynamic call port の初期化コード
    30082961      b_dyn_port = false
    30092962      @port.each{ |p|
     
    30613014
    30623015    # else
    3063     #   ã‚»ãƒ«ãŒä¸€ã¤ã‚‚なければ出力しない
     3016    #   セルが一つもなければ出力しない
    30643017    end
    30653018
     
    30683021
    30693022  def gen_ph_inline f
    3070     # inline ポートが一つでもあれば、inline.h の include
     3023    # inline ポートが一つでもあれば、inline.h の include
    30713024    if @n_entry_port_inline > 0 then
    30723025      f.printf( TECSMsg.get( :INL_comment ), "#_INL_#" )
     
    31203073      next if p.get_port_type != :ENTRY
    31213074      next if p.is_omit?
    3122       if p.is_skelton_useless?    # 受け口最適化
     3075      if p.is_skelton_useless?    # 受け口最適化
    31233076        f.print( "/* #{p.get_name} : omitted by entry port optimize */\n\n" )
    31243077        next
     
    31313084        f.print( "    #{@name}_IDX  idx;\n" )
    31323085      else
    3133         # CB も INIB も存在しない (ので、idx として整数で初期化しておく)
     3086        # CB も INIB も存在しない (ので、idx として整数で初期化しておく)
    31343087        f.print( "    int           idx;\n" )
    31353088      end
     
    31493102      next if p.get_port_type != :ENTRY
    31503103      next if p.is_omit?
    3151       if p.is_skelton_useless? then    # 受け口最適化
     3104      if p.is_skelton_useless? then    # 受け口最適化
    31523105        f.print( "/* #{p.get_name} : omitted by entry port optimize */\n" )
    31533106        next
     
    31683121          len = items.length
    31693122        else
    3170           # ここで nil になるのは、引数なしの時に void がなかった場合
     3123          # ここで nil になるのは、引数なしの時に void がなかった場合
    31713124          items = []
    31723125          len = 0
     
    31903143        end
    31913144
    3192         if functype.get_type_str == "void" then # mikan "void" の typedef に未対応
     3145        if functype.get_type_str == "void" then # mikan "void" の typedef に未対応
    31933146          f.print "    "
    31943147        else
     
    32333186      next if p.get_port_type != :ENTRY
    32343187      next if p.is_omit?
    3235       if p.is_VMT_useless? then    # 受け口最適化
     3188      if p.is_VMT_useless? then    # 受け口最適化
    32363189        f.print "/* #{p.get_name} : omitted by entry port optimize */\n"
    32373190        next
     
    32593212    end
    32603213
    3261     # このセルタイプのすべてのセルについて
     3214    # このセルタイプのすべてのセルについて
    32623215    @ordered_cell_list.each{ |c|
    3263       if c.is_generate? then                           # 生成対象か?
     3216      if c.is_generate? then                           # 生成対象か?
    32643217
    32653218        f = fs[ c.get_region.get_domain_root ]
    32663219
    3267         # 結合のリスト (NamedList)
     3220        # 結合のリスト (NamedList)
    32683221        jl = c.get_join_list
    32693222
    3270         # å
    3271 ¨ã¦ã®çµåˆãƒªã‚¹ãƒˆã«ã¤ã„て
     3223        # 全ての結合リストについて
    32723224        jl.get_items.each{ |j|
    32733225
    3274           # 左辺の定義を得る
     3226          # 左辺の定義を得る
    32753227          definition = j.get_definition
    32763228
    3277           # 呼び口ではない? (属性)
     3229          # 呼び口ではない? (属性)
    32783230          next unless definition.instance_of? Port
    32793231
    3280           port = find j.get_name # celltype の Port (こちらに最適化æƒ
    3281 å ±ãŒã‚ã‚‹)
    3282           # port = definition    # definition は composite の Port が得られることがある
     3232          port = find j.get_name # celltype の Port (こちらに最適化情報がある)
     3233          # port = definition    # definition は composite の Port が得られることがある
    32833234          next if port.is_cell_unique?
    32843235          next if port.is_omit?
    32853236
    3286           # é
    3287 åˆ—要素を得る(受け口é
    3288 åˆ—でなければ nil が返る)
     3237          # 配列要素を得る(受け口配列でなければ nil が返る)
    32893238          am = j.get_array_member2
    32903239
    3291           # 呼び口é
    3292 åˆ—か?
     3240          # 呼び口配列か?
    32933241          if am  then
    32943242            i = 0
     
    32973245              if j then
    32983246                if am[i].get_rhs_cell.get_celltype == self then
    3299                   # 同じセルタイプへ結合している場合(VDES では type conflict になる)
     3247                  # 同じセルタイプへ結合している場合(VDES では type conflict になる)
    33003248                  p = am[i].get_rhs_port
    33013249                  des_type = "const struct tag_#{@global_name}_#{p.get_name}_DES"
     
    33043252                end
    33053253
    3306                 # 右辺は受け口é
    3307 åˆ—か?
     3254                # 右辺は受け口配列か?
    33083255                if j.get_rhs_subscript then
    33093256
    3310                   # 受け口のé
    3311 åˆ—添数
     3257                  # 受け口の配列添数
    33123258                  subscript = j.get_rhs_subscript
    33133259
     
    33223268                end
    33233269              #else if j == nil
    3324               #  optioanl でé
    3325 åˆ—要素が初期化されていない
     3270              #  optioanl で配列要素が初期化されていない
    33263271              end
    33273272              i += 1
     
    33303275            dbgPrint "me=#{@name} callee=#{j.get_rhs_cell.get_celltype.get_name} #{j.get_cell.get_celltype.get_name} \n"
    33313276            if j.get_rhs_cell.get_celltype == self then
    3332               # 同じセルタイプへ結合している場合(VDES では type conflict になる)
     3277              # 同じセルタイプへ結合している場合(VDES では type conflict になる)
    33333278              p = j.get_rhs_port
    33343279              des_type = "const struct tag_#{@global_name}_#{p.get_name}_DES"
     
    33383283
    33393284            if j.get_rhs_subscript then
    3340               # 受け口é
    3341 åˆ—
     3285              # 受け口配列
    33423286              subscript = j.get_rhs_subscript
    33433287              f.printf( "extern %s %s%d;\n",
     
    33513295            end
    33523296          end
    3353           # mikan   cell の namespace 未対応、Join で Cell オブジェクトを引当ておくå¿
    3354 è¦ã‚ã‚Š
     3297          # mikan   cell の namespace 未対応、Join で Cell オブジェクトを引当ておく必要あり
    33553298        }
    33563299
     
    33623305  def gen_cell_ep_vdes_array fs
    33633306    if @n_cell_gen >0 then
    3364       fs.each{ |r, f| f.printf( TECSMsg.get( :CPA_comment ), "#_CPA_#" ) }  # mikan 呼び口é
    3365 åˆ—が無い場合も出てしまう
     3307      fs.each{ |r, f| f.printf( TECSMsg.get( :CPA_comment ), "#_CPA_#" ) }  # mikan 呼び口配列が無い場合も出てしまう
    33663308    end
    33673309
     
    33713313
    33723314        jl = c.get_join_list
    3373         # ループを回す変数を jl から @port に変更
     3315        # ループを回す変数を jl から @port に変更
    33743316        # dynamic, optional
    33753317#        jl.get_items.each{ |j|
     
    33823324          j = jl.get_item( port.get_name )
    33833325
    3384           # port = definition    # definition は composite の Port が得られることがある
    3385           # port = find j.get_name # celltype の Port (こちらに最適化æƒ
    3386 å ±ãŒã‚ã‚‹)
     3326          # port = definition    # definition は composite の Port が得られることがある
     3327          # port = find j.get_name # celltype の Port (こちらに最適化情報がある)
    33873328          next if port.is_cell_unique?
    33883329          next if port.is_omit?
     
    34053346          if b_array  then
    34063347#          if am then
    3407             # 左辺はé
    3408 åˆ—
     3348            # 左辺は配列
    34093349            const = ( port.is_dynamic? && ! $ram_initializer ) ? '' : 'const '
    34103350            init = ( port.is_dynamic? && $ram_initializer ) ? '_init_' : ''
     
    34173357            else
    34183358
    3419 #              スケルトン関数不要最適化の場合、このé
    3420 åˆ—は参ç
    3421 §ã•ã‚Œãªã„
    3422               # mikan このケースがテストされていない
     3359#              スケルトン関数不要最適化の場合、この配列は参照されない
     3360              # mikan このケースがテストされていない
    34233361              f.printf( "#{const}%s_IDX  %s_%s[] = {\n",
    3424 #                        "#{j.get_celltype.get_global_name}",   # 右辺 composite に対応できない
     3362#                        "#{j.get_celltype.get_global_name}",   # 右辺 composite に対応できない
    34253363                        "#{j.get_rhs_cell.get_celltype.get_global_name}",
    34263364                        "#{c.get_global_name}",
     
    34443382
    34453383              if j then
    3446                 # 同一セルタイプの結合の場合、VDES 型へのキャストがå¿
    3447 è¦
     3384                # 同一セルタイプの結合の場合、VDES 型へのキャストが必要
    34483385                if j.get_rhs_cell.get_celltype == self then
    34493386                  definition = j.get_definition
     
    34553392               
    34563393                if j.get_rhs_subscript then
    3457                   # 右辺é
    3458 åˆ—の場合(最適化はない)
     3394                  # 右辺配列の場合(最適化はない)
    34593395                  subscript = j.get_rhs_subscript
    34603396                  f.printf( "    %s%d,\n",
     
    34653401
    34663402                else
    3467                   # 右辺非é
    3468 åˆ—の場合 */
     3403                  # 右辺非配列の場合 */
    34693404                  if ! port.is_skelton_useless? then
    34703405                    f.printf( "    %s,\n",
     
    34773412                end
    34783413              else
    3479                 # optional で呼び口é
    3480 åˆ—要素が初期化されていない
     3414                # optional で呼び口配列要素が初期化されていない
    34813415                f.printf( "    0,\n" )
    34823416              end
    34833417            # }
    34843418            end
    3485             # mikan   cell の namespace 未対応、Join で Cell オブジェクトを引当ておくå¿
    3486 è¦ã‚ã‚Š
     3419            # mikan   cell の namespace 未対応、Join で Cell オブジェクトを引当ておく必要あり
    34873420            f.print "};\n"
    3488             # dynamic の呼び口é
    3489 åˆ—
     3421            # dynamic の呼び口配列
    34903422            if port.is_dynamic? && $ram_initializer then
    34913423              f.printf( "struct %s * %s_%s[ #{length} ];\n",
     
    35023434  end
    35033435
    3504   #=== CB を初期化するプログラムの生成
     3436  #=== CB を初期化するプログラムの生成
    35053437  def gen_cell_cb_initialize_code f
    35063438    if ! need_CB_initializer?
     
    35343466  end
    35353467
    3536   # === CB/INIB の外で初期化される変数の出力
     3468  # === CB/INIB の外で初期化される変数の出力
    35373469  def gen_cell_cb_out_init fs
    35383470
    3539     # セルがなければ、出力しない
     3471    # セルがなければ、出力しない
    35403472    if @n_cell_gen == 0 then
    35413473      return
     
    35443476    fs.each{ |r, f| f.printf( TECSMsg.get( :AVAI_comment ), "#_AVAI_#" ) }
    35453477
    3546     # attribute, var のポインタ型の参ç
    3547 §ã™ã‚‹é
    3548 åˆ—を生成
     3478    # attribute, var のポインタ型の参照する配列を生成
    35493479    @ordered_cell_list.each{ |c|
    35503480      next if  ! c.is_generate?
     
    35563486      jl = c.get_join_list
    35573487
    3558       # attribute, var のポインタ変数がé
    3559 åˆ—により初期化される場合の、é
    3560 åˆ—を出力
     3488      # attribute, var のポインタ変数が配列により初期化される場合の、配列を出力
    35613489      av_list = ct.get_attribute_list + ct.get_var_list
    35623490      if av_list.length != 0 then
     
    35743502
    35753503            if size then
    3576               # 式を評価する(attribute, var に含まれる変数を参ç
    3577 §å¯èƒ½)
     3504              # 式を評価する(attribute, var に含まれる変数を参照可能)
    35783505              sz = size.eval_const( c.get_join_list, c.get_celltype.get_name_list )
    3579               # 式を生成しなおす (変数を含まない形にする)  不完å
    3580 ¨ãªå½¢ã§ Token を生成 (エラー発生しないから)
     3506              # 式を生成しなおす (変数を含まない形にする)  不完全な形で Token を生成 (エラー発生しないから)
    35813507              size = Expression.new( [:INTEGER_CONSTANT, Token.new(sz, nil, 0, 0)] )
    35823508              array_type = ArrayType.new( size )
     
    35923518                                                                # name_array[3]: cell_CB_INIT
    35933519              if !( $ram_initializer && a.get_kind == :VAR ) then
    3594                 # -R (ram initializer 使用) の場合 var は初期化コードを出力しない
     3520                # -R (ram initializer 使用) の場合 var は初期化コードを出力しない
    35953521                if( init )then
    35963522                  str = " = #{gen_cell_cb_init( f, c, name_array, array_type, init, a.get_identifier, 1, true )}"
     
    36103536  end
    36113537
    3612   #=== var の初期値の ROM 部への
     3538  #=== var の初期値の ROM 部への
    36133539  def gen_cell_var_init f
    3614     # var の{ }で囲まれた初期値指定があるか調べる
     3540    # var の{ }で囲まれた初期値指定があるか調べる
    36153541    n_init = 0
    36163542    @var.each { |v|
     
    36303556
    36313557          if( org_type.kind_of? PtrType )then
    3632             # PtrType は ArrayType にすり替える
    3633 
    3634             # 初期化子の要素数だけとする(後は 0)
     3558            # PtrType は ArrayType にすり替える
     3559
     3560            # 初期化子の要素数だけとする(後は 0)
    36353561            t2 = ArrayType.new( Expression.create_integer_constant( init.length, nil ) )
    36363562            t2.set_type( type.get_type )
     
    36393565          end
    36403566
    3641           c = @ordered_cell_list[0]   # 仮の cell (実際には使われない)
     3567          c = @ordered_cell_list[0]   # 仮の cell (実際には使われない)
    36423568          name_array = get_name_array( c )
    36433569          # f.print "const #{type0.get_type_str}\t#{@global_name}_#{v.get_name}_VAR_INIT#{type0.get_type_str_post} = "
    36443570          f.print "const #{type.get_type_str}\t#{@global_name}_#{v.get_name}_VAR_INIT#{type.get_type_str_post} = "
    36453571          if org_type.kind_of? StructType then
    3646             # celltype の default の初期値あり
     3572            # celltype の default の初期値あり
    36473573            str = gen_cell_cb_init( f, c, name_array, type, init, v.get_identifier, 1, true )
    36483574          elsif( org_type.kind_of?( PtrType ) || org_type.kind_of?( ArrayType ) ) then
    36493575            str = "{ "
    36503576            type = org_type.get_type
    3651             # mikan ポインタではなく、é
    3652 åˆ—型としないと、ポインタ変数の領域の分、損する
     3577            # mikan ポインタではなく、配列型としないと、ポインタ変数の領域の分、損する
    36533578            init.each { |i|
    36543579              str += gen_cell_cb_init( f, c, name_array, type, i, v.get_identifier, 1, true )
     
    37073632
    37083633        unless @singleton then
    3709           # 1 つの cell INIB の終わり
     3634          # 1 つの cell INIB の終わり
    37103635          if @b_need_ptab then
    37113636            f.print( "};\n\n" )
     
    37253650      end
    37263651
    3727       # RAM initializer を使用しない、または ROM 化しない
     3652      # RAM initializer を使用しない、または ROM 化しない
    37283653      if $ram_initializer == false || $rom == false then
    37293654        if @singleton then
     
    37723697
    37733698          unless @singleton then
    3774             # 1 つの cell CB の終わり
     3699            # 1 つの cell CB の終わり
    37753700            if @b_need_ptab then
    37763701              f.print( "};\n\n" )
     
    38103735        f.print "/* ID to INIB table #_INTAB_# */\n"
    38113736        @ordered_cell_list.each{ |c|
    3812           if c.is_generate? && ( c.get_region.get_domain_root != Region.get_root ) then # 生成対象かつ、ルート以外か
     3737          if c.is_generate? && ( c.get_region.get_domain_root != Region.get_root ) then # 生成対象かつ、ルート以外か
    38133738            name_array = get_name_array( c )
    38143739            print_indent( f, indent + 1 )
     
    38193744        f.print "#{@global_name}_INIB *const #{@global_name}_INIB_ptab[] ={\n"
    38203745        @ordered_cell_list.each{ |c|
    3821           if c.is_generate? then                           # 生成対象か?
     3746          if c.is_generate? then                           # 生成対象か?
    38223747            name_array = get_name_array( c )
    38233748            print_indent( f, indent + 1 )
     
    38303755        f.print "/* ID to CB table #_CBTAB_# */\n"
    38313756        @ordered_cell_list.each{ |c|
    3832           if c.is_generate? && ( c.get_region.get_domain_root != Region.get_root ) then # 生成対象かつ、ルート以外か
     3757          if c.is_generate? && ( c.get_region.get_domain_root != Region.get_root ) then # 生成対象かつ、ルート以外か
    38333758            name_array = get_name_array( c )
    38343759            print_indent( f, indent + 1 )
     
    38393764        f.print "#{@global_name}_CB *const #{@global_name}_CB_ptab[] ={\n"
    38403765        @ordered_cell_list.each{ |c|
    3841           if c.is_generate? then                           # 生成対象か?
     3766          if c.is_generate? then                           # 生成対象か?
    38423767            name_array = get_name_array( c )
    38433768            print_indent( f, indent + 1 )
     
    38513776
    38523777
    3853   #=== name_array を生成
     3778  #=== name_array を生成
    38543779  # IN:   cell  : Cell
    3855   #       index : CB, INIB é
    3856 åˆ—の添数
     3780  #       index : CB, INIB 配列の添数
    38573781  # RETURN: name_array
    38583782  #   name_array[0] = @name           # celltype name
    38593783  #   name_array[1] = cell.get_name   # cell name
    38603784  #   name_array[2] = cell_CB_name    # cell_CB_name
    3861   #   name_array[3] = cell_CB_INIT    # cell_CB_INIT # CB の外側で初期化がå¿
    3862 è¦ãªé
    3863 åˆ—の名前
     3785  #   name_array[3] = cell_CB_INIT    # cell_CB_INIT # CB の外側で初期化が必要な配列の名前
    38643786  #   name_array[4] = cell_CB_proto   # CB name for prototype
    38653787  #   name_array[5] = cell_INIB       # INIB name
     
    39033825      cell_CBP = "&#{cell_INIB_name}"
    39043826    else
    3905       cell_CBP = "NULL"    # CB も INIB もなければ NULL に置換
     3827      cell_CBP = "NULL"    # CB も INIB もなければ NULL に置換
    39063828    end
    39073829
     
    39293851  end
    39303852
    3931   #=== attribute と size_is 指定された var (ポインタ)の初期化データを出力
     3853  #=== attribute と size_is 指定された var (ポインタ)の初期化データを出力
    39323854  #
    3933   # ROM 化サポートの有無、および出力対象が CB か INIB かにより出力されるå†
    3934 å®¹ãŒç•°ãªã‚‹
     3855  # ROM 化サポートの有無、および出力対象が CB か INIB かにより出力される内容が異なる
    39353856  def gen_cell_cb_attribute( cell, indent, f, name_array, cb_inib )
    39363857    ct = self
     
    39423863      f.print "/* attribute(RO) */ \n"
    39433864    elsif $rom then  # && cb_inib == CB
    3944       # CB で rw と var
     3865      # CB で rw と var
    39453866      return if @n_attribute_rw == 0
    39463867      print_indent( f, indent + 1 )
    39473868      f.print "/* attribute(RW) */ \n"
    39483869    else  # cb_inib == CB && $rom == false
    3949       # CB にå
    3950 ¨éƒ¨
     3870      # CB に全部
    39513871      return if @n_attribute_rw == 0 && @n_attribute_ro == 0 && @n_var_size_is == 0
    39523872      print_indent( f, indent + 1 )
     
    39583878      next if a.is_omit?
    39593879      if cb_inib == :INIB && a.is_rw? == true then
    3960         # $rom == true でしか、ここへ来ない
     3880        # $rom == true でしか、ここへ来ない
    39613881        next
    39623882      elsif cb_inib == :CB && $rom && ! a.is_rw? then
     
    39663886      j = jl.get_item( a.get_identifier )
    39673887      if j then
    3968         # cell の初期値指定あり
     3888        # cell の初期値指定あり
    39693889        gen_cell_cb_init( f, cell, name_array, a.get_type, j.get_rhs, a.get_identifier, indent + 1 )
    39703890      elsif a.get_initializer then
    3971         # celltype の default の初期値あり
     3891        # celltype の default の初期値あり
    39723892        gen_cell_cb_init( f, cell, name_array, a.get_type, a.get_initializer, a.get_identifier, indent + 1 )
    39733893      else
    3974         # 初期値未指定
     3894        # 初期値未指定
    39753895        gen_cell_cb_init( f, cell, name_array, a.get_type, nil, a.get_identifier, indent + 1 )
    39763896      end
     
    39783898    @var.each{ |v|
    39793899      next if v.is_omit?
    3980       next if v.get_size_is == nil   # size_is 指定がある場合 attribute の一部として出力
     3900      next if v.get_size_is == nil   # size_is 指定がある場合 attribute の一部として出力
    39813901
    39823902      if v.get_initializer && $ram_initializer == false then
    39833903        gen_cell_cb_init( f, cell, name_array, v.get_type, v.get_initializer, v.get_identifier, indent + 1 )
    39843904      else
    3985         # 初期値未指定 または RAM initializer 使用
     3905        # 初期値未指定 または RAM initializer 使用
    39863906        gen_cell_cb_init( f, cell, name_array, v.get_type, nil, v.get_identifier, indent + 1 )
    39873907      end
     
    39893909  end
    39903910
    3991   #=== var の初期化データを出力
     3911  #=== var の初期化データを出力
    39923912  def gen_cell_cb_var( cell, indent, f, name_array )
    39933913    jl = cell.get_join_list
     
    39993919
    40003920        next if v.is_omit?
    4001         next if v.get_size_is      # size_is 指定がある場合 attribute の一部として出力
     3921        next if v.get_size_is      # size_is 指定がある場合 attribute の一部として出力
    40023922
    40033923        if v.get_initializer && $ram_initializer == false then
    40043924          gen_cell_cb_init( f, cell, name_array, v.get_type, v.get_initializer, v.get_identifier, indent + 1 )
    40053925        else
    4006           # 初期値未指定 または RAM initializer 使用
     3926          # 初期値未指定 または RAM initializer 使用
    40073927          gen_cell_cb_init( f, cell, name_array, v.get_type, nil, v.get_identifier, indent + 1 )
    40083928        end
     
    40173937  end
    40183938
    4019   #=== 呼び口の初期化コードの生成
     3939  #=== 呼び口の初期化コードの生成
    40203940  def gen_cell_cb_call_port( cell, indent, f, name_array, inib_cb )
    40213941    jl = cell.get_join_list
     
    40313951        next if p.get_port_type != :CALL
    40323952        next if p.is_omit?
    4033         next if p.is_cell_unique?        # 最適化(単一セルで呼び口マクロに埋め込まれる)
     3953        next if p.is_cell_unique?        # 最適化(単一セルで呼び口マクロに埋め込まれる)
    40343954        next if inib_cb == :INIB && p.is_dynamic? && p.get_array_size == nil && ! $ram_initializer
    40353955        next if inib_cb == :CB_DYNAMIC && ( ! p.is_dynamic? || p.get_array_size != nil )
     
    40413961        if j == nil then
    40423962          dbgPrint "cell_cb_call_port: #{p.get_name} array size=#{p.get_array_size}\n"
    4043           # optional 呼び口
     3963          # optional 呼び口
    40443964          # cdl_error( "H1003 internal error: cell \'$1\' port \'$2\': initializer not found\n" , cell.get_name, p.get_name )
    40453965          # exit( 1 )
     
    40593979            end
    40603980            if p.get_array_size == "[]" then
    4061               # 添数省略の呼び口é
    4062 åˆ—
     3981              # 添数省略の呼び口配列
    40633982              print_indent( f, indent + 1 )
    40643983              f.printf( "%-40s /* %s #_CCP6_# */\n", "0,", "length of #{p.get_name} (n_#{p.get_name})" )
     
    40723991        am = j.get_array_member2
    40733992        if am then
    4074           # 呼び口é
    4075 åˆ—の場合
     3993          # 呼び口配列の場合
    40763994          if inib_cb == :INIB && p.is_dynamic? && p.get_array_size != nil && $ram_initializer then
    40773995            f.printf( "%-40s /* #_CCP3_# _init_ */\n",  "#{cell.get_global_name}_#{j.get_name}_init_," )
     
    40803998          f.printf( "%-40s /* #_CCP3B_# */\n",  "#{cell.get_global_name}_#{j.get_name}," )
    40813999          if p.get_array_size == "[]" then
    4082             # 添数省略の呼び口é
    4083 åˆ—
     4000            # 添数省略の呼び口配列
    40844001            print_indent( f, indent + 1 )
    40854002            f.printf( "%-40s /* %s #_CCP4_# */\n", "#{am.length},", "length of #{p.get_name} (n_#{p.get_name})" )
    40864003          end
    40874004        else
    4088           # 同一セルタイプの結合の場合、VDES 型へのキャストがå¿
    4089 è¦
     4005          # 同一セルタイプの結合の場合、VDES 型へのキャストが必要
    40904006          #print "CCP0/CCP1 #{p.get_name}, #{j.get_rhs_cell.get_celltype.get_name}, #{@name}\n"
    40914007          if j.get_rhs_cell.get_celltype == self then
     
    40994015
    41004016          if j.get_rhs_subscript then
    4101             # 受け口é
    4102 åˆ—の場合
     4017            # 受け口配列の場合
    41034018            subscript = j.get_rhs_subscript
    41044019            f.printf( "%-40s /* %s #_CCP0_# */\n",
     
    41074022                      p.get_name.to_s + init )
    41084023          else
    4109             # 呼び口é
    4110 åˆ—でも、受け口é
    4111 åˆ—でもない
     4024            # 呼び口配列でも、受け口配列でもない
    41124025            if ! p.is_skelton_useless? then
    41134026              f.printf( "%-40s /* %s #_CCP1_# */\n",
     
    41154028                        p.get_name.to_s + init )
    41164029            else
    4117               # スケルトン不要最適化(CB (INIB) へのポインタを埋め込む)
    4118               c = j.get_rhs_cell                    # 呼びå
    4119 ˆã‚»ãƒ«
    4120               ct = c.get_celltype                   # 呼びå
    4121 ˆã‚»ãƒ«ã‚¿ã‚¤ãƒ—
    4122               name_array = ct.get_name_array( c )   # 呼びå
    4123 ˆã‚»ãƒ«ã‚¿ã‚¤ãƒ—で name_array を得る
     4030              # スケルトン不要最適化(CB (INIB) へのポインタを埋め込む)
     4031              c = j.get_rhs_cell                    # 呼び先セル
     4032              ct = c.get_celltype                   # 呼び先セルタイプ
     4033              name_array = ct.get_name_array( c )   # 呼び先セルタイプで name_array を得る
    41244034              if ct.has_INIB? || ct.has_CB? then
    41254035                f.printf( "%-40s /* %s #_CCP2_# */\n", "#{name_array[7]},", p.get_name )
    41264036              else
    4127                 # 呼びå
    4128 ˆã¯ CB も INIB も持たない(NULL に初期化)
     4037                # 呼び先は CB も INIB も持たない(NULL に初期化)
    41294038                f.printf( "%-40s /* %s #_CCP2B_# */\n", "0,", p.get_name )
    41304039              end
     
    41374046  end
    41384047
    4139   #=== 受け口の初期化コードの生成
     4048  #=== 受け口の初期化コードの生成
    41404049  def gen_cell_cb_entry_port( cell, indent, f, name_array )
    41414050    jl = cell.get_join_list
     
    41464055      f.print "/* entry port #_EP_# */ \n"
    41474056      @port.each{ |p|
    4148         # next if p.is_omit?  # 受け口é
    4149 åˆ—の個数は省略しない
     4057        # next if p.is_omit?  # 受け口配列の個数は省略しない
    41504058        if p.get_port_type == :ENTRY && p.get_array_size == "[]"
    41514059          print_indent( f, indent + 1 )
     
    41564064  end
    41574065
    4158   #=== セルの attribute の初期値を出力
     4066  #=== セルの attribute の初期値を出力
    41594067  #
    4160   #f_get_str:: true の場合、文字列を返す、false の場合、ファイル f に出力する.
    4161   # 文字列を返すとき、末尾に ',' は含まれない.
    4162   # ファイルへ出力するとき、末尾に ',' が出力される.構造体要素、é
    4163 åˆ—要素の初期値を出力すると ',' が二重に出力される.
    4164   # ただし現状では、ファイルへ出力することはない
     4068  #f_get_str:: true の場合、文字列を返す、false の場合、ファイル f に出力する.
     4069  # 文字列を返すとき、末尾に ',' は含まれない.
     4070  # ファイルへ出力するとき、末尾に ',' が出力される.構造体要素、配列要素の初期値を出力すると ',' が二重に出力される.
     4071  # ただし現状では、ファイルへ出力することはない
    41654072  #
    41664073  def gen_cell_cb_init( f, cell, name_array, type, init, identifier, indent, f_get_str = false )
     
    41764083
    41774084      if f_get_str then
    4178         # 初期値未指定
     4085        # 初期値未指定
    41794086        if type.kind_of?( BoolType ) then
    41804087          str = "false"   # formerly tecs_false
     
    42004107        return str
    42014108      else
    4202         # 初期値未指定
     4109        # 初期値未指定
    42034110        if type.kind_of?( BoolType ) then
    42044111          f.print "    " * indent
     
    42344141    end   
    42354142
    4236     # このメソッドは Celltype のものであるå¿
    4237 è¦ã¯ç„¡ã„(上に続くのでここに置く)
    4238     # 初期値指定あり
     4143    # このメソッドは Celltype のものである必要は無い(上に続くのでここに置く)
     4144    # 初期値指定あり
    42394145    if type.kind_of?( BoolType ) then
    42404146      if init.instance_of?( C_EXP ) then
     
    43024208
    43034209      len.times {
    4304         next if ! init[i]        # mikan この処置は適切?
     4210        next if ! init[i]        # mikan この処置は適切?
    43054211        if f_get_str then
    43064212          str += gen_cell_cb_init( f, cell, name_array, at, init[i], "#{identifier}[#{i}]", indent + 1, f_get_str )
     
    43844290  end
    43854291
    4386   #== 関数テーブルの外部参ç
    4387 §
     4292  #== 関数テーブルの外部参照
    43884293  def gen_cell_extern_mt fs
    43894294    fs.each{ |r, f|
     
    44004305  end
    44014306
    4402   #=== 受け口ディスクリプタの定義を生成
     4307  #=== 受け口ディスクリプタの定義を生成
    44034308  def gen_cell_ep_des fs
    44044309    if @n_cell_gen >0 then
     
    44134318      f = fs[ c.get_region.get_domain_root ]
    44144319
    4415       ct = c.get_celltype     # ct = self でも同じ
     4320      ct = c.get_celltype     # ct = self でも同じ
    44164321      jl = c.get_join_list
    44174322      name_array = get_name_array( c )
     
    44224327          next if p.get_port_type != :ENTRY
    44234328          next if p.is_omit?
    4424           if p.is_skelton_useless?       # 受け口最適化n ep_opt
     4329          if p.is_skelton_useless?       # 受け口最適化n ep_opt
    44254330            f.print( "/* #{p.get_name} : omitted by entry port optimize */\n" )
    44264331            next
     
    44334338
    44344339          if len != nil then
    4435             # 受け口é
    4436 åˆ—の場合
     4340            # 受け口配列の場合
    44374341            i = 0
    44384342            while i < len
     
    45194423    return if @b_reuse && ! $generate_all_template
    45204424    if ! ( @plugin && @plugin.gen_ep_func? ) then
    4521       return if $generate_no_template     # $generate_all_template より優å
    4522 ˆã•ã‚Œã‚‹
    4523 
    4524       # 参考として出力するテンプレートファイルであることを示すために "_templ" を付加する
     4425      return if $generate_no_template     # $generate_all_template より優先される
     4426
     4427      # 参考として出力するテンプレートファイルであることを示すために "_templ" を付加する
    45254428      fname = "#{$gen}/#{@global_name}_templ.#{$c_suffix}"
    45264429    else
    4527       # Plugin により生成されたセルタイプについては、原則的にテンプレートではなく、
    4528       # 修正不要なセルタイプの実è£
    4529 ã‚³ãƒ¼ãƒ‰ã‚’生成する.
    4530       # このため、ファイル名に _temp を付加しない
     4430      # Plugin により生成されたセルタイプについては、原則的にテンプレートではなく、
     4431      # 修正不要なセルタイプの実装コードを生成する.
     4432      # このため、ファイル名に _temp を付加しない
    45314433      fname = "#{$gen}/#{@global_name}.#{$c_suffix}"
    45324434    end
     
    45434445    gen_template_attr_access f
    45444446    gen_template_cp_fun f
    4545     # gen_template_types f     # 0805503 追加してみたが、やっぱりやめる
     4447    # gen_template_types f     # 0805503 追加してみたが、やっぱりやめる
    45464448    f.print( " *\n * #[</PREAMBLE>]# */\n\n" )
    45474449    f.printf TECSMsg.get( :PAC_comment ), "#_PAC_#"
     
    45494451    gen_template_private_header f
    45504452    if ( @plugin ) then
    4551       # このメソッドの引数は plugin.rb の説明を見よ
     4453      # このメソッドの引数は plugin.rb の説明を見よ
    45524454      @plugin.gen_preamble( f, @singleton, @name, @global_name )
    45534455    end
     
    45584460
    45594461    if ( @plugin ) then
    4560       # このメソッドの引数は plugin.rb の説明を見よ
     4462      # このメソッドの引数は plugin.rb の説明を見よ
    45614463      @plugin.gen_postamble( f, @singleton, @name, @global_name )
    45624464    end
     
    47404642      next if p.get_port_type != :ENTRY
    47414643      next if p.is_omit?
    4742       next if b_inline && ! p.is_inline?  # inline ポート
    4743       next if ! b_inline && p.is_inline?  # 非 inline ポート
     4644      next if b_inline && ! p.is_inline?  # inline ポート
     4645      next if ! b_inline && p.is_inline?  # 非 inline ポート
    47444646
    47454647      inline_prefix = ""
     
    47984700          len = items.length
    47994701        else
    4800           # ここで nil になるのは、引数なしの時に void がなかった場合
     4702          # ここで nil になるのは、引数なしの時に void がなかった場合
    48014703          items = []
    48024704          len = 0
     
    48194721
    48204722        if ( @plugin && @plugin.gen_ep_func? ) then
    4821           # このメソッドの引数は plugin.rb の説明を見よ
     4723          # このメソッドの引数は plugin.rb の説明を見よ
    48224724          @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 )
    48234725
     
    48674769    if ! ( @plugin && @plugin.gen_ep_func? ) then
    48684770      return if @b_reuse && ! $generate_all_template
    4869       return if $generate_no_template     # $generate_all_template より優å
    4870 ˆã•ã‚Œã‚‹
    4871 
    4872       # 参考として出力するテンプレートファイルであることを示すために "_templ" を付加する
     4771      return if $generate_no_template     # $generate_all_template より優先される
     4772
     4773      # 参考として出力するテンプレートファイルであることを示すために "_templ" を付加する
    48734774      fname = "#{$gen}/#{@global_name}_inline_templ.#{$h_suffix}"
    48744775    else
    4875       # Plugin により生成されたセルタイプについては、原則的にテンプレートではなく、
    4876       # 修正不要なセルタイプの実è£
    4877 ã‚³ãƒ¼ãƒ‰ã‚’生成する.
    4878       # このため、ファイル名に _temp を付加しない
     4776      # Plugin により生成されたセルタイプについては、原則的にテンプレートではなく、
     4777      # 修正不要なセルタイプの実装コードを生成する.
     4778      # このため、ファイル名に _temp を付加しない
    48794779      fname = "#{$gen}/#{@global_name}_inline.#{$h_suffix}"
    48804780    end
     
    48994799
    49004800    if ( @plugin ) then
    4901       # このメソッドの引数は plugin.rb の説明を見よ
     4801      # このメソッドの引数は plugin.rb の説明を見よ
    49024802      @plugin.gen_postamble( f, @singleton, @name, @global_name )
    49034803    end
     
    49164816      if fa.get_name == :write then
    49174817
    4918         # 前後の " を取り除く
     4818        # 前後の " を取り除く
    49194819        # file_name = fa.get_file_name.sub( /^\"(.*)\"$/, "\\1" )
    49204820        file_name = CDLString.remove_dquote fa.get_file_name
    49214821        format = CDLString.remove_dquote fa.get_format
    4922         # format    = fa.get_format.sub( /^\"(.*)/, "\\1" )        # 前の " を取り除く
    4923         # format    = format.sub( /(.*)\"\z/, "\\1" )              # 後の " を取り除く
     4822        # format    = fa.get_format.sub( /^\"(.*)/, "\\1" )        # 前の " を取り除く
     4823        # format    = format.sub( /(.*)\"\z/, "\\1" )              # 後の " を取り除く
    49244824        format    = format.gsub( /\\\n/, "\n" )                  # \\\n => \n
    49254825
    49264826
    4927         # mikan 以下は subst_name で置換するように変更すべき
    4928         file_name = file_name.gsub( /(^|[^\$])\$ct\$/, "\\1#{@name}" )   # $ct$ をセルタイプ名に置換
    4929         file_name = file_name.gsub( /(^|[^\$])\$ct_global\$/, "\\1#{@global_name}" )   # $ct$ をセルタイプ名に置換
    4930         format    = format.gsub( /(^|[^\$])\$ct\$/, "\\1#{@name}" )   # $ct$ をセルタイプ名に置換
    4931         format    = format.gsub( /(^|[^\$])\$ct_global\$/, "\\1#{@global_name}" )   # $ct$ をセルタイプ名に置換
    4932         format    = format.gsub( /\$\$/, "\$" )                # $$ を $ に置換
     4827        # mikan 以下は subst_name で置換するように変更すべき
     4828        file_name = file_name.gsub( /(^|[^\$])\$ct\$/, "\\1#{@name}" )   # $ct$ をセルタイプ名に置換
     4829        file_name = file_name.gsub( /(^|[^\$])\$ct_global\$/, "\\1#{@global_name}" )   # $ct$ をセルタイプ名に置換
     4830        format    = format.gsub( /(^|[^\$])\$ct\$/, "\\1#{@name}" )   # $ct$ をセルタイプ名に置換
     4831        format    = format.gsub( /(^|[^\$])\$ct_global\$/, "\\1#{@global_name}" )   # $ct$ をセルタイプ名に置換
     4832        format    = format.gsub( /\$\$/, "\$" )                # $$ を $ に置換
    49334833
    49344834        if file_name[0] != ?/ then
     
    49424842            puts( format )
    49434843          end
    4944           # format 中の \n, \r, \t, \f と \" などを置換
     4844          # format 中の \n, \r, \t, \f と \" などを置換
    49454845          fmt = CDLString.escape format
    49464846          cfg_file.print( fmt )
     
    49594859    @ordered_cell_list.each{ |c|
    49604860
    4961       # cell のプロトタイプ宣言なら無視
     4861      # cell のプロトタイプ宣言なら無視
    49624862      next if ! c.is_generate?
    49634863
     
    49684868        if fa.get_name == :write then
    49694869
    4970           # 前後の " を取り除く
     4870          # 前後の " を取り除く
    49714871          # file_name = fa.get_file_name.sub( /^\"(.*)\"$/, "\\1" )
    49724872          file_name = CDLString.remove_dquote fa.get_file_name
    49734873          file_name = subst_name( file_name, name_array )
    4974           # format    = fa.get_format.sub( /^\"(.*)\"$/, "\\1" )        # 前後の "" を取り除く
     4874          # format    = fa.get_format.sub( /^\"(.*)\"$/, "\\1" )        # 前後の "" を取り除く
    49754875          format    = CDLString.remove_dquote fa.get_format
    4976           # format    = fa.get_format.sub( /^\"(.*)/, "\\1" )        # 前の " を取り除く
    4977           # format    = format.sub( /(.*)\"\z/, "\\1" )              # 後の " を取り除く
     4876          # format    = fa.get_format.sub( /^\"(.*)/, "\\1" )        # 前の " を取り除く
     4877          # format    = format.sub( /(.*)\"\z/, "\\1" )              # 後の " を取り除く
    49784878          format    = format.gsub( /\\\n/, "\n" )                  # \\\n => \n
    49794879
     
    49864886          end
    49874887
    4988           na = []     # シンボルを attribute の値に置き換えた後の引数
     4888          na = []     # シンボルを attribute の値に置き換えた後の引数
    49894889          if arg_list then
    49904890            arg_list.each { |a|
    49914891              case a[0]
    4992               when :STRING_LITERAL   # 文字列定数
    4993                 # s = a[1].sub( /^\"(.*)\"$/, "\\1" )            # 前後の "" を取り除く
     4892              when :STRING_LITERAL   # 文字列定数
     4893                # s = a[1].sub( /^\"(.*)\"$/, "\\1" )            # 前後の "" を取り除く
    49944894                s = CDLString.remove_dquote a[1]
    49954895                s = subst_name( s, name_array )
     
    49984898                na << s
    49994899              when :IDENTIFIER
    5000                 param_name = a[1]    # 識別子(属性の名前)
     4900                param_name = a[1]    # 識別子(属性の名前)
    50014901                attr = self.find( param_name )
    5002                 init = attr.get_initializer      # celltype で指定された初期値
    5003 
    5004                 # cell の join のリストから名前を探す
     4902                init = attr.get_initializer      # celltype で指定された初期値
     4903
     4904                # cell の join のリストから名前を探す
    50054905                j = c.get_join_list.get_item( param_name )
    5006                 if j then    # param_name の cell のジョインがあるか
    5007                   init = j.get_rhs                    # cell で指定された初期値を優å
    5008 ˆ
     4906                if j then    # param_name の cell のジョインがあるか
     4907                  init = j.get_rhs                    # cell で指定された初期値を優先
    50094908                end
    50104909
     
    50124911                                      # file,cell, name_array, type,          init, identifier,       indent, f_get_str
    50134912
    5014                 # str = str.sub( /^\"(.*)\"$/, "\\1" )            # 前後の "" を取り除く mikan ここで置換でよい?
     4913                # str = str.sub( /^\"(.*)\"$/, "\\1" )            # 前後の "" を取り除く mikan ここで置換でよい?
    50154914                str = CDLString.remove_dquote str
    50164915                na << str
     
    50304929            end
    50314930
    5032             # format 中の \n, \r, \t, \f と \" などを置換
     4931            # format 中の \n, \r, \t, \f と \" などを置換
    50334932            fmt = CDLString.escape format
    50344933            cfg_file.printf( fmt, *na )
     
    50544953    return if $generate_no_template
    50554954
    5056     # Makefile.templ の生成(追記)
     4955    # Makefile.templ の生成(追記)
    50574956
    50584957    f = AppFile.open( "#{$gen}/Makefile.templ" )
     
    50624961 
    50634962EOT
    5064 # この生成規則は2点で意味がない
    5065 ãƒ»$(GEN_DIR) に .o を生成するルールがない
    5066 ãƒ»ãƒ†ãƒ³ãƒ—レートコードをそのままビルドするのは紛らわしい
     4963# この生成規則は2点で意味がない
     4964・$(GEN_DIR) に .o を生成するルールがない
     4965・テンプレートコードをそのままビルドするのは紛らわしい
    50674966# # Celltype: #{@name}
    50684967# $(GEN_DIR)/#{@global_name}_tecsgen.o : $(GEN_DIR)/#{@global_name}_tecsgen.#{$c_suffix}
     
    50814980    headers = [ "$(GEN_DIR)/#{@global_name}_tecsgen.#{$h_suffix}", "$(GEN_DIR)/#{@global_name}_factory.#{$h_suffix}", "$(GEN_DIR)/global_tecsgen.#{$h_suffix}" ]
    50824981
    5083     # inline 受け口を持つか?
     4982    # inline 受け口を持つか?
    50844983    if @n_entry_port_inline > 0 then
    50854984      headers << "#{@global_name}_inline.#{$h_suffix}"
    50864985    end
    50874986
    5088     # 呼び口または受け口のシグニチャのヘッダ
     4987    # 呼び口または受け口のシグニチャのヘッダ
    50894988    @port.each { |p|
    50904989      next if p.is_omit?
     
    51115010  end
    51125011
    5113   #=== decl 用の dealloc コードを生成
    5114   #b_reset:: Bool:  リセット用の dealloc コードの生成 (NULL ポインタの場合 dealloc しない)
    5115   # mikan string 修飾されたポインタのå
    5116 ˆã«ãƒã‚¤ãƒ³ã‚¿ãŒæ¥ãªã„と仮定。ポインタ型を持つ構造体の可能性を排除していない
    5117   # このメソッドでは、行を出力する直前に " \\\n" を出力し、行末で改行文字を出力しない
     5012  #=== decl 用の dealloc コードを生成
     5013  #b_reset:: Bool:  リセット用の dealloc コードの生成 (NULL ポインタの場合 dealloc しない)
     5014  # mikan string 修飾されたポインタの先にポインタが来ないと仮定。ポインタ型を持つ構造体の可能性を排除していない
     5015  # このメソッドでは、行を出力する直前に " \\\n" を出力し、行末で改行文字を出力しない
    51185016  def gen_dealloc_code_for_type( f, type, dealloc_func_name, pre, name, post, level, b_reset, count_str = nil )
    51195017    type = type.get_original_type
     
    51445042        post2 = ""
    51455043        type2 = md.get_type.get_original_type
    5146         if type2.kind_of? PtrType then   # mikan typedef された型
     5044        if type2.kind_of? PtrType then   # mikan typedef された型
    51475045          if type2.get_count then
    51485046            count_str = type2.get_count.to_str( members_decl, pre2, post2 )
     
    52175115    end
    52185116
    5219     # 呼び口の結合å
    5220 ˆã®ã‚»ãƒ«ã‚¿ã‚¤ãƒ—のヘッダ(最適化の場合のみ)
    5221     # 結合å
    5222 ˆã®å—け口が inline の場合、inline ヘッダも
     5117    # 呼び口の結合先のセルタイプのヘッダ(最適化の場合のみ)
     5118    # 結合先の受け口が inline の場合、inline ヘッダも
    52235119    @port.each { |p|
    52245120      next if p.get_port_type != :CALL
     
    52265122
    52275123      if p.is_skelton_useless? || p.is_cell_unique? || p.is_VMT_useless? then
    5228         # 最適化コード (optimize) # スケルトン不要など
     5124        # 最適化コード (optimize) # スケルトン不要など
    52295125        p2 = p.get_real_callee_port
    52305126        if p2 then
     
    52365132          headers += ct.get_depend_header_list_( celltype_list )
    52375133        #else
    5238         #  optional で未結合 
     5134        #  optional で未結合 
    52395135        end
    52405136      end
     
    52445140
    52455141
    5246   #=== $id$, $ct$, $cb$, $idx$ 置換
     5142  #=== $id$, $ct$, $cb$, $idx$ 置換
    52475143  #
    5248   #  str に以下の置換を行う
    5249   #-   $ct$ ⇒ セルタイプ名(ct)
    5250   #-   $cell$ ⇒ セル名(cell)   cell が nil ならば以下の置換は行われない
    5251   #-   $cb$ ⇒ CB の C 言語名(cb)
    5252   #-   $cbp$ ⇒ CB へのポインタ(cbp)
    5253   #-   $cb_proto$ ⇒ CB の C 言語名プロトタイプ宣言用(cb_proto)
    5254   #-   $id$ ⇒ $ct$_$cell_global$    # ct_cell  before or same V1.5.2
    5255   #-   $idx$ ⇒ idx
    5256   #-   $ID$ ⇒ id (整数の番号)
    5257   #-   $ct_global$ ⇒ セルタイプ名(ct)
    5258   #-   $cell_global$ ⇒ セル名(cell)
    5259   #-   $$   â‡’ $
     5144  #  str に以下の置換を行う
     5145  #-   $ct$ ⇒ セルタイプ名(ct)
     5146  #-   $cell$ ⇒ セル名(cell)   cell が nil ならば以下の置換は行われない
     5147  #-   $cb$ ⇒ CB の C 言語名(cb)
     5148  #-   $cbp$ ⇒ CB へのポインタ(cbp)
     5149  #-   $cb_proto$ ⇒ CB の C 言語名プロトタイプ宣言用(cb_proto)
     5150  #-   $id$ $ct$_$cell_global$    # ct_cell  before or same V1.5.2
     5151  #-   $idx$ idx
     5152  #-   $ID$ ⇒ id (整数の番号)
     5153  #-   $ct_global$ ⇒ セルタイプ名(ct)
     5154  #-   $cell_global$ ⇒ セル名(cell)
     5155  #-   $$    $
    52605156  def subst_name( str, name_array )
    52615157    ct   = name_array[0]    # celltype name
    52625158    cell = name_array[1]    # cell name
    52635159    cb   = name_array[2]    # cell CB name
    5264     cb_init = name_array[3] # cell CB INIT, これは置換に使われない
     5160    cb_init = name_array[3] # cell CB INIT, これは置換に使われない
    52655161    cb_proto = name_array[4] # cell CB name for prototype
    52665162    id   = name_array[6]    # cell ID
     
    52835179      str = str.gsub( /(^|[^\$])\$cell_global\$/, "\\1#{cell_global}" )
    52845180    end
    5285     str = str.gsub( /\$\$/, "\$" )                       # $$ を $ に置換
     5181    str = str.gsub( /\$\$/, "\$" )                       # $$ を $ に置換
    52865182
    52875183    return str
     
    52905186end
    52915187
    5292 # Appendable File(追記可能ファイル)
     5188# Appendable File(追記可能ファイル)
    52935189class AppFile
    5294   # 開いたファイルのリスト
     5190  # 開いたファイルのリスト
    52955191  @@file_name_list = {}
    52965192
     
    53095205    end
    53105206
    5311     # 既に開いているか?
     5207    # 既に開いているか?
    53125208    if @@file_name_list[ name ] then
    53135209#2.0
    53145210      mode = "a" + mode
    5315       # 追記モードで開く
     5211      # 追記モードで開く
    53165212      file = File.open( real_name, mode )
    53175213    else
    53185214#2.0
    53195215      mode = "w" + mode
    5320       # 新規モードで開く(既にあれば、サイズを0にする)
     5216      # 新規モードで開く(既にあれば、サイズを0にする)
    53215217      file = File.open( real_name, mode )
    53225218      @@file_name_list[ name ] = true
    53235219    end
    5324     # File クラスのオブジェクトを返す
     5220    # File クラスのオブジェクトを返す
    53255221    return file
    53265222  end
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/location.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2017 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
    5237#   $Id$
     
    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 = []
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/messages.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2017 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
    5237#   $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 ]
     
    10589 end
    10690
    107  #=== TECSMsg#ローカライズされたæƒ
    108 å ±ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å¾—ã‚‹
    109  # Generator.info2 から呼び出される
     91 #=== TECSMsg#ローカライズされた情報メッセージを得る
     92 # Generator.info2 から呼び出される
    11093 def self.get_info_message( body )
    111    body =~ /^[A-Z0-9]+/    # æƒ
    112 å ±ç•ªå·ã‚’取り出す
     94   body =~ /^[A-Z0-9]+/    # 情報番号を取り出す
    11395   num = $&
    11496   msg = @@info_message[ num.to_sym ]
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/optimize.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2018 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
    5237#   $Id$
     
    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|
     
    243227
    244228    @domain_roots.each{ |dn, regions|
    245       # domain_type は一つのノードに一つしかないので、一つの要素を無条件で取り出す
     229      # domain_type は一つのノードに一つしかないので、一つの要素を無条件で取り出す
    246230      if regions.length > 1 then
    247231        if $verbose then
     
    259243  def optimize
    260244
    261     # port の参ç
    262 §ã™ã‚‹ã‚»ãƒ«ã‚¿ã‚¤ãƒ—の数、セルの数を求める
     245    # port の参照するセルタイプの数、セルの数を求める
    263246    if $verbose then
    264247      print "=== optimizing celltype #{get_namespace_path.to_s} ===\n"
     
    271254  end
    272255
    273   #=== Celltype#呼び口最適化
     256  #=== Celltype#呼び口最適化
    274257  def optimize_call
    275258    @port.each{ |port|
    276259      next if port.get_port_type != :CALL
    277260      if port.is_omit? then
    278         # 呼び口最適化実施
     261        # 呼び口最適化実施
    279262        @b_cp_optimized = true
    280         @n_call_port_omitted_in_CB += 1               # CB で省略する呼び口
    281         port.set_skelton_useless                      # スケルトン関数不要最適化
    282         port.set_VMT_useless                          # VMT 不要最適化 (直接受け口関数を呼出す)
     263        @n_call_port_omitted_in_CB += 1               # CB で省略する呼び口
     264        port.set_skelton_useless                      # スケルトン関数不要最適化
     265        port.set_VMT_useless                          # VMT 不要最適化 (直接受け口関数を呼出す)
    283266        if $verbose then
    284267          print "optimized by omit: port: #{port.get_name} : o\n"
     
    301284      end
    302285
    303       port_cells = []    # 呼びå
    304 ˆã‚»ãƒ«
    305       port_ports = []    # 呼びå
    306 ˆã®ãƒãƒ¼ãƒˆ
    307 
    308       # セルの参ç
    309 §ã™ã‚‹ã‚»ãƒ«ã‚’集める(ポートも一緒に集める)
     286      port_cells = []    # 呼び先セル
     287      port_ports = []    # 呼び先のポート
     288
     289      # セルの参照するセルを集める(ポートも一緒に集める)
    310290      @cell_list.each{ |cell|
    311291
     
    319299        if j then
    320300          if j.get_array_member2 then
    321             # 呼び口é
    322 åˆ—の場合、å
    323 ¨éƒ¨ã®çµåˆå
    324 ˆã‚’集める
     301            # 呼び口配列の場合、全部の結合先を集める
    325302            j.get_array_member2.each { |j2|
    326303              if j2 then
    327304                port_cells << j2.get_rhs_cell
    328                 port_ports << j2.get_rhs_port   # 右辺のポート
     305                port_ports << j2.get_rhs_port   # 右辺のポート
    329306              else
    330                 # optional で、ある添数のみ初期化されていない(すべて初期化されない場合は、下)
     307                # optional で、ある添数のみ初期化されていない(すべて初期化されない場合は、下)
    331308                port_cells << nil
    332309                port_ports << nil
     
    334311            }
    335312          else
    336             # å
    337 ¨ã¦ã®çµåˆå
    338 ˆã‚’集める
     313            # 全ての結合先を集める
    339314            port_cells << j.get_rhs_cell
    340             port_ports << j.get_rhs_port   # 右辺のポート
     315            port_ports << j.get_rhs_port   # 右辺のポート
    341316          end
    342317        else
    343           # optional で初期化されていない(nil を要素に加えておく)
     318          # optional で初期化されていない(nil を要素に加えておく)
    344319          port_cells << nil
    345           port_ports << nil   # 右辺のポート
     320          port_ports << nil   # 右辺のポート
    346321        end
    347322      }
    348323
    349       # 重複要素を取り除く
     324      # 重複要素を取り除く
    350325      port_cells.uniq!
    351326      port_ports.uniq!
    352327
    353       # 呼び口の呼びå
    354 ˆãŒä¸€ã¤ã®ãƒãƒ¼ãƒˆã ã‘か?
     328      # 呼び口の呼び先が一つのポートだけか?
    355329      if port_ports.length == 1 then
    356330
    357         # 呼び口é
    358 åˆ—が可変長の場合、最適化しない
    359              # mikan 呼び口é
    360 åˆ—要素数マクロ不å
    361 ·åˆæš«å®šå¯¾ç­–
    362              # より望ましい修正は、受け口へのポインタは省略するが、é
    363 åˆ—個数は出力する(#_CP_#, #_TCP_#)
    364              # さらにé
    365 åˆ—個数が定数化できるのであれば、定数マクロを出力 (#_NCPA_#)
     331        # 呼び口配列が可変長の場合、最適化しない
     332             # mikan 呼び口配列要素数マクロ不具合暫定対策
     333             # より望ましい修正は、受け口へのポインタは省略するが、配列個数は出力する(#_CP_#, #_TCP_#)
     334             # さらに配列個数が定数化できるのであれば、定数マクロを出力 (#_NCPA_#)
    366335        next if port.get_array_size == "[]"
    367336
    368         # 呼び口最適化実施
     337        # 呼び口最適化実施
    369338        @b_cp_optimized = true
    370339
    371         # 呼びå
    372 ˆãŒä¸€ã¤ã®ã‚»ãƒ«ã ã‘か?
     340        # 呼び先が一つのセルだけか?
    373341        if port_cells.length == 1 then
    374342
    375           # 呼び口は optional で初期化されていない、または受け口はé
    376 åˆ—ではないか?
     343          # 呼び口は optional で初期化されていない、または受け口は配列ではないか?
    377344          if port_ports[0] == nil || port_ports[0].get_array_size == nil then
    378345
    379             @n_call_port_omitted_in_CB += 1               # CB で省略する呼び口
    380             port.set_cell_unique                          # セル一つだけ最適化
    381             port.set_skelton_useless                      # スケルトン関数不要最適化
    382             port.set_VMT_useless                          # VMT 不要最適化 (直接受け口関数を呼出す)
     346            @n_call_port_omitted_in_CB += 1               # CB で省略する呼び口
     347            port.set_cell_unique                          # セル一つだけ最適化
     348            port.set_skelton_useless                      # スケルトン関数不要最適化
     349            port.set_VMT_useless                          # VMT 不要最適化 (直接受け口関数を呼出す)
    383350
    384351            if $verbose then
     
    386353            end
    387354          else
    388             port.set_VMT_useless                          # VMT 不要最適化 (スケルトン関数を呼出す)
     355            port.set_VMT_useless                          # VMT 不要最適化 (スケルトン関数を呼出す)
    389356
    390357            if $verbose then
     
    393360          end
    394361
    395         else  # 呼びå
    396 ˆãŒè¤‡æ•°ã®ã‚»ãƒ«ï¼ˆå˜ä¸€ã®ãƒãƒ¼ãƒˆï¼‰
    397 
    398           # 呼び口は optional で初期化されていない、または受け口はé
    399 åˆ—ではないか?
     362        else  # 呼び先が複数のセル(単一のポート)
     363
     364          # 呼び口は optional で初期化されていない、または受け口は配列ではないか?
    400365          if port_ports[0] == nil || port_ports[0].get_array_size == nil then
    401366            if ! @singleton then
    402               port.set_skelton_useless                    # スケルトン関数不要最適化
    403               port.set_VMT_useless                        # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す)
     367              port.set_skelton_useless                    # スケルトン関数不要最適化
     368              port.set_VMT_useless                        # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す)
    404369
    405370              if $verbose then
     
    407372              end
    408373            else
    409               port.set_VMT_useless                           # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す)
     374              port.set_VMT_useless                           # VMT 不要最適化 (スケルトン関数 or 受け口関数を呼出す)
    410375
    411376              if $verbose then
     
    417382
    418383        port.set_only_callee( port_ports[0], port_cells[0] )
    419            # set_cell_unique でない場合 cell は意味がない
     384           # set_cell_unique でない場合 cell は意味がない
    420385
    421386      end
     
    426391  end
    427392
    428   #=== Celltype#受け口最適化
    429   # optimize_entry は、呼び口最適化の結果を使用している
     393  #=== Celltype#受け口最適化
     394  # optimize_entry は、呼び口最適化の結果を使用している
    430395  def optimize_entry
    431     # 受け口最適化の設定
     396    # 受け口最適化の設定
    432397    @port.each{ |port|
    433398      next if port.get_port_type != :CALL
    434399
    435       # 呼び口側の最適化状æ
    436 ‹
     400      # 呼び口側の最適化状態
    437401      b_VMT_useless     = port.is_VMT_useless?
    438402      b_skelton_useless = port.is_skelton_useless?
    439403
    440       # セルの参ç
    441 §ã™ã‚‹ã‚»ãƒ«ã‚’集める(ポートも一緒に集める)
     404      # セルの参照するセルを集める(ポートも一緒に集める)
    442405      @cell_list.each{ |cell|
    443406
     
    449412        j = jl.get_item( port.get_name )
    450413
    451         if j then    # optional で結合されていない場合 nil
     414        if j then    # optional で結合されていない場合 nil
    452415          if j.get_array_member2 then
    453             # 呼び口é
    454 åˆ—
     416            # 呼び口配列
    455417            j.get_array_member2.each { |j2|
    456418              if j2 then
    457                 port2 = j2.get_rhs_port   # 右辺のポート
    458                 # 受け口側の最適化可能性を設定
     419                port2 = j2.get_rhs_port   # 右辺のポート
     420                # 受け口側の最適化可能性を設定
    459421                port2.set_entry_VMT_skelton_useless( b_VMT_useless, b_skelton_useless )
    460422              #else
    461               #  optional で呼び口é
    462 åˆ—要素が初期化されていない
     423              #  optional で呼び口配列要素が初期化されていない
    463424              end
    464425            }
    465426          else
    466             port2 = j.get_rhs_port      # 右辺のポート
    467             # 受け口側の最適化可能性を設定
     427            port2 = j.get_rhs_port      # 右辺のポート
     428            # 受け口側の最適化可能性を設定
    468429            port2.set_entry_VMT_skelton_useless( b_VMT_useless, b_skelton_useless )
    469430          end
     
    473434  end
    474435
    475   #Celltype# リセットする
     436  #Celltype# リセットする
    476437  def reset_optimize
    477     @@ID_BASE = ID_BASE      # 本当は一回だけでよい
    478     @id_base = 1             # set_cell_id でリセットされるので不要
    479 
    480     @b_cp_optimized = false  # 呼び口最適化
    481     @n_call_port_omitted_in_CB = 0 # 呼び口最適化により不生成となったポートの数
    482     @n_cell_gen = 0          # 生成セル個数
     438    @@ID_BASE = ID_BASE      # 本当は一回だけでよい
     439    @id_base = 1             # set_cell_id でリセットされるので不要
     440
     441    @b_cp_optimized = false  # 呼び口最適化
     442    @n_call_port_omitted_in_CB = 0 # 呼び口最適化により不生成となったポートの数
     443    @n_cell_gen = 0          # 生成セル個数
    483444    @port.each{ |p|
    484445      p.reset_optimize
     
    488449  end
    489450
    490   #Celltype# ヘッダは include されているか
    491   #hname::Symbol : ヘッダ名
    492   #RETURN:: bool_t: false インクルードされていない、true インクルードされている
    493   # #_ISH_#, #_ICT_# でヘッダが取り込まれているかチェックする
    494   # false が返った場合、hname は登録されて、次回の呼び出しでは true が返る
     451  #Celltype# ヘッダは include されているか
     452  #hname::Symbol : ヘッダ名
     453  #RETURN:: bool_t: false インクルードされていない、true インクルードされている
     454  # #_ISH_#, #_ICT_# でヘッダが取り込まれているかチェックする
     455  # false が返った場合、hname は登録されて、次回の呼び出しでは true が返る
    495456  def header_included?( hname )
    496457    if @included_header[ hname ] == nil then
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/plugin.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2017 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
    5237#   $Id$
    5338#++
    5439
    55 #== Plugin クラス
    56 # ThroughPlugin, SignaturePlugin, CelltypePlugin に include する
     40#== Plugin クラス
     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 # generate 指定子の場合、構文解釈次第(end_of_parseで)呼び出される
    94 # generate 文の場合、出現次第呼び出される
    95   ### 意味解析段階で呼び出されるメソッド ### <<< コメント誤り (V1.4.2)
    96   #===  CDL ファイルの生成
    97   #      typedef, signature, celltype, cell のコードを生成
    98   #      重複して生成してはならない
    99   #      すでに生成されている場合は出力しないこと。
    100   #      もしくは同名の import により、重複を避けること。
    101   #file::        FILE       ç”Ÿæˆã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«
     77### 構文解釈 または 意味解析段階で呼び出されるメソッド ###
     78# generate 指定子の場合、構文解釈次第(end_of_parseで)呼び出される
     79# generate 文の場合、出現次第呼び出される
     80  ### 意味解析段階で呼び出されるメソッド ### <<< コメント誤り (V1.4.2)
     81  #===  CDL ファイルの生成
     82  #      typedef, signature, celltype, cell のコードを生成
     83  #      重複して生成してはならない
     84  #      すでに生成されている場合は出力しないこと。
     85  #      もしくは同名の import により、重複を避けること。
     86  #file::        FILE       生成するファイル
    10287  def gen_cdl_file file
    10388  end
    10489
    10590
    106 ### コード生段階で呼び出されるメソッド ###
    107   #=== プラグインは gen_ep_func を提供するか
    108   # gen_ep_func 定義   â‡’ テンプレートではない、セルタイプコード(tCelltype.c)を生成
    109   # gen_ep_func 未定義 ⇒ テンプレート(tCelltype_templ.c)を生成
     91### コード生段階で呼び出されるメソッド ###
     92  #=== プラグインは gen_ep_func を提供するか
     93  # gen_ep_func 定義   ⇒ テンプレートではない、セルタイプコード(tCelltype.c)を生成
     94  # gen_ep_func 未定義 ⇒ テンプレート(tCelltype_templ.c)を生成
    11095  def gen_ep_func?
    11196    self.class.method_defined?( :gen_ep_func_body )
    11297  end
    11398
    114   #===  受け口関数の本体(C言語)を生成する
    115   #     ãƒ—ラグインの場合、変更するå¿
    116 è¦ã®ãªã„セルタイプコードを生成する
    117   #     ã“のメソッドが未定義であれば、プラグインはセルタイプコードを生成しない (通常通りテンプレートを生成する)
    118   #      gen_cdl_file の中で生成されたセルタイプに対して呼び出される
    119   #file::           FILE        出力å
    120 ˆãƒ•ã‚¡ã‚¤ãƒ« (tCelltype.c)
     99  #===  受け口関数の本体(C言語)を生成する
     100  #     プラグインの場合、変更する必要のないセルタイプコードを生成する
     101  #     このメソッドが未定義であれば、プラグインはセルタイプコードを生成しない (通常通りテンプレートを生成する)
     102  #      gen_cdl_file の中で生成されたセルタイプに対して呼び出される
     103  #file::           FILE        出力先ファイル (tCelltype.c)
    121104  #b_singleton::    bool        true if singleton
    122105  #ct_name::        Symbol
     
    130113#  end
    131114
    132   #===  受け口関数の preamble (C言語)を生成する
    133   #     å¿
    134 è¦ãªã‚‰ preamble 部に出力する
    135   #      gen_cdl_file の中でで生成されたセルタイプに対して呼び出される
    136   #file::           FILE        出力å
    137 ˆãƒ•ã‚¡ã‚¤ãƒ«
     115  #===  受け口関数の preamble (C言語)を生成する
     116  #     必要なら preamble 部に出力する
     117  #      gen_cdl_file の中でで生成されたセルタイプに対して呼び出される
     118  #file::           FILE        出力先ファイル
    138119  #b_singleton::    bool        true if singleton
    139120  #ct_name::        Symbol
    140121  #global_ct_name:: string
    141122  def gen_preamble( file, b_singleton, ct_name, global_ct_name )
    142     # デフォルトでは何も出力しない
    143   end
    144 
    145   #===  受け口関数の postamble (C言語)を生成する
    146   #     å¿
    147 è¦ãªã‚‰ postamble 部に出力する
    148   #      gen_cdl_file の中で生成されたセルタイプに対して呼び出される
    149   #file::           FILE        出力å
    150 ˆãƒ•ã‚¡ã‚¤ãƒ«
     123    # デフォルトでは何も出力しない
     124  end
     125
     126  #===  受け口関数の postamble (C言語)を生成する
     127  #     必要なら postamble 部に出力する
     128  #      gen_cdl_file の中で生成されたセルタイプに対して呼び出される
     129  #file::           FILE        出力先ファイル
    151130  #b_singleton::    bool        true if singleton
    152131  #ct_name::        Symbol
    153132  #global_ct_name:: string
    154133  def gen_postamble( file, b_singleton, ct_name, global_ct_name )
    155     # デフォルトでは何も出力しない
    156   end
    157 
    158   #=== gen_cdl_file の中で生成されたセルタイプに新しいセルが生成された
    159   # どのセルタイプかは cell.get_celltype で分かる
     134    # デフォルトでは何も出力しない
     135  end
     136
     137  #=== gen_cdl_file の中で生成されたセルタイプに新しいセルが生成された
     138  # どのセルタイプかは cell.get_celltype で分かる
    160139  #
    161   #file::           FILE        出力å
    162 ˆãƒ•ã‚¡ã‚¤ãƒ«
     140  #file::           FILE        出力先ファイル
    163141  #b_singleton::    bool        true if singleton
    164142  #ct_name::        Symbol
    165143  #global_ct_name:: string
    166144  def new_cell cell
    167     # デフォルトでは何もしない
    168   end
    169 
    170 ### プラグイン引数の解釈 ###
     145    # デフォルトでは何もしない
     146  end
     147
     148### プラグイン引数の解釈 ###
    171149  def parse_plugin_arg
    172150    arg = @plugin_arg_str.dup
    173151
    174     # 改行を消す
     152    # 改行を消す
    175153    arg.gsub!( /\\\n/, "" )
    176154
    177155    while arg != ""
    178156
    179       # 前の空白読み飛ばす
     157      # 前の空白読み飛ばす
    180158      arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1')
    181159
    182       #  識別子取得
     160      #  識別子取得
    183161      if arg =~ /\A[a-zA-Z_]\w*/ then
    184162        ident = $~.to_s    #
     
    189167      end
    190168     
    191       # 前の空白読み飛ばす
     169      # 前の空白読み飛ばす
    192170      arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1')
    193171
     
    199177      end
    200178
    201       # 前の空白読み飛ばす
     179      # 前の空白読み飛ばす
    202180      arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1')
    203181
    204       # 右辺文字列
    205       if 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    # $   $ で囲まれている場合
    215         rhs = $1
    216         remain = $'
    217       elsif  arg =~ /\A\\"(.*?)\\"\s*,/ then  # || にも [,$] にもできなかった
     182      # 右辺文字列
     183      if 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    # $   $ で囲まれている場合
     193        rhs = $1
     194        remain = $'
     195      elsif  arg =~ /\A\\"(.*?)\\"\s*,/ then  # || にも [,$] にもできなかった
    218196        rhs = $1
    219197        remain = $'
    220198      # elsif arg =~ /\A(.*?)\s*$/ then
    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    # $   $ で囲まれている場合
    231         rhs = $1
    232         remain = $'
    233       elsif  arg =~ /\A\\"(.*?)\\"\s*\z/ then  # || にも [,$] にもできなかった
     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    # $   $ で囲まれている場合
     209        rhs = $1
     210        remain = $'
     211      elsif  arg =~ /\A\\"(.*?)\\"\s*\z/ then  # || にも [,$] にもできなかった
    234212        rhs = $1
    235213        remain = $'
     
    237215        rhs = $1
    238216        remain = $'
    239         # 前の空白読み飛ばす
     217        # 前の空白読み飛ばす
    240218        rhs.sub!( /\A\s*(.*)\s*\z/, '\1')
    241219      elsif arg =~ /\A(.*?)\s*\z/ then
     
    247225      end
    248226
    249       # 0文字の文字列を to_sym すると例外発生するので空白文字とする
     227      # 0文字の文字列を to_sym すると例外発生するので空白文字とする
    250228      if rhs == "" then
    251229        rhs = " "
    252230      end
    253231
    254       arg = remain         # arg の残りの部分
    255       arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1')      # 前の空白読み飛ばす
    256 
    257       # \ を外す
    258       rhs = rhs.gsub( /\\(.)/, "\\1" )   # ここで $' が変わることに注意!
     232      arg = remain         # arg の残りの部分
     233      arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1')      # 前の空白読み飛ばす
     234
     235      # \ を外す
     236      rhs = rhs.gsub( /\\(.)/, "\\1" )   # ここで $' が変わることに注意!
    259237      # print "parse_plugin_arg:  #{ident} #{rhs}\n"
    260238      @plugin_arg_list[ ident ] = rhs
     
    265243  end
    266244
    267   #=== プラグイン引数をチェックする
    268   # @plugin_arg_check_proc_tab に従ってプラグイン引数をチェックすする
    269   # 古い用法:子クラスでオーバーライドし、引数識別子が正しいかチェックする
    270   #ident:: string: 引数識別子
    271   #rhs:: string: 右辺文字列
     245  #=== プラグイン引数をチェックする
     246  # @plugin_arg_check_proc_tab に従ってプラグイン引数をチェックすする
     247  # 古い用法:子クラスでオーバーライドし、引数識別子が正しいかチェックする
     248  #ident:: string: 引数識別子
     249  #rhs:: string: 右辺文字列
    272250  def check_plugin_arg( ident, rhs )
    273251
     
    294272  end
    295273
    296   #=== プラグインのメッセージ出力
     274  #=== プラグインのメッセージ出力
    297275  def print_msg( msg )
    298276    if @b_silent == true then
     
    302280  end
    303281
    304   #=== プラグイン引数 silent
     282  #=== プラグイン引数 silent
    305283  def set_silent rhs
    306284    if rhs == "true" || rhs == nil then
     
    310288end
    311289
    312 #== 出力文字列を utf-8 から出力ファイルに convert する
    313 # tecsgen のソースコードは utf-8 で記述されている
    314 # これを、出力ファイルの文字コードに変換して出力する
     290#== 出力文字列を utf-8 から出力ファイルに convert する
     291# tecsgen のソースコードは utf-8 で記述されている
     292# これを、出力ファイルの文字コードに変換して出力する
    315293#
    316 # generate.rb で出力するものは message.rb で変換している
    317 # generate.rb で出力するものは APPFile クラスを使用している
    318 # mikan: CFile で出力したものに factory で追記できない (cdl ファイルの場合、追記できても意味がない)
     294# generate.rb で出力するものは message.rb で変換している
     295# generate.rb で出力するものは APPFile クラスを使用している
     296# mikan: CFile で出力したものに factory で追記できない (cdl ファイルの場合、追記できても意味がない)
    319297class CFile
    320298  def self.open( path, mode )
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/pluginModule.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2017 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
    5237#   $Id$
    5338#++
    5439
    55 #== プラグインをロードする側のモジュール
     40#== プラグインをロードする側のモジュール
    5641# @@loaded_plugin_list:: {Symbol=>Integer}
    5742module PluginModule
     
    5944  @@loaded_plugin_list = {}
    6045
    61   #=== プラグインをロードする
     46  #=== プラグインをロードする
    6247  # return:: PluginClass
    63   # V1.4.1 まで return:: true : 成功、 false : 失敗
     48  # V1.4.1 まで return:: true : 成功、 false : 失敗
    6449  #
    65   # #{plugin_name}.rb をロードし、plugin_name クラスのオブジェクトを生成する.
    66   # plugin_name が MultiPlugin の場合、get_plugin により、superClass のプラグインオブジェクトをロードする.
     50  # #{plugin_name}.rb をロードし、plugin_name クラスのオブジェクトを生成する.
     51  # plugin_name が MultiPlugin の場合、get_plugin により、superClass のプラグインオブジェクトをロードする.
    6752  #
    68   # すでにロードされているものは、重複してロードしない
    69   # load 時の例外はこのメソッドの中でキャッチされて false が返される
     53  # すでにロードされているものは、重複してロードしない
     54  # load 時の例外はこのメソッドの中でキャッチされて false が返される
    7055  def load_plugin( plugin_name, superClass )
    7156
     
    7762          print( "load '#{plugin_name}.rb'\n" )
    7863        end
    79         # "#{plugin_name}.rb" をロード(システム用ではないので、fatal エラーにしない)
     64        # "#{plugin_name}.rb" をロード(システム用ではないので、fatal エラーにしない)
    8065        if require_tecsgen_lib( "#{plugin_name}.rb", false ) == false then
    8166          cdl_error( "P2001 $1.rb : fail to load plugin" , plugin_name )
     
    10893      return nil
    10994    end
    110     # ここへは来ない
     95    # ここへは来ない
    11196    return nil
    11297  end
    11398
    114   #=== プラグインの gen_cdl_file を呼びして cdl ファイルを生成させ、解釈を行う
     99  #=== プラグインの gen_cdl_file を呼びして cdl ファイルを生成させ、解釈を行う
    115100  def generate_and_parse plugin_object
    116     if plugin_object == nil     # プラグインのロードに失敗している(既にエラー)
     101    if plugin_object == nil     # プラグインのロードに失敗している(既にエラー)
    117102      return
    118103    end
     
    123108    elsif @@loaded_plugin_list[ plugin_name ] == nil then
    124109      #raise "#{plugin_name} might have different name "
    125       ## プラグインのファイル名と、プラグインのクラス名が相違する場合
    126       #MultiPlugin の get_plugin で返されたケースでは nil になっている
     110      ## プラグインのファイル名と、プラグインのクラス名が相違する場合
     111      #MultiPlugin の get_plugin で返されたケースでは nil になっている
    127112      @@loaded_plugin_list[ plugin_name ] = 0
    128113    end
     
    157142  end
    158143
    159   #=== プラグインが CDL の POST コードを生成
    160   # tmp_plugin_post_code.cdl への出力
     144  #=== プラグインが CDL の POST コードを生成
     145  # tmp_plugin_post_code.cdl への出力
    161146  def self.gen_plugin_post_code file
    162147    dbgPrint "PluginModule #{@@loaded_plugin_list}\n"
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/syntaxobj.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2017 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
    5237#   $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, *arg )
    10889    Generator.info2( @locale, message, *arg )
    10990  end
    11091
    111   #=== æƒ
    112 å ±ã‚’表示する
     92  #=== 情報を表示する
    11393  def cdl_info2( locale, message, *arg )
    11494    Generator.info2( locale, message, *arg )
     
    128108end
    129109
    130 #== 双方向 Node (Bi Direction Node)
     110#== 双方向 Node (Bi Direction Node)
    131111#
    132 #  Node の子クラス
    133 #  owner Node から参ç
    134 §ã•ã‚Œã¦ã„るもの (owner へのリンクも取り出せる)
     112#  Node の子クラス
     113#  owner Node から参照されているもの (owner へのリンクも取り出せる)
    135114#
    136 #  get_owner で得られるもの
     115#  get_owner で得られるもの
    137116#    FuncHead => Signature
    138117#    Decl => Namespace(const), Typedef(typedef),
     
    140119#            Struct(member), ParamDecl(parameter), FuncHead(funchead)
    141120#    Signature, Celltype, CompositeCelltype, Typedef => Namespace
    142 #,   Namespace => Namespace, Generator.class (root Namespace の場合)
     121#,   Namespace => Namespace, Generator.class (root Namespace の場合)
    143122#    Cell => Region, CompositeCelltype(in_composite)
    144123#    Port => Celltype, Composite
     
    150129#    ParamList => FuncHead
    151130#    Expression => Namespace
    152 #    大半のものは new_* メソッドで owner Node に伝達される
    153 #    そのメソッドが呼び出されたときに owner Node が記録される
    154 #    new_* がないもの:
     131#    大半のものは new_* メソッドで owner Node に伝達される
     132#    そのメソッドが呼び出されたときに owner Node が記録される
     133#    new_* がないもの:
    155134#            Decl(parameter), ParamDecl, ParamList, FuncHead, Expression
    156135#
    157 #    Expression は、owner Node となるものが多くあるが、改造が困難であるため
    158 #    Expression が定義されたときの Namespace を owner Node とする
    159 #    StructType は Type の一種なので owner を持たない
     136#    Expression は、owner Node となるものが多くあるが、改造が困難であるため
     137#    Expression が定義されたときの Namespace を owner Node とする
     138#    StructType は Type の一種なので owner を持たない
    160139#
    161140class BDNode < Node
     
    173152  end
    174153
    175   #=== owner を設定する
     154  #=== owner を設定する
    176155  def set_owner owner
    177156    dbgPrint "set_owner: #{owner.class.name}\n"
     
    179158  end
    180159
    181   #=== owner を得る
    182   # class の説明を参ç
    183 §
     160  #=== owner を得る
     161  # class の説明を参照
    184162  def get_owner
    185163    if @owner == nil
     
    190168end
    191169
    192 #== Namespace 名を持つ BDNode
     170#== Namespace 名を持つ BDNode
    193171# Namespace(Region), Signature, Celltype, CompositeCelltype, Cell
    194172class NSBDNode < BDNode
     
    198176  end
    199177
    200   #=== 属する namespace を得る
    201   # owner を namespace にたどり着くまで上にたどる
     178  #=== 属する namespace を得る
     179  # owner を namespace にたどり着くまで上にたどる
    202180  def get_namespace
    203181    if @owner.kind_of? Namespace
     
    206184      return @owner.get_namespace
    207185    else
    208       # @owner == nil なら "::"
     186      # @owner == nil なら "::"
    209187      if @name != "::" then
    210188        raise "non-root namespace has no owner #{self.class.name}##{@name} #{self}"
     
    223201  end
    224202
    225   #=== NamespacePath を得る
     203  #=== NamespacePath を得る
    226204  def get_namespace_path
    227205    return @NamespacePath
     
    232210      return @import.is_imported?
    233211    else
    234       return false    # mikan: ä»® @import が nil になるケースが追求できていない
     212      return false    # mikan: 仮 @import が nil になるケースが追求できていない
    235213    end
    236214  end
     
    239217class NamedList
    240218#  @names:: {} of items
    241 #  @items:: [] of items : item の CLASS は get_name メソッドを持つこと get_name の戻り値は Symbol でなくてはならない
    242 #                         NamedList を clone_for_composite する場合は、item にもメソッドがå¿
    243 è¦
    244 #  @type:: string       ã‚¨ãƒ©ãƒ¼ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸
     219#  @items:: [] of items : item の CLASS は get_name メソッドを持つこと get_name の戻り値は Symbol でなくてはならない
     220#                         NamedList を clone_for_composite する場合は、item にもメソッドが必要
     221#  @type:: string       エラーメッセージ
    245222
    246223  def initialize( item, type )
     
    251228  end
    252229
    253   #=== 要素を加える
    254   # parse した時点で加えること(場所を記憶する)
     230  #=== 要素を加える
     231  # parse した時点で加えること(場所を記憶する)
    255232  def add_item( item )
    256233
     
    311288  end
    312289
    313   #=== composite cell を clone した時に要素(JOIN) の clone する
     290  #=== composite cell を clone した時に要素(JOIN) の clone する
    314291  #
    315   # mikan このメソッドは Join に特化されているので NamedList から分離すべき
     292  # mikan このメソッドは Join に特化されているので NamedList から分離すべき
    316293  def clone_for_composite( ct_name, cell_name, locale )
    317294    cl = self.clone
     
    320297  end
    321298
    322   #=== clone された NamedList インスタンスの参ç
    323 §ã™ã‚‹ã‚‚の(item)を clone
     299  #=== clone された NamedList インスタンスの参照するもの(item)を clone
    324300  #
    325   # mikan このメソッドは Join に特化されているので NamedList から分離すべき
     301  # mikan このメソッドは Join に特化されているので NamedList から分離すべき
    326302  def set_cloned( ct_name, cell_name, locale )
    327303    items = []
     
    385361end
    386362
    387 #== 関数頭部
    388 # signature に登録される関数
     363#== 関数頭部
     364# signature に登録される関数
    389365class FuncHead <BDNode
    390366#  @declarator:: Decl
     
    431407  end
    432408
    433   #=== FuncHead# 関数の名前を返す
     409  #=== FuncHead# 関数の名前を返す
    434410  def get_name
    435411    return @declarator.get_name
    436412  end
    437413
    438   #=== FuncHead# 関数の戻り値の型を返す
    439   # types.rb に定義されている型
    440   # 関数ヘッダの定義として不完å
    441 ¨ãªå ´åˆ nil を返す
     414  #=== FuncHead# 関数の戻り値の型を返す
     415  # types.rb に定義されている型
     416  # 関数ヘッダの定義として不完全な場合 nil を返す
    442417  def get_return_type
    443418    if is_function? then
     
    446421  end
    447422
    448   #=== FuncHead# 関数の引数のリストを返す
    449   # ParamList を返す
    450   # 関数ヘッダの定義として不完å
    451 ¨ãªå ´åˆ nil を返す
     423  #=== FuncHead# 関数の引数のリストを返す
     424  # ParamList を返す
     425  # 関数ヘッダの定義として不完全な場合 nil を返す
    452426  def get_paramlist
    453427    if is_function? then
     
    463437end
    464438
    465 #=== 宣言
    466 # @kind で示される各種の宣言
     439#=== 宣言
     440# @kind で示される各種の宣言
    467441class Decl < BDNode
    468442
    469443# @identifer:: String
    470 # @global_name:: String | nil : String(@kind=TYPEDEF||:CONSTANT), nil(@kind=その他)
    471 #                set_kind にて設定される
     444# @global_name:: String | nil : String(@kind=TYPEDEF||:CONSTANT), nil(@kind=その他)
     445#                set_kind にて設定される
    472446# @type:: ArrayType, FuncType, PtrType, IntType, StructType
    473447#         VoidType, FloatType, DefinedType, BoolType
    474448# @initializer:: constant_expression, mikan { initlist }
    475 # @kind:: :VAR, :ATTRIBUTE, :PARAMETER, :TYPEDEF, :CONSTANT, :MEMBER, :FUNCHEAD(signatureの関数定義)
     449# @kind:: :VAR, :ATTRIBUTE, :PARAMETER, :TYPEDEF, :CONSTANT, :MEMBER, :FUNCHEAD(signatureの関数定義)
    476450# @b_referenced:: bool
    477451#
    478 # 以下は、@kind が :VAR, :ATTRIBUTE のときに有効
    479 # @rw:: bool     # 古い文法では attr に指定可能だった(消すには generate の修正もå¿
    480 è¦ï¼‰
     452# 以下は、@kind が :VAR, :ATTRIBUTE のときに有効
     453# @rw:: bool     # 古い文法では attr に指定可能だった(消すには generate の修正も必要)
    481454# @omit:: bool
    482 # @choice_list:: [String]  attr 初期値の選択肢
    483 # 以下は、@kind が :VAR, :ATTRIBUTE, :MEMBER のときに有効
     455# @choice_list:: [String]  attr 初期値の選択肢
     456# 以下は、@kind が :VAR, :ATTRIBUTE, :MEMBER のときに有効
    484457# @size_is:: Expression or nil unless specified
    485 # 以下は、@kind が :MEMBER のときに有効
     458# 以下は、@kind が :MEMBER のときに有効
    486459# @count_is:: Expression or nil unless specified
    487 #             attr, var の場合、count_is は指定できない
     460#             attr, var の場合、count_is は指定できない
    488461# @string:: Expression, -1 (length not specified) or nil (not specified)
    489462#
    490 # mikan  ParamDecl だけ別に設けたが、MemberDecl, AttrDecl なども分けるべきか(?)
     463# mikan  ParamDecl だけ別に設けたが、MemberDecl, AttrDecl なども分けるべきか(?)
    491464
    492465  def initialize( identifier )
     
    518491  end
    519492
    520   #== Decl の意味的誤りをチェックする
     493  #== Decl の意味的誤りをチェックする
    521494  def check
    522495    # return nil if @type == nil
    523496
    524     # 構造体タグチェック(ポインタ型から構造体が参ç
    525 §ã•ã‚Œã¦ã„る場合は、タグの存在をチェックしない)
     497    # 構造体タグチェック(ポインタ型から構造体が参照されている場合は、タグの存在をチェックしない)
    526498    @type.check_struct_tag @kind
    527499
    528     # 型のチェックを行う
     500    # 型のチェックを行う
    529501    res = @type.check
    530502    if res then
     
    532504    end
    533505
    534     # 不要の初期化子をチェックする
     506    # 不要の初期化子をチェックする
    535507    if @initializer then
    536508      case @kind
     
    538510        cdl_error( "S2003 $1: $2 cannot have initializer" , @identifier, @kind.to_s.downcase )
    539511      when :VAR, :ATTRIBUTE, :CONSTANT
    540         # p @initializer  ここでは代å
    541 ¥å¯èƒ½ã‹ã©ã†ã‹ã€ãƒã‚§ãƒƒã‚¯ã—ない
    542         # :VAR, :ATTRIBUTE, :CONSTANT はそれぞれでチェックする
     512        # p @initializer  ここでは代入可能かどうか、チェックしない
     513        # :VAR, :ATTRIBUTE, :CONSTANT はそれぞれでチェックする
    543514        # return @type.check_init( @identifier, @initializer, @kind )
    544515      else
     
    558529  end
    559530
    560   #== ポインタレベルを得る
    561   # 戻り値:
    562   #   éžãƒã‚¤ãƒ³ã‚¿å¤‰æ•°   = 0
    563   #   ãƒã‚¤ãƒ³ã‚¿å¤‰æ•°     = 1
    564   #   äºŒé‡ãƒã‚¤ãƒ³ã‚¿å¤‰æ•° = 2
     531  #== ポインタレベルを得る
     532  # 戻り値:
     533  #   非ポインタ変数   = 0
     534  #   ポインタ変数     = 1
     535  #   二重ポインタ変数 = 2
    565536  def get_ptr_level
    566537    level = 0
     
    570541        level += 1
    571542        type = type.get_referto
    572 #      elsif type.kind_of?( ArrayType ) then  # 添数なしé
    573 åˆ—はポインタとみなす
     543#      elsif type.kind_of?( ArrayType ) then  # 添数なし配列はポインタとみなす
    574544#        if type.get_subscript == nil then
    575545#          level += 1
     
    578548#          break
    579549#        end
    580         # mikan ポインタの添数ありé
    581 åˆ—のポインタレベルは0でよい?
     550        # mikan ポインタの添数あり配列のポインタレベルは0でよい?
    582551      elsif type.kind_of?( DefinedType ) then
    583552        type = type.get_type
     
    602571      @type = type
    603572    else
    604       @type.set_type( type )             # 葉に設定
     573      @type.set_type( type )             # 葉に設定
    605574    end
    606575  end
     
    744713end
    745714
    746 # 関数パラメータの宣言
     715# 関数パラメータの宣言
    747716class ParamDecl < BDNode
    748717
    749718# @declarator:: Decl:  Token, ArrayType, FuncType, PtrType
    750719# @direction:: :IN, :OUT, :INOUT, :SEND, :RECEIVE
    751 # @size:: Expr   (size_is 引数)
    752 # @count:: Expr   (count_is 引数)
    753 # @max:: Expr (size_is の第二引数)
     720# @size:: Expr   (size_is 引数)
     721# @count:: Expr   (count_is 引数)
     722# @max:: Expr (size_is の第二引数)
    754723# @b_nullable:: Bool : nullable
    755 # @string:: Expr or -1(if size not specified) (string 引数)
     724# @string:: Expr or -1(if size not specified) (string 引数)
    756725# @allocator:: Signature of allocator
    757 # @b_ref:: bool : size_is, count_is, string_is 引数として参ç
    758 §ã•ã‚Œã¦ã„ã‚‹
     726# @b_ref:: bool : size_is, count_is, string_is 引数として参照されている
    759727#
    760 # 1. 関数型でないこと
    761 # 2. 2次å
    762 ƒä»¥ä¸Šã®é
    763 åˆ—であって最もå†
    764 å´ä»¥å¤–の添数があること
    765 # 3. in, out, ..., size_is, count_is, ... の重複指定がないこと
    766 # 4. ポインタレベルが適切なこと
     728# 1. 関数型でないこと
     729# 2. 2次元以上の配列であって最も内側以外の添数があること
     730# 3. in, out, ..., size_is, count_is, ... の重複指定がないこと
     731# 4. ポインタレベルが適切なこと
    767732
    768733  def initialize( declarator, specifier, param_specifier )
     
    831796        end
    832797      when :MAX_IS
    833         # max_is は、å†
    834 éƒ¨çš„なもの bnf.y.rb 参ç
    835 §
    836         # size_is で重複チェックされる
     798        # max_is は、内部的なもの bnf.y.rb 参照
     799        # size_is で重複チェックされる
    837800        @max = i[1]
    838801      when :NULLABLE
     
    854817    end
    855818
    856     # mikan ポインタのé
    857 åˆ—(添数有)のレベルが0
     819    # mikan ポインタの配列(添数有)のレベルが0
    858820    ptr_level = @declarator.get_ptr_level
    859821
     
    898860      cdl_error( "S2014 $1 need pointer or more pointer" , @declarator.get_identifier )
    899861    elsif ptr_level > max_level then
    900       # note: 構文解析段階で実行のため get_current 可
     862      # note: 構文解析段階で実行のため get_current 可
    901863      if Signature.get_current == nil || Signature.get_current.is_deviate? == false then
    902864        cdl_warning( "W3003 $1 pointer level mismatch" , @declarator.get_identifier )
     
    910872
    911873    if ptr_level > 0 then
    912       # size_is, count_is, string をセット
     874      # size_is, count_is, string をセット
    913875      if @direction == :RECEIVE && ptr_level > 1 then
    914876        type.get_type.set_scs( @size, @count, @string, @max, @b_nullable )
     
    920882#type.show_tree 1
    921883
    922       # ポインタが指しているå
    923 ˆã®ãƒ‡ãƒ¼ã‚¿åž‹ã‚’å¾—ã‚‹
     884      # ポインタが指している先のデータ型を得る
    924885      i = 0
    925886      t2 = type
     
    936897# p t2.is_const?
    937898
    938       # const 修飾が適切かチェック
     899      # const 修飾が適切かチェック
    939900      if @direction == :IN then
    940901        if ! t2.is_const? then
     
    947908      end
    948909    else
    949       # 非ポインタタイプ
     910      # 非ポインタタイプ
    950911      if @size != nil || @count != nil || @string != nil || @max != nil || @b_nullable then
    951912        type.set_scs( @size, @count, @string, @max, @b_nullable )
     
    1019980  end
    1020981
    1021   #=== PPAllocator がå¿
    1022 è¦ã‹
    1023   # Transparent RPC の場合 in で size_is, count_is, string のいずれかが指定されている場合 oneway では PPAllocator がå¿
    1024 è¦
    1025   # Transparent PC で oneway かどうかは、ここでは判断しないので別途判断がå¿
    1026 è¦
    1027   # Opaque RPC の場合 size_is, count_is, string のいずれかが指定されている場合、PPAllocator がå¿
    1028 è¦
     982  #=== PPAllocator が必要か
     983  # Transparent RPC の場合 in で size_is, count_is, string のいずれかが指定されている場合 oneway では PPAllocator が必要
     984  # Transparent PC で oneway かどうかは、ここでは判断しないので別途判断が必要
     985  # Opaque RPC の場合 size_is, count_is, string のいずれかが指定されている場合、PPAllocator が必要
    1029986  def need_PPAllocator?( b_opaque = false )
    1030987    if ! b_opaque then
     
    10731030end
    10741031
    1075 # 関数パラメータリスト
     1032# 関数パラメータリスト
    10761033class ParamList < BDNode
    10771034# @param_list:: NamedList : item: ParamDecl
     
    10861043
    10871044  def add_param( paramdecl )
    1088     return if paramdecl == nil    # 既にエラー
     1045    return if paramdecl == nil    # 既にエラー
    10891046
    10901047    @param_list.add_item( paramdecl )
     
    10961053  end
    10971054
    1098   #=== size_is, count_is, string の引数の式をチェック
    1099   # 変数は前方参ç
    1100 §å¯èƒ½ãªãŸã‚ã€é–¢æ•°é ­éƒ¨ã®æ§‹æ–‡è§£é‡ˆãŒçµ‚わった後にチェックする
     1055  #=== size_is, count_is, string の引数の式をチェック
     1056  # 変数は前方参照可能なため、関数頭部の構文解釈が終わった後にチェックする
    11011057  def check_param
    11021058    @param_list.get_items.each { |i|
    1103       next if i == nil                      # i == nil : エラー時
     1059      next if i == nil                      # i == nil : エラー時
    11041060
    11051061      if i.get_type.class == VoidType then
    1106         # 単一の void 型はここにはこない
     1062        # 単一の void 型はここにはこない
    11071063        cdl_error( "S2027 '$1' parameter cannot be void type", i.get_name )
    11081064      end
     
    11111067      if size then
    11121068        val = size.eval_const( @param_list )
    1113         if val == nil then                      # 定数式でないか?
    1114           # mikan 変数を含む式:単一の変数のみ OK
     1069        if val == nil then                      # 定数式でないか?
     1070          # mikan 変数を含む式:単一の変数のみ OK
    11151071          type = size.get_type( @param_list )
    11161072          unless type.kind_of?( IntType ) then
     
    11501106      if count then
    11511107        val = count.eval_const( @param_list )
    1152         if val == nil then                      # 定数式でないか?
    1153           # mikan 変数を含む式:単一の変数のみ OK
     1108        if val == nil then                      # 定数式でないか?
     1109          # mikan 変数を含む式:単一の変数のみ OK
    11541110          type = count.get_type( @param_list )
    11551111          unless type.kind_of?( IntType ) then
     
    11701126      if string != -1 && string then
    11711127        val = string.eval_const( @param_list )
    1172         if val == nil then                      # 定数式でないか?
    1173           # mikan 変数を含む式:単一の変数のみ OK
     1128        if val == nil then                      # 定数式でないか?
     1129          # mikan 変数を含む式:単一の変数のみ OK
    11741130          type = string.get_type( @param_list )
    11751131          unless type.kind_of?( IntType ) then
     
    11951151  end
    11961152
    1197   #=== Push Pop Allocator がå¿
    1198 è¦ã‹ï¼Ÿ
    1199   # Transparent RPC の場合 (oneway かつ) in のé
    1200 åˆ—(size_is, count_is, string のいずれかで修飾)がある
     1153  #=== Push Pop Allocator が必要か?
     1154  # Transparent RPC の場合 (oneway かつ) in の配列(size_is, count_is, string のいずれかで修飾)がある
    12011155  def need_PPAllocator?( b_opaque = false )
    12021156    @param_list.get_items.each { |i|
     
    12121166  end
    12131167
    1214   #== ParamList# 文字列化
    1215   #b_name:: Bool: パラメータ名を含める
     1168  #== ParamList# 文字列化
     1169  #b_name:: Bool: パラメータ名を含める
    12161170  def to_str( b_name )
    12171171    str = "("
     
    12361190end
    12371191
    1238 #== CDL の文字列リテラルを扱うためのクラス
    1239 # CDL の文字列リテラルそのものではない
     1192#== CDL の文字列リテラルを扱うためのクラス
     1193# CDL の文字列リテラルそのものではない
    12401194class CDLString
    1241   # エスケープ文字を変換
     1195  # エスケープ文字を変換
    12421196  def self.escape str
    12431197    str = str.dup
     
    12511205    str.gsub!( /(\\[Xx][0-9A-Fa-f]{1,2})/, '{printf \"\\1\"}' )
    12521206    str.gsub!( /(\\[0-7]{1,3})/, '{printf \"\\1\"}' )
    1253     str.gsub!( /\\(.)/, "\\1" )   # mikan 未定義のエスケープシーケンスを変換してしまう (gcc V3.4.4 では警告が出される)
     1207    str.gsub!( /\\(.)/, "\\1" )   # mikan 未定義のエスケープシーケンスを変換してしまう (gcc V3.4.4 では警告が出される)
    12541208    return str
    12551209  end
    12561210
    1257   #=== CDLString#前後の " を取り除く
     1211  #=== CDLString#前後の " を取り除く
    12581212  def self.remove_dquote str
    12591213    s = str.sub( /\A"/, "" )
     
    12631217end
    12641218
    1265 #== CDL の初期化子を扱うためのクラス
    1266 # CDL の初期化子そのものではない
     1219#== CDL の初期化子を扱うためのクラス
     1220# CDL の初期化子そのものではない
    12671221class CDLInitializer
    1268   #=== 初期化子のクローン
    1269   # 初期化子は Expression, C_EXP, Array のいずれか
     1222  #=== 初期化子のクローン
     1223  # 初期化子は Expression, C_EXP, Array のいずれか
    12701224  def self.clone_for_composite( rhs, ct_name, cell_name, locale )
    12711225    if rhs.instance_of? C_EXP then
    1272       # C_EXP の clone を作るとともに置換
     1226      # C_EXP の clone を作るとともに置換
    12731227      rhs = rhs.clone_for_composite( ct_name, cell_name, locale )
    12741228    elsif rhs.instance_of? Expression then
     
    12821236  end
    12831237
    1284   #=== 初期化子(é
    1285 åˆ—)のクローン
    1286   # 要素は clone_for_composite を持つものだけ
     1238  #=== 初期化子(配列)のクローン
     1239  # 要素は clone_for_composite を持つものだけ
    12871240  def self.clone_for_compoiste_array( array, ct_name, cell_name, locale )
    1288     # "compoiste.identifier" の場合 (CDL としては誤り)
     1241    # "compoiste.identifier" の場合 (CDL としては誤り)
    12891242    if array[0] == :COMPOSITE then
    12901243      return array.clone
  • azure_iot_hub/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
    r388 r389  
    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
    5237#   $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
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/tecsgen.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2017 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
    5237#   $Id$
     
    5641class TECSGEN
    5742
    58   @@b_post_coded = false     # ポストコード生成開始後 true
    59 
    60   #=== import パス (-I) を末尾に追加
    61   # 既に登録済みであれば、追加しない
     43  @@b_post_coded = false     # ポストコード生成開始後 true
     44
     45  #=== import パス (-I) を末尾に追加
     46  # 既に登録済みであれば、追加しない
    6247  def self.add_import_path path
    6348    if $import_path.index( path ) == nil then
     
    6752  end
    6853
    69   #=== EXEB 版のパスの調整
    70   # 環境変数 TECSPATH が cygwin スタイルだと、exerb 版では扱えない
    71   # $import_path と $TECSPATH を調整する
     54  #=== EXEB 版のパスの調整
     55  # 環境変数 TECSPATH が cygwin スタイルだと、exerb 版では扱えない
     56  # $import_path と $TECSPATH を調整する
    7257  def self.adjust_exerb_path
    7358    if $IN_EXERB then
     
    7661      paths = []
    7762      $import_path.each{ |path|
    78         # cygpath は '..' を簡約してしまうので、new_tecspath で置換する
     63        # cygpath は '..' を簡約してしまうので、new_tecspath で置換する
    7964        # paths << cygpath( path, path )
    8065        paths << path.sub( pattern, new_tecspath )
     
    8772  end
    8873
    89   #=== $(TECSPATH) への置換
    90   #path::String   : ENV[ 'TECSPATH' ] に一致する部分があれば、 "$(TECSPATH)" に置換
    91   #b_global::Bool : true なら gsub で置換。false なら sub で置換
     74  #=== $(TECSPATH) への置換
     75  #path::String   : ENV[ 'TECSPATH' ] に一致する部分があれば、 "$(TECSPATH)" に置換
     76  #b_global::Bool : true なら gsub で置換。false なら sub で置換
    9277  def self.subst_tecspath( path, b_global = false )
    9378    tp = $tecspath.dup
     
    10489  end
    10590
    106   #=== path は絶対パスか?
     91  #=== path は絶対パスか?
    10792  #path:: String   :
    108   # '/' または '$' で始まる場合、絶対パスと判定する
     93  # '/' または '$' で始まる場合、絶対パスと判定する
    10994  def self.is_absolute_path?( path )
    11095    pa = path[0..0]; pa2 = path[0..1]
     
    118103  end
    119104
    120   #=== tecsgen のデフォルトを設定
     105  #=== tecsgen のデフォルトを設定
    121106  def self.set_default_config
    122107    Makefile::set_default_config
     
    124109
    125110  ###
    126   #== Makefile.templ の出力å†
    127 å®¹ã‚’追加、変更するための操作
     111  #== Makefile.templ の出力内容を追加、変更するための操作
    128112  module Makefile
    129     # 固定されている変数(add_var で変更できない)
     113    # 固定されている変数(add_var で変更できない)
    130114    @@fixed_vars = { :INCLUDES => nil, :DEFINES => nil, :TARGET_BASE => nil, :BASE_DIR => nil }
    131115    @@config_mode = false
     
    142126    @@lines = []
    143127
    144     #=== OTHER_OBJS に追加する
     128    #=== OTHER_OBJS に追加する
    145129    def self.add_obj obj
    146130      @@objs << obj
    147131    end
    148     #=== 追加する変数
    149     # プラグインからは、デフォルト値を変更できる
    150     # config により
     132    #=== 追加する変数
     133    # プラグインからは、デフォルト値を変更できる
     134    # config により
    151135    def self.add_var( var, val, comment = nil )
    152136      if @@fixed_vars[ var ]
     
    161145      end
    162146    end
    163     #=== LDFLAGS に追加する
     147    #=== LDFLAGS に追加する
    164148    def self.add_ldflag ldflag
    165149      @@ldflags += " " + ldflag
    166150    end
    167     #=== サーチパスを追加する
    168     # CFLAGS, vpath に追加する
     151    #=== サーチパスを追加する
     152    # CFLAGS, vpath に追加する
    169153    def self.add_search_path path
    170154      @@search_path << path
    171155    end
    172     #=== PRE_TECSGEN_TARGET に追加する
    173     # PRE_TECSGEN_TARGET に target を追加する
     156    #=== PRE_TECSGEN_TARGET に追加する
     157    # PRE_TECSGEN_TARGET に target を追加する
    174158    def self.add_pre_tecsgen_target target
    175159      @@pre_tecsgen_target << pre_tecsgen_target
    176160    end
    177     #=== POST_TECSGEN_TARGET に追加する
    178     # POST_TECSGEN_TARGET に target を追加する
     161    #=== POST_TECSGEN_TARGET に追加する
     162    # POST_TECSGEN_TARGET に target を追加する
    179163    def self.add_post_tecsgen_target target
    180164      @@post_tecsgen_target << pre_tecsgen_target
    181165    end
    182     #=== 追加する変数
     166    #=== 追加する変数
    183167    def self.add_line( line )
    184168      @@lines << line.to_s + "\n"
    185169    end
    186170
    187     def self.get_objs  # Array を返す
     171    def self.get_objs  # Array を返す
    188172      return @@objs.uniq
    189173    end
    190     def self.get_vars  # Array を返す
     174    def self.get_vars  # Array を返す
    191175      if RUBY_VERSION >= '1.9' then
    192176        return (@@vars.keys + @@vars_default.keys).sort.uniq
    193177      else
    194         # V1.8 では、Symbol の sort ができないので、一旦 String に置換する
     178        # V1.8 では、Symbol の sort ができないので、一旦 String に置換する
    195179        return (@@vars.keys + @@vars_default.keys).map{|s| s.to_s }.sort.uniq.map!{|s| s.to_sym }
    196180      end
     
    202186      return @@var_comments[ var ]
    203187    end
    204     def self.get_ldflags  # String を返す
     188    def self.get_ldflags  # String を返す
    205189      return @@ldflags
    206190    end
    207     def self.get_search_path  # Array を返す
     191    def self.get_search_path  # Array を返す
    208192      return @@search_path.uniq
    209193    end
    210     def self.get_pre_tecsgen_target  # Array を返す
     194    def self.get_pre_tecsgen_target  # Array を返す
    211195      return @@pre_tecsgen_target.uniq
    212196    end
    213     def self.get_post_tecsgen_target  # Array を返す
     197    def self.get_post_tecsgen_target  # Array を返す
    214198      return @@post_tecsgen_target.uniq
    215199    end
    216     def self.get_lines  # 付加する行を得る
     200    def self.get_lines  # 付加する行を得る
    217201      return @@lines.uniq
    218202    end
    219203
    220     #=== TECSGEN のデフォルト設定を行う
     204    #=== TECSGEN のデフォルト設定を行う
    221205    # Makefile
    222     # @@fixed_vars で定義されている変数は、変更できず、定数定義されている
     206    # @@fixed_vars で定義されている変数は、変更できず、定数定義されている
    223207    def self.set_default_config
    224208      add_var( "TARGET", "$(TARGET_BASE).exe", "default target name"  )
     
    241225
    242226  def syntax_analisys argv
    243     # ルート namespace (region) を生成
     227    # ルート namespace (region) を生成
    244228    @root_namespace = Region.new("::")
    245229
    246     ####  構文解析 (post コードを除く) ####
    247     # すべての cdl を import する
     230    ####  構文解析 (post コードを除く) ####
     231    # すべての cdl を import する
    248232    argv.each{ |f|
    249233      dbgPrint( "## Import: #{f}\n")
     
    251235    }
    252236
    253     # すべての構文解釈が完了したことの報告
    254     #   å®Ÿéš›ã«ã¯ã€å¾Œã‹ã‚‰ãƒ—ラグインの生成する CDL のパースが行われる
    255     #   ã‚¨ãƒ©ãƒ¼è¡Œæ•°ã®æ±ºå®šæ–¹æ³•ã®å¤‰æ›´ã®ãŸã‚ã«è¡Œã†
     237    # すべての構文解釈が完了したことの報告
     238    #   実際には、後からプラグインの生成する CDL のパースが行われる
     239    #   エラー行数の決定方法の変更のために行う
    256240    Generator.end_all_parse
    257241    dbgPrint( "## End all parse (except Post Code)\n")
     
    262246  # other objects (signature, celltype, typedef, etc ) are checked while syntax analisys
    263247  def semantics_analisys_1
    264     ####  意味解析1 (post コードを除く) ####
     248    ####  意味解析1 (post コードを除く) ####
    265249    dbgPrint( "## Creating reverse join \n")
    266250    Cell.create_reverse_join
     
    270254    Celltype.check_dynamic_join
    271255
    272     #0 set_definition_join は2回呼び出される(1回目)
     256    #0 set_definition_join は2回呼び出される(1回目)
    273257    dbgPrint( "## Checking all join\n")
    274258    @root_namespace.set_definition_join
    275     # @root_namespace.set_require_join                   ### いったん見合わせ。重複エラーを見逃す
    276     # through プラグインで生成されたセルにも require も生成できる (set_definition_join の後ろで実施)
    277 
    278     ####  post コードの生成と構文解析 ####
    279     @@b_post_coded = true     # ポストコード生成開始後 true
    280     # 引数がなければ、プラグインのポストコードを出力しない
     259    # @root_namespace.set_require_join                   ### いったん見合わせ。重複エラーを見逃す
     260    # through プラグインで生成されたセルにも require も生成できる (set_definition_join の後ろで実施)
     261
     262    ####  post コードの生成と構文解析 ####
     263    @@b_post_coded = true     # ポストコード生成開始後 true
     264    # 引数がなければ、プラグインのポストコードを出力しない
    281265    if ARGV.length > 0 then
    282266      dbgPrint( "## Generating Post Code\n")
    283       # プラグインのポストコードの出力と import
     267      # プラグインのポストコードの出力と import
    284268      tmp_file_name = "#{$gen}/tmp_plugin_post_code.cdl"
    285269      file = nil
     
    291275
    292276      if file then
    293         # through プラグインのポストコード生成
     277        # through プラグインのポストコード生成
    294278        PluginModule.gen_plugin_post_code file
    295279
     
    304288    end
    305289
    306     ####  意味解析1 (post コード) ####
     290    ####  意味解析1 (post コード) ####
    307291    dbgPrint( "## Creating reverse join (for post code) \n")
    308292    Cell.create_reverse_join
    309293
    310     # Join の定義の設定とチェック
    311     #0 # 前方参ç
    312 §å¯¾å¿œ
    313     #0 set_definition_join は2回呼び出される(2回目)  post_code で生成された
     294    # Join の定義の設定とチェック
     295    #0 # 前方参照対応
     296    #0 set_definition_join は2回呼び出される(2回目)  post_code で生成された
    314297    dbgPrint( "## Checking all join (for cells generated by Post Code\n")
    315298    @root_namespace.set_definition_join
     
    317300
    318301    dbgPrint( "## Set require join\n")
    319     @root_namespace.set_require_join   # mikan post の前にも
    320     # ポストコードで生成されたセルの require のjoin を生成
    321     # mikan require で through が適用されて、ポストコードがå¿
    322 è¦ã¨ãªã£ã¦ã‚‚出力されない
     302    @root_namespace.set_require_join   # mikan post の前にも
     303    # ポストコードで生成されたセルの require のjoin を生成
     304    # mikan require で through が適用されて、ポストコードが必要となっても出力されない
    323305  end # semantics_analisys_1
    324306
    325307  def semantics_analisys_2
    326     ####  意味解析2 ####
     308    ####  意味解析2 ####
    327309    Cell.make_cell_list2
    328310    dbgPrint( "## Set fixed join\n")
    329311    Cell.create_reverse_require_join
    330     # create_reverse_require_join は set_detinition_join に埋め込むことができない
    331         # namespace に依存しない出現順で行う
    332         # mikan through プラグインが適用されポストコードに影響を与える場合が考æ
    333 ®ã§ãã¦ã„ない
    334         # mikan post code に影響のあるものであれば、早くに reverse_require_join の結合がå¿
    335 è¦
     312    # create_reverse_require_join は set_detinition_join に埋め込むことができない
     313        # namespace に依存しない出現順で行う
     314        # mikan through プラグインが適用されポストコードに影響を与える場合が考慮できていない
     315        # mikan post code に影響のあるものであれば、早くに reverse_require_join の結合が必要
    336316    dbgPrint( "## Setting port reference count\n")
    337317    @root_namespace.set_port_reference_count
     
    340320    @root_namespace.check_join
    341321
    342     # mikan プラグインで生成されたコンポーネントの set_def_and_check_join
     322    # mikan プラグインで生成されたコンポーネントの set_def_and_check_join
    343323
    344324    dbgPrint( "## Checking referenced but undefined cell\n")
     
    347327
    348328  def optimize_and_generate
    349     #### Region link root ごとにオプティマイズおよび生成 ####
     329    #### Region link root ごとにオプティマイズおよび生成 ####
    350330    Region.get_link_roots.each { |region|
    351331
     
    369349      end
    370350
    371       # セルが一つもなければ生成しない
    372       # セルの生成がない場合
     351      # セルが一つもなければ生成しない
     352      # セルの生成がない場合
    373353      if region.get_n_cells == 0 then
    374354        if $region_list.length > 0 then
     
    400380
    401381      dbgPrint( "## Unset optimize variables\n")
    402       @root_namespace.reset_optimize   # 最適化をリセットする
     382      @root_namespace.reset_optimize   # 最適化をリセットする
    403383
    404384      if Generator.get_n_error == 0 then
    405         # エラーが発生していたら、設定しない
     385        # エラーが発生していたら、設定しない
    406386        dbgPrint( "## Set cell id\n")
    407         @root_namespace.set_cell_id_and_domain      # セルの ID とドメインæƒ
    408 å ±ã‚’設定(linkunit 毎に0からつける)
    409 
    410         # エラーが発生していたら、最適化は実施しない
     387        @root_namespace.set_cell_id_and_domain      # セルの ID とドメイン情報を設定(linkunit 毎に0からつける)
     388
     389        # エラーが発生していたら、最適化は実施しない
    411390        if ! $unopt then
    412391          dbgPrint( "## Optimizing: Link Region=#{@root_namespace.get_name}\n")
     
    416395
    417396      if $show_tree then
    418         # エラーが発生していても表示(エラー発生時は最適化されていないので注意)
     397        # エラーが発生していても表示(エラー発生時は最適化されていないので注意)
    419398        print "##### show_tree LinkRegion=#{region.get_name} #####\n"
    420399        @root_namespace.show_tree(0)
     
    422401      end
    423402
    424       # 構文解釈、意味解析でエラー発生していたら、コード生成をしない
     403      # 構文解釈、意味解析でエラー発生していたら、コード生成をしない
    425404      if Generator.get_n_error != 0 then
    426405        print_report
     
    428407      end
    429408
    430       #### コード生成 ####
     409      #### コード生成 ####
    431410      begin
    432411        dbgPrint( "## Generating: Link Region=#{@root_namespace.get_name}\n")
     
    435414        @root_namespace.generate_post
    436415      rescue
    437         # 通常ここへは来ない (generate, generate_post で処置される)
     416        # 通常ここへは来ない (generate, generate_post で処置される)
    438417        Generator.error( "G9999 fail to generate" )
    439418      end
     
    453432    }
    454433
    455     # update する
    456     # APPFile で生成されたファイルは、もし変化があれば、ここで更新する
    457     # コード生成段階でエラーが発生すれば、更新しない
    458     # CFile で生成されたものは、更新されている
     434    # update する
     435    # APPFile で生成されたファイルは、もし変化があれば、ここで更新する
     436    # コード生成段階でエラーが発生すれば、更新しない
     437    # CFile で生成されたものは、更新されている
    459438    if Generator.get_n_error == 0 then
    460439      begin
     
    477456  def dump_tecsgen_rbdmp
    478457    dbgPrint "dump_tecsgen_rbdmp 0:\n"
    479     #### unjoin_plugin 後に行うå¿
    480 è¦ãŒã‚るため、コード生成後にダンプを行う
    481     #### Region link root ごとにオプティマイズしてダンプ ####
     458    #### unjoin_plugin 後に行う必要があるため、コード生成後にダンプを行う
     459    #### Region link root ごとにオプティマイズしてダンプ ####
    482460    Namespace.get_root.unjoin_plugin
    483461    Namespace.get_root.find_plugin 0, []
     
    497475
    498476      dbgPrint "dump_tecsgen_rbdmp 2: Region.path_str: #{region.get_namespace_path.get_path_str}\n"
    499       # セルが一つもなければ生成しない
    500       # セルの生成がない場合
     477      # セルが一つもなければ生成しない
     478      # セルの生成がない場合
    501479      if region.get_n_cells == 0 then
    502480        # if $region_list.length > 0 then
     
    522500      dbgPrint "dump_tecsgen_rbdmp 4: Region.path_str: #{region.get_namespace_path.get_path_str}\n"
    523501      dbgPrint( "## Unset optimize variables\n")
    524       @root_namespace.reset_optimize   # 最適化をリセットする
     502      @root_namespace.reset_optimize   # 最適化をリセットする
    525503
    526504      #  if Generator.get_n_error == 0 then
    527       #   # エラーが発生していたら、ここへは来ない
     505      #   # エラーが発生していたら、ここへは来ない
    528506         dbgPrint( "## Set cell id\n")
    529         @root_namespace.set_cell_id_and_domain      # セルの ID とドメインæƒ
    530 å ±ã‚’設定(linkunit 毎に0からつける)
    531 
    532         # エラーが発生していたら、最適化は実施しない
     507        @root_namespace.set_cell_id_and_domain      # セルの ID とドメイン情報を設定(linkunit 毎に0からつける)
     508
     509        # エラーが発生していたら、最適化は実施しない
    533510        if ! $unopt then
    534511          dbgPrint( "## Optimizing: Link Region=#{@root_namespace.get_name}\n")
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/tecsinfo.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2017-2018 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
    5237#   $Id$
    5338#++
    5439
    55 # TECS æƒ
    56 å ±ã‚»ãƒ«ã®ç”Ÿæˆ
     40# TECS 情報セルの生成
    5741module TECSInfo
    58   # region は Link root のこと
     42  # region は Link root のこと
    5943  def self.print_info f, region
    6044    # p "region: "+ region.get_name.to_s
     
    6751    Type.reset_print_info
    6852
    69     # mikan å
    70 ¨éƒ¨ç”Ÿæˆã™ã‚‹ã®ã§ã¯ãªãã€region 下のセルのセルタイプと、そこから参ç
    71 §ã•ã‚Œã‚‹ã‚·ã‚°ãƒ‹ãƒãƒ£ã€ã‚»ãƒ«ã‚¿ã‚¤ãƒ—に限定して出力すべき
    72     # しかし、意味解析後に出力するため、これは容易ではない.最適化とコード生成は、リンクルートごとに行われる.
     53    # mikan 全部生成するのではなく、region 下のセルのセルタイプと、そこから参照されるシグニチャ、セルタイプに限定して出力すべき
     54    # しかし、意味解析後に出力するため、これは容易ではない.最適化とコード生成は、リンクルートごとに行われる.
    7355    Namespace.print_info f, indent
    7456    region.get_link_root.print_info f, indent
     
    9072
    9173class Namespace
    92   # RootRegion と LinkRegion は同じ Region クラスのオブジェクトである
    93   # 子ネームスペースは Namespace クラスの、子リージョンは Region クラスのオブジェクトである
    94   # これは、意味解析段階で呼び出されるため、リンクユニットごとに出しわけることができない
    95   # 出しわけるには、2パスにするå¿
    96 è¦ãŒã‚ã‚‹
     74  # RootRegion と LinkRegion は同じ Region クラスのオブジェクトである
     75  # 子ネームスペースは Namespace クラスの、子リージョンは Region クラスのオブジェクトである
     76  # これは、意味解析段階で呼び出されるため、リンクユニットごとに出しわけることができない
     77  # 出しわけるには、2パスにする必要がある
    9778  def print_info_ns_sub f, indent
    9879    if @name == "::" then
     
    151132    }
    152133    @namespace_list.each { |ns|
    153       if ns.instance_of? Namespace then   # region を含めない
     134      if ns.instance_of? Namespace then   # region を含めない
    154135        ns.print_info_ns f, indent
    155136      end
     
    161142  end
    162143
    163   #=== Namespace# 構造体メンバーのオフセット定義
     144  #=== Namespace# 構造体メンバーのオフセット定義
    164145  def print_struct_define f
    165146    f.print "\n/***** Offset of members of structures  *****/\n"
     
    184165    }
    185166    @namespace_list.each { |ns|
    186       if ns.instance_of? Namespace then   # region を含めない
     167      if ns.instance_of? Namespace then   # region を含めない
    187168        ns.print_celltype_define_offset f
    188169      end
     
    197178    }
    198179    @namespace_list.each { |ns|
    199       if ns.instance_of? Namespace then   # region を含めない
     180      if ns.instance_of? Namespace then   # region を含めない
    200181        ns.print_celltype_define f
    201182      end
     
    210191    }
    211192    @namespace_list.each { |ns|
    212       if ns.instance_of? Namespace then   # region を含めない
     193      if ns.instance_of? Namespace then   # region を含めない
    213194        ns.print_call_define f
    214195      end
     
    223204    }
    224205    @namespace_list.each { |ns|
    225       if ns.instance_of? Namespace then   # region を含めない
     206      if ns.instance_of? Namespace then   # region を含めない
    226207        ns.print_entry_define f
    227208      end
     
    415396
    416397  def print_define_offset f
    417     # intptr_t に一回キャストするのは 64bit 版を考量してのこと.しかし 32bit としているので 4GB をè¶
    418 ãˆã‚‹æ§‹é€ ä½“等は扱えない
     398    # intptr_t に一回キャストするのは 64bit 版を考量してのこと.しかし 32bit としているので 4GB を超える構造体等は扱えない
    419399    if @n_cell_gen > 0 then
    420400      f.print <<EOT
     
    453433// #include "#{@global_name}_tecsgen.h"   // no cell exist
    454434EOT
    455       # 生成されないセルタイプ
     435      # 生成されないセルタイプ
    456436      @attribute.each{ |decl|
    457437        f.printf "#define OFFSET_OF_%-30s  (%s)\n", "#{@global_name}_#{decl.get_name}", "0xffffffff"
     
    641621        red = "(void *)0"
    642622      end
    643       # mikan 受け口é
    644 åˆ—
     623      # mikan 受け口配列
    645624      f.print <<EOT
    646625#{indent}cell nTECSInfo::tRawEntryDescriptorInfo #{@global_name}_#{port.get_name}RawEntryDescriptorInfo {
     
    795774
    796775  def print_info f, indent
    797     # Type の info は、最後にまとめて出力するので、ここでは記録するだけ
     776    # Type の info は、最後にまとめて出力するので、ここでは記録するだけ
    798777    if @@typeinfo_printed[ get_ID_str ] then
    799778      return
     
    821800
    822801  def print_info_post f, indent
    823     if self.class.superclass == Type then     # 親クラスが Type の場合 types.rb のクラス
     802    if self.class.superclass == Type then     # 親クラスが Type の場合 types.rb のクラス
    824803      type_name = self.class.name
    825804    else
    826       type_name = self.class.superclass.name  # ctypes.rb のクラス (親クラスが types.rb のクラス)
     805      type_name = self.class.superclass.name  # ctypes.rb のクラス (親クラスが types.rb のクラス)
    827806    end
    828807    # p "type: #{type_name}, #{self.class.name}"
     
    856835  end
    857836
    858   #=== Type# 型文字列の識別子化
    859   #型文字列に含まれる識別子として用いることのできない文字を用いることのできる文字列に置き換える
    860   # 空白 => __
     837  #=== Type# 型文字列の識別子化
     838  #型文字列に含まれる識別子として用いることのできない文字を用いることのできる文字列に置き換える
     839  # 空白 => __
    861840  # * => _Ptr_
    862841  # [] => _Array_
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/tool_info.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2017 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
    5237#   $Id$
     
    307292
    308293#==  Cell_location
    309   # tecscde の位置æƒ
    310 å ±
     294  # tecscde の位置情報
    311295  class  Cell_location
    312296
     
    335319
    336320  #==  Join_location
    337   # tecscde の位置æƒ
    338 å ±
     321  # tecscde の位置情報
    339322  class  Join_location
    340323    @@join_location_list = []
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/types.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2017 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
    5237#   $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
     
    774733#  @members_decl:: NamedList
    775734#  @definition:: StructType
    776 #  @b_has_pointer_member:: bool : メンバにポインタ型がある
    777 #  @b_has_sized_pointer_member:: bool : メンバにポインタ型がある
    778 #  @b_has_unsized_string_member:: bool : メンバにポインタ型がある
    779 #  @b_hasTag:: bool : タグがある
    780 #  @member_types_symbol:: Symbol : tag が無い時のみ設定 (それ以外では nil)
     735#  @b_has_pointer_member:: bool : メンバにポインタ型がある
     736#  @b_has_sized_pointer_member:: bool : メンバにポインタ型がある
     737#  @b_has_unsized_string_member:: bool : メンバにポインタ型がある
     738#  @b_hasTag:: bool : タグがある
     739#  @member_types_symbol:: Symbol : tag が無い時のみ設定 (それ以外では nil)
    781740
    782741  @@structtype_current_stack = []
    783742  @@structtype_current_sp = -1
    784743
    785   # tag なし struct
     744  # tag なし struct
    786745  @@no_struct_tag_num = 0
    787746  @@no_tag_struct_list = {}
     
    811770    if @b_define then
    812771      @members_decl = NamedList.new( nil, "in struct #{@tag}" )
    813       # if @tag then    登録タイミングを終わりに変更 V1.0.2.19
     772      # if @tag then    登録タイミングを終わりに変更 V1.0.2.19
    814773      #  Namespace.new_structtype( self )
    815774      # end
    816775    else
    817776      @definition = Namespace.find_tag( @tag )
    818       # check_struct_tag に移す V1.0.2.19
     777      # check_struct_tag に移す V1.0.2.19
    819778      # if @definition == nil then
    820779      #  cdl_error( "T1021 \'$1\': struct not defined" , @tag )
     
    841800  end
    842801
    843   def check     # 意味的誤りがあれば、文字列を返す
     802  def check     # 意味的誤りがあれば、文字列を返す
    844803    nil
    845804  end
    846805
    847   #=== 構造体のタグをチェック
    848   #  declarator の時点でチェックする
    849   #kind:: Decl の @kind を参ç
    850 §
     806  #=== 構造体のタグをチェック
     807  #  declarator の時点でチェックする
     808  #kind:: Decl の @kind を参照
    851809  def check_struct_tag kind
    852810    if @tag == nil
     
    860818  end
    861819
    862   # mikan Float 型の C_EXP 対応 (generate.rb にも変更å¿
    863 è¦)
     820  # mikan Float 型の C_EXP 対応 (generate.rb にも変更必要)
    864821  def check_init( locale, ident, initializer, kind, attribute = nil )
    865822
     
    870827    end
    871828
    872     # 初期化子が式の場合、型(タグ)が一致するかチェック
     829    # 初期化子が式の場合、型(タグ)が一致するかチェック
    873830    if initializer.instance_of?( Expression ) then
    874831      t = initializer.get_type( attribute )
     
    906863
    907864  def end_of_parse()
    908     if @members_decl == nil   # @b_define = false またはメンバーのない構造体(エラー)
     865    if @members_decl == nil   # @b_define = false またはメンバーのない構造体(エラー)
    909866      return
    910867    end
     
    932889      string = md.get_string
    933890      if string == -1 then
    934         # 長さ指定なし
     891        # 長さ指定なし
    935892      elsif string then
    936893        val = string.eval_const( @members_decl )
     
    970927
    971928    if @b_hasTag then
    972       # typedef struct tag StructType; の形式の場合
    973       # struct の本体は、別に生成される
     929      # typedef struct tag StructType; の形式の場合
     930      # struct の本体は、別に生成される
    974931      return "#{str}struct #{@tag}"
    975932
    976933    else
    977       # typedef struct { int a; } StructType; の形式の場合
     934      # typedef struct { int a; } StructType; の形式の場合
    978935      str += "struct {"
    979936      @members_decl.get_items.each{ |i|
     
    1026983  end
    1027984
    1028   #=== 同じ構造体かどうかチェックする
    1029   # tag のチェックは行わない
    1030   # すべてのメンバの名前と型が一致することを確認する
     985  #=== 同じ構造体かどうかチェックする
     986  # tag のチェックは行わない
     987  # すべてのメンバの名前と型が一致することを確認する
    1031988  def same? another
    1032989    md = another.get_members_decl
     
    11181075  end
    11191076
    1120   def check     # 意味的誤りがあれば、文字列を返す
    1121     if @type.class == ArrayType then    # é
    1122 åˆ—を返す関数
     1077  def check     # 意味的誤りがあれば、文字列を返す
     1078    if @type.class == ArrayType then    # 配列を返す関数
    11231079      return "function returning array"
    1124     elsif @type.class == FuncType then  # 関数を返す関数
     1080    elsif @type.class == FuncType then  # 関数を返す関数
    11251081      return "function returning function"
    11261082    end
    1127     return @type.check   # 関数の return する型のチェック
    1128 
    1129     # パラメータの型のチェックは ParamList#check_param で行う
     1083    return @type.check   # 関数の return する型のチェック
     1084
     1085    # パラメータの型のチェックは ParamList#check_param で行う
    11301086  end
    11311087
    11321088  def check_struct_tag kind
    11331089    @type.check_struct_tag kind
    1134     # ParamDecl でもチェックされるので、ここではチェックしない
     1090    # ParamDecl でもチェックされるので、ここではチェックしない
    11351091    # @paramlist.check_struct_tag kind
    11361092  end
     
    11491105  end
    11501106
    1151   #=== return type を返す
     1107  #=== return type を返す
    11521108  #
    1153   # return type を返す
    1154   # get_return_type とすべきだった
     1109  # return type を返す
     1110  # get_return_type とすべきだった
    11551111  def get_type
    11561112    @type
     
    11621118
    11631119  def get_type_str_post
    1164     # 型だけを返す (仮引数の名前を含めない)
     1120    # 型だけを返す (仮引数の名前を含めない)
    11651121    @paramlist.to_str( false )
    11661122  end
     
    11901146  end
    11911147
    1192   #=== Push Pop Allocator がå¿
    1193 è¦ã‹ï¼Ÿ
    1194   # Transparent RPC の場合 oneway かつ in のé
    1195 åˆ—(size_is, count_is, string のいずれかで修飾)がある
     1148  #=== Push Pop Allocator が必要か?
     1149  # Transparent RPC の場合 oneway かつ in の配列(size_is, count_is, string のいずれかで修飾)がある
    11961150  def need_PPAllocator?( b_opaque = false )
    11971151    if @b_oneway || b_opaque then
     
    12021156  end
    12031157
    1204   #=== パラメータが in, inout, out, send, receive を持つか
     1158  #=== パラメータが in, inout, out, send, receive を持つか
    12051159  def has_in?
    12061160    @has_in
     
    12191173  end
    12201174
    1221   #=== å
    1222 ¥åŠ›æ–¹å‘のパラメータを持つか
     1175  #=== 入力方向のパラメータを持つか
    12231176  def has_inward?
    12241177    @has_in || @has_inout || @has_send
    12251178  end
    1226   #=== 出力方向のパラメータを持つか
     1179  #=== 出力方向のパラメータを持つか
    12271180  def has_outward?
    12281181    @has_inout || @has_out || @has_receive
     
    12661219  end
    12671220
    1268   #=== Array#qualifier(const, volatile) の設定
     1221  #=== Array#qualifier(const, volatile) の設定
    12691222  def set_qualifier( qualifier )
    12701223    clone_type
     
    12731226  end
    12741227
    1275   # é
    1276 åˆ—要素が const なら const
     1228  # 配列要素が const なら const
    12771229  def is_const?
    12781230    @type.is_const?
    12791231  end
    12801232
    1281   # é
    1282 åˆ—要素が volatile なら volatile
     1233  # 配列要素が volatile なら volatile
    12831234  def is_volatile?
    12841235    @type.is_volatile?
     
    13061257  end
    13071258
    1308   def check     # 意味的誤りがあれば、文字列を返す
    1309     if @type.class == FuncType then             # 関数のé
    1310 åˆ—
     1259  def check     # 意味的誤りがあれば、文字列を返す
     1260    if @type.class == FuncType then             # 関数の配列
    13111261      return "array of function"
    1312     elsif @type.class == ArrayType then # 添数なしé
    1313 åˆ—のé
    1314 åˆ—
     1262    elsif @type.class == ArrayType then # 添数なし配列の配列
    13151263      unless @type.get_subscript then
    13161264        return "subscript not specified"
     
    13181266    end
    13191267
    1320     return @type.check    # é
    1321 åˆ—要素の型をチェック
     1268    return @type.check    # 配列要素の型をチェック
    13221269  end
    13231270
     
    13281275  def check_init( locale, ident, initializer, kind, attribute = nil )
    13291276    if ( initializer.instance_of?( Array ) ) then
    1330       # 要素数が指定されている場合、初期化要素数をチェック
     1277      # 要素数が指定されている場合、初期化要素数をチェック
    13311278      if @subscript then
    13321279        n_sub = @subscript.eval_const( nil )
     
    13811328#  @size:: Expr, or nil if not specified
    13821329#  @count:: Expr, or nil if not specified
    1383 #  @string:: Expr or -1(if size not specified) (string 引数), or nil if not specified
     1330#  @string:: Expr or -1(if size not specified) (string 引数), or nil if not specified
    13841331
    13851332  include HasType
     
    13981345      @type = type
    13991346    else
    1400       @type.set_type( type )    # 枝å
    1401 ˆã® type を設定
     1347      @type.set_type( type )    # 枝先の type を設定
    14021348    end
    14031349  end
     
    14211367  end
    14221368
    1423   def check     # 意味的誤りがあれば、文字列を返す
     1369  def check     # 意味的誤りがあれば、文字列を返す
    14241370    return nil if @type == nil
    14251371    @type.check
     
    14271373
    14281374  def check_struct_tag kind
    1429     if kind != :MEMBER  # 構造体メンバーの場合、ポインタのå
    1430 ˆã®æ§‹é€ ä½“タグをチェックしない
     1375    if kind != :MEMBER  # 構造体メンバーの場合、ポインタの先の構造体タグをチェックしない
    14311376      @type.check_struct_tag kind
    14321377    end
     
    14451390          if ( t1.class == t2.class ) && ( t1.get_bit_size == t2.get_bit_size ) then
    14461391          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
    1447             # int8_t などが、一方は .h に定義されているケース
     1392            # int8_t などが、一方は .h に定義されているケース
    14481393          else
    14491394            cdl_error2( locale, "T1032 $1: incompatible pointer type" , ident )
     
    14561401        end
    14571402      elsif val.kind_of? StringVal then
    1458         # 文字列定数
     1403        # 文字列定数
    14591404        # mikan L"wide string"
    14601405        if @type.get_bit_size != -1 && @type.get_bit_size != -11 then  # -1: char_t
     
    15001445    @b_nullable = b_nullable
    15011446
    1502     # string は最も左側の ptr に作用する
     1447    # string は最も左側の ptr に作用する
    15031448    if @type.kind_of?( PtrType ) then
    1504       # ptr_level が 2 以上であることは ParamDecl#initializer でチェックされる
     1449      # ptr_level が 2 以上であることは ParamDecl#initializer でチェックされる
    15051450      clone_type
    15061451      @type.set_scs( nil, nil, string, nil, false )
     
    15491494  end
    15501495
    1551   #=== PtrType# size_is の最大値
     1496  #=== PtrType# size_is の最大値
    15521497  def get_max
    15531498    @max
     
    16121557end
    16131558
    1614 #==  DescriptorType クラス
    1615 # 動的結合で渡すデスクリプタ型
     1559#==  DescriptorType クラス
     1560# 動的結合で渡すデスクリプタ型
    16161561class DescriptorType < Type
    16171562  # @sinagure_nsp::NamespacePath
     
    16431588    case kind
    16441589    when :PARAMETER
    1645       # 引数は初期化できない
     1590      # 引数は初期化できない
    16461591    else
    16471592      cdl_error2( locale, "T9999 Descriptor cannot be used for $1", kind)
     
    16771622end
    16781623
    1679 # 以下単体テストコード
     1624# 以下単体テストコード
    16801625if $unit_test then
    16811626  puts( "===== Unit Test: IntType ===== (types.rb)")
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/unjoin_plugin.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2019 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
    5237#   $Id$
    5338#++
    5439
    55 # Marshal.dump で不都合な事é 
    56 ã¸ã®å¯¾ç­–
    57 # Proc は _dump_data が定義されていないため、定義する.
    58 # plugin 関係は、tecsflow に Plugin クラスが存在しないため、消しておく.
    59 
    60 # Proc は、Marshal.dump することができないため _dump_data を定義
     40# Marshal.dump で不都合な事項への対策
     41# Proc は _dump_data が定義されていないため、定義する.
     42# plugin 関係は、tecsflow に Plugin クラスが存在しないため、消しておく.
     43
     44# Proc は、Marshal.dump することができないため _dump_data を定義
    6145class Proc
    6246  def _dump_data
     
    8670
    8771    if kind_of? Expression then
    88       # print   # Expression では print が別に定義されている
     72      # print   # Expression では print が別に定義されている
    8973      get_elements.each{|ele|
    9074        ele.find_plugin_1 level+1, object_list
     
    10387    end
    10488
    105     object_list.push self                 ##### ここから return 不可
     89    object_list.push self                 ##### ここから return 不可
    10690
    10791    if (kind_of? Plugin) || (kind_of? HRPSVCPlugin) then
     
    136120      }
    137121    end
    138     object_list.pop                       ##### ここまで return 不可
     122    object_list.pop                       ##### ここまで return 不可
    139123  end
    140124end
  • azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/value.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    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
    5237#   $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.