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

文字コードを設定

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/tecsgen/tecslib/core/bnf.y.rb

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