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/types.rb

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