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

ビルドが通るよう更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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 )
Note: See TracChangeset for help on using the changeset viewer.