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

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r388 r389  
    66#   Copyright (C) 2008-2017 by TOPPERS Project
    77#--
    8 #   ä¸Šè¨˜è‘—作権è€
    9 ã¯ï¼Œä»¥ä¸‹ã®(1)~(4)の条件を満たす場合に限り,本ソフトウェ
    10 #   ã‚¢ï¼ˆæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã‚’改変したものを含む.以下同じ)を使用・複製・改
    11 #   å¤‰ãƒ»å†é
    12 å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
    13 #   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
    14 #       æ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定が,そのままの形でソー
    15 #       ã‚¹ã‚³ãƒ¼ãƒ‰ä¸­ã«å«ã¾ã‚Œã¦ã„ること.
    16 #   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
    17 #       ç”¨ã§ãã‚‹å½¢ã§å†é
    18 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é
    19 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
    20 #       è€
    21 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—作権表示,この利用条件および下記
    22 #       ã®ç„¡ä¿è¨¼è¦å®šã‚’掲載すること.
    23 #   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
    24 #       ç”¨ã§ããªã„形で再é
    25 å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
    26 #       ã¨ï¼Ž
    27 #     (a) 再é
    28 å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€
    29 ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ãªã©ï¼‰ã«ï¼Œä¸Šè¨˜ã®è‘—
    30 #         ä½œæ¨©è¡¨ç¤ºï¼Œã“の利用条件および下記の無保証規定を掲載すること.
    31 #     (b) 再é
    32 å¸ƒã®å½¢æ
    33 ‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
    34 #         å ±å‘Šã™ã‚‹ã“と.
    35 #   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
    36 #       å®³ã‹ã‚‰ã‚‚,上記著作権è€
    37 ãŠã‚ˆã³TOPPERSプロジェクトをå
    38 è²¬ã™ã‚‹ã“と.
    39 #       ã¾ãŸï¼Œæœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã®ãƒ¦ãƒ¼ã‚¶ã¾ãŸã¯ã‚¨ãƒ³ãƒ‰ãƒ¦ãƒ¼ã‚¶ã‹ã‚‰ã®ã„かなる理
    40 #       ç”±ã«åŸºã¥ãè«‹æ±‚からも,上記著作権è€
    41 ãŠã‚ˆã³TOPPERSプロジェクトを
    42 #       å
    43 è²¬ã™ã‚‹ã“と.
     8#   上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
     9#   ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
     10#   変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
     11#   (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
     12#       権表示,この利用条件および下記の無保証規定が,そのままの形でソー
     13#       スコード中に含まれていること.
     14#   (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
     15#       用できる形で再配布する場合には,再配布に伴うドキュメント(利用
     16#       者マニュアルなど)に,上記の著作権表示,この利用条件および下記
     17#       の無保証規定を掲載すること.
     18#   (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
     19#       用できない形で再配布する場合には,次のいずれかの条件を満たすこ
     20#       と.
     21#     (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
     22#         作権表示,この利用条件および下記の無保証規定を掲載すること.
     23#     (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
     24#         報告すること.
     25#   (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     26#       害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
     27#       また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     28#       由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
     29#       免責すること.
    4430
    45 #   æœ¬ã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã¯ï¼Œç„¡ä¿è¨¼ã§æä¾›ã•ã‚Œã¦ã„るものである.上記著作権è€
    46 ãŠ
    47 #   ã‚ˆã³TOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
    48 #   ã«å¯¾ã™ã‚‹é©åˆæ€§ã‚‚含めて,いかなる保証も行わない.また,本ソフトウェ
    49 #   ã‚¢ã®åˆ©ç”¨ã«ã‚ˆã‚Šç›´æŽ¥çš„または間接的に生じたいかなる損害に関しても,そ
    50 #   ã®è²¬ä»»ã‚’負わない.
     31#   本ソフトウェアは,無保証で提供されているものである.上記著作権者お
     32#   よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
     33#   に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
     34#   アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
     35#   の責任を負わない.
    5136
    5237#   $Id$
     
    7156
    7257  #=== Expression# to_s
    73   # C 言語ソース向きの文字列を生成 (globa_name)
     58  # C 言語ソース向きの文字列を生成 (globa_name)
    7459  def to_s
    7560    elements_to_s( @elements )
     
    7762
    7863  #=== Expression# to_str
    79   # C 言語ソース向きの文字列を生成 (globa_name)
     64  # C 言語ソース向きの文字列を生成 (globa_name)
    8065  def to_str( name_list, pre, post )
    8166    elements_to_s( @elements, name_list, pre, post )
     
    8368
    8469  #=== Expression#to_CDL_str
    85   # CDL 表現の文字列を生成
     70  # CDL 表現の文字列を生成
    8671  def to_CDL_str
    8772    return to_s
    8873  end
    8974
    90   #=== 定数式として評価する(トライしてみる)
     75  #=== 定数式として評価する(トライしてみる)
    9176  #
    92   # このメソッドは、定数式を評価する
    93   # ・attribute, var の初期化子
    94   # ・size_is, count_is 引数
    95   # ・é
    96 åˆ—の添数
     77  # このメソッドは、定数式を評価する
     78  # ・attribute, var の初期化子
     79  # ・size_is, count_is 引数
     80  # ・配列の添数
    9781  #
    98   # name_list(NamedList|Nil): 式から参ç
    99 §å¯èƒ½ãªãƒªã‚¹ãƒˆï¼Ž
    100   # NamedList の要素は  size_is, count_is の引数評価の場合 ParamDecl (関数仮引数)
     82  # name_list(NamedList|Nil): 式から参照可能なリスト.
     83  # NamedList の要素は  size_is, count_is の引数評価の場合 ParamDecl (関数仮引数)
    10184  #
    102   # name_list2(NamedList|Nil) : NamedList の要素は Decl (attribute, var) である.省略時 nil
     85  # name_list2(NamedList|Nil) : NamedList の要素は Decl (attribute, var) である.省略時 nil
    10386  #
    104   # RETURN: 評価した定数.評価できなかった場合は nil を返す
     87  # RETURN: 評価した定数.評価できなかった場合は nil を返す
    10588  #
    106   # 型は get_type で、評価する(定数として求められないときに使用できる)
    107   # Array を返すのは attr{ int *a = {1, 2, 3}; int *b = a; }; の b の右辺を評価した場合
     89  # 型は get_type で、評価する(定数として求められないときに使用できる)
     90  # Array を返すのは attr{ int *a = {1, 2, 3}; int *b = a; }; の b の右辺を評価した場合
    10891
    10992  def eval_const( name_list, name_list2 = nil )
     
    11699      return val.to_i
    117100    elsif val.kind_of? PointerVal then
    118       return val.to_i           # mikan エラー V1008 が発生してしまう
     101      return val.to_i           # mikan エラー V1008 が発生してしまう
    119102      # elsif val.kind_of? EnumVal then
    120103      # enum mikan
    121104    else
    122       # C_EXP, Array または nil :そのまま返す
     105      # C_EXP, Array または nil :そのまま返す
    123106      return val
    124107    end
    125108  end
    126109
    127   #=== 定数式として評価する2(トライしてみる)
     110  #=== 定数式として評価する2(トライしてみる)
    128111  #
    129   # IntegerVal, FloatVal をそのまま返す(eval_const では Integer, Float に変換)
     112  # IntegerVal, FloatVal をそのまま返す(eval_const では Integer, Float に変換)
    130113  def eval_const2( name_list, name_list2 = nil, nest = 0 )
    131114    val = elements_eval_const( @elements, name_list, name_list2, nest )
    132115  end
    133116
    134   #=== 式の型を評価する
     117  #=== 式の型を評価する
    135118  #
    136   # eval_const で値が得られない場合、型を導出可能であれば型を得る
    137   # param を含んだ式は定数値を求められないが、型を得ることはできる
    138   # 未定義変数を含んだ型は、得ることができない (ダミー型定義が返る)
    139   def get_type( namedList )        # 名前空間の NamedList を指定
     119  # eval_const で値が得られない場合、型を導出可能であれば型を得る
     120  # param を含んだ式は定数値を求められないが、型を得ることはできる
     121  # 未定義変数を含んだ型は、得ることができない (ダミー型定義が返る)
     122  def get_type( namedList )        # 名前空間の NamedList を指定
    140123    elements_get_type( @elements, namedList )
    141124  end
     
    150133
    151134  def show_tree( indent )
    152     # mikan override してしまった print を呼出す方法がわからないのでこうした
     135    # mikan override してしまった print を呼出す方法がわからないのでこうした
    153136    str = ""
    154137    indent.times { str += "  " }
     
    158141## private
    159142
    160   #=== 式を文字列に変換
    161   #name_list:: attribute (Celltype::@attribute_list), struct の @member_list を仮定している
     143  #=== 式を文字列に変換
     144  #name_list:: attribute (Celltype::@attribute_list), struct の @member_list を仮定している
    162145  def elements_to_s( elements, name_list = nil, pre = nil, post = nil )
    163146    if elements.instance_of? Token then
    164       return elements.to_s    # OP_DOT, OP_REF の右辺
     147      return elements.to_s    # OP_DOT, OP_REF の右辺
    165148    end
    166149
     
    247230  end
    248231
    249   #=== Expression# 逆ポーランド文字列化
    250   #param_list:: ParamlList  関数の引数リスト
     232  #=== Expression# 逆ポーランド文字列化
     233  #param_list:: ParamlList  関数の引数リスト
    251234  def get_rpn( param_list = nil, name_list2 = nil )
    252235    return elements_rpn( @elements, param_list, name_list2 )
    253236  end
    254237
    255   #=== Expression# 逆ポーランド文字列化 (private)
    256   #name_list:: ParamlList  関数の引数リスト
     238  #=== Expression# 逆ポーランド文字列化 (private)
     239  #name_list:: ParamlList  関数の引数リスト
    257240  def elements_rpn( elements, name_list = nil, name_list2 = nil )
    258241    if elements.instance_of? Token then
    259242      print "rpn: #{elements.to_s}\n"
    260       return elements.to_s    # OP_DOT, OP_REF の右辺
     243      return elements.to_s    # OP_DOT, OP_REF の右辺
    261244    end
    262245
     
    354337  end
    355338
    356   # 定数式(elements)を評価する
     339  # 定数式(elements)を評価する
    357340  #
    358   # このメソッドは Expression クラスのメソッドであるå¿
    359 è¦ã¯ãªã„(関数化できる)
     341  # このメソッドは Expression クラスのメソッドである必要はない(関数化できる)
    360342  #
    361   # elements は式の要素
     343  # elements は式の要素
    362344  #
    363   # name_list, name_list2 は eval_const を参ç
    364 §
     345  # name_list, name_list2 は eval_const を参照
    365346  #
    366   # RETURN: 評価した定数、評価できなかった場合は nil を返す
    367 
    368   MAX_NEST_LEVEL = 64    # 簡易のループ検出(参ç
    369 §ã®ãƒã‚¹ãƒˆã‚’ 64 まで許可する)
     347  # RETURN: 評価した定数、評価できなかった場合は nil を返す
     348
     349  MAX_NEST_LEVEL = 64    # 簡易のループ検出(参照のネストを 64 まで許可する)
    370350  def elements_eval_const( elements, name_list, name_list2 = nil, nest = nil )
    371351
     
    374354      nsp = elements[1]
    375355
    376       # #809 の修正しかけ (別の問題が解決しきれていない)
    377       # nest += 1     # 参ç
    378 §ãŒãƒ«ãƒ¼ãƒ—になっていないかのチェック
    379       #               # mikan 本当にループしているかどうかではなく、単純に多数の参ç
    380 §ã‚’繰り返していることで判定している
     356      # #809 の修正しかけ (別の問題が解決しきれていない)
     357      # nest += 1     # 参照がループになっていないかのチェック
     358      #               # mikan 本当にループしているかどうかではなく、単純に多数の参照を繰り返していることで判定している
    381359      # if nest > MAX_NEST_LEVEL then
    382360      #   cdl_error( "E9999: '$1' too many reference (maybe loop) max=$1" , nsp.to_s, MAX_NEST_LEVEL )
     
    393371      end
    394372
    395       # 見つからなければ定数定義から探す
     373      # 見つからなければ定数定義から探す
    396374      if object == nil then
    397         object = Namespace.find( nsp )# mikan namespace の対応 #1
    398       end
    399 
    400 # この実è£
    401 ã¯ã€ã‚‚う少し整理されるべき
    402 # これが呼出されるのは、以下の場合
    403 #   ãƒ»attribute, var の右辺式の評価
    404 #   ãƒ»size_is 引数の評価:関数パラメータの場合とattribute, var の場合がある
    405 # 以下のエラーチェックでは、これらがごっちゃになって誤りを検出しようとしている
    406 
    407       # IDENTIFIER は見つからなかった?
     375        object = Namespace.find( nsp )# mikan namespace の対応 #1
     376      end
     377
     378# この実装は、もう少し整理されるべき
     379# これが呼出されるのは、以下の場合
     380#   ・attribute, var の右辺式の評価
     381#   ・size_is 引数の評価:関数パラメータの場合とattribute, var の場合がある
     382# 以下のエラーチェックでは、これらがごっちゃになって誤りを検出しようとしている
     383
     384      # IDENTIFIER は見つからなかった?
    408385      if object == nil then
    409386        cdl_error( "E1001 $1: not found" , nsp.get_path_str )
     
    411388        return nil
    412389      elsif object.instance_of?( Join ) then
    413         # Join の場合: cell の中の attribute, var, call のどれかが見つかった
    414         # Decl (attribute, var) でない?
     390        # Join の場合: cell の中の attribute, var, call のどれかが見つかった
     391        # Decl (attribute, var) でない?
    415392        if ! object.get_definition.instance_of?( Decl ) then
    416393          cdl_error( "E1002 $1: not constant (port)" , nsp.get_path_str )
     
    419396        return object.get_rhs.eval_const2( name_list, name_list2, nest )
    420397      elsif ! object.instance_of?( Decl ) then
    421         # Decl でない場合: 定数でもない
     398        # Decl でない場合: 定数でもない
    422399        if ( ! object.instance_of?( ParamDecl ) ) then
    423                                                       # mikan paramdecl は無視する
    424                                                       # ParamList から呼ばれたとき
     400                                                      # mikan paramdecl は無視する
     401                                                      # ParamList から呼ばれたとき
    425402          cdl_error( "E1003 $1: not constant" , nsp.get_path_str )
    426403        else
     
    432409        object.referenced
    433410        if object.get_initializer == nil then
    434           # 初期化子の存在しない変数   # mikan ここへくるのは、通常ありえないはず(未検証)
     411          # 初期化子の存在しない変数   # mikan ここへくるのは、通常ありえないはず(未検証)
    435412          return IntegerVal.new( 0 )
    436413        else
    437           # Decl の右辺の評価
    438           # mikan size_is 引数に現れる変数の型が適切かのチェックする
     414          # Decl の右辺の評価
     415          # mikan size_is 引数に現れる変数の型が適切かのチェックする
    439416          if object.get_initializer.instance_of?( Expression ) || object.get_initializer.instance_of?( C_EXP ) then
    440417            return object.get_initializer.eval_const2( name_list, name_list2, nest )
    441418          else
    442             # Array の場合
     419            # Array の場合
    443420            return object.get_initializer
    444421          end
     
    556533# p "val.respond_to?( \"-@\" )=#{val.respond_to?( "-@" )} #{val.class}"
    557534# p "val.respond_to?( \"~@\" )=#{val.respond_to?( "~@" )}"
    558 #2.0      if val.respond_to?( "~@" ) then  # Ruby 1.9, 2.0 preview 版では例外が発生してしまう
     535#2.0      if val.respond_to?( "~@" ) then  # Ruby 1.9, 2.0 preview 版では例外が発生してしまう
    559536      if val.kind_of? IntegerVal then
    560537        return ~ val
     
    702679  def elements_get_type( elements, namedList )
    703680    type = elements_get_type_sub( elements, namedList )
    704     # 返された方が DefinedType の場合 å
    705 ƒã®åž‹ã‚’返す
     681    # 返された方が DefinedType の場合 元の型を返す
    706682    if type.kind_of?( DefinedType ) then
    707683      type = type.get_type
     
    742718      unless type.kind_of?( PtrType ) then
    743719        cdl_error( "E1013 \'*\': operand is not pointer value"  )
    744         return IntType.new( 8 )    # IntType を返しておく
     720        return IntType.new( 8 )    # IntType を返しておく
    745721      end
    746722      return type.get_referto
    747723
    748724    when :OP_U_PLUS, :OP_U_MINUS
    749       # mikan operand が適切な型かチェックしていない
     725      # mikan operand が適切な型かチェックしていない
    750726      return elements_get_type( elements[1], namedList )
    751727
    752728    when :OP_ADD, :OP_SUB, :OP_MULT, :OP_DIV, :OP_REMAIN
    753       # mikan operand が適切な型かチェックしていない&左辺の型を採用している
     729      # mikan operand が適切な型かチェックしていない&左辺の型を採用している
    754730      return elements_get_type( elements[1], namedList )
    755731
    756732    when :OP_U_TILDE
    757       # mikan operand が整数かチェックしていない
     733      # mikan operand が整数かチェックしていない
    758734      return elements_get_type( elements[1], namedList )
    759735    when :OP_AND, :OP_EOR, :OP_OR, :OP_LSFT, :OP_RSFT
    760       # mikan operand が整数かチェックしていない
     736      # mikan operand が整数かチェックしていない
    761737      return BoolType.new
    762738    when :OP_U_EXCLAM
    763       # mikan operand が整数かチェックしていない
     739      # mikan operand が整数かチェックしていない
    764740      return BoolType.new
    765741
     
    771747  end
    772748
    773   # 式が size_is, count_is, string の引数である場合の方向のチェック
     749  # 式が size_is, count_is, string の引数である場合の方向のチェック
    774750  def elements_check_dir_for_param( elements, namedList, dir, spec )
    775    # dir : å
    776 ƒã®å¼•æ•°ã®æ–¹å‘
    777    # direct: size_is などの引数の変数の方向
     751   # dir : 元の引数の方向
     752   # direct: size_is などの引数の変数の方向
    778753
    779754    case elements[0]
     
    806781          judge = true if ( direct == :IN || direct == :INOUT )
    807782          req_direct = "in or inout"
    808         when :OUT, :RECEIVE     # mikan out で count_is のみ指定されている場合 in でなくてはならない
     783        when :OUT, :RECEIVE     # mikan out で count_is のみ指定されている場合 in でなくてはならない
    809784          judge = true if ( direct == :OUT || direct == :INOUT )
    810785          req_direct = "out or inout"
     
    822797      return true
    823798
    824     # 単é 
    825 æ¼”算子
     799    # 単項演算子
    826800    when :OP_U_ASTER, :OP_SIZEOF_EXPR, :OP_SIZEOF_TYPE, :OP_U_PLUS, :OP_U_MINUS, :OP_U_TILDE, :OP_U_EXCLAM, :CAST, :OP_U_AMP, :PARENTHESES,
    827801      elements_check_dir_for_param( elements[1], namedList, dir, spec )
    828802
    829     # 2é 
    830 æ¼”算子
     803    # 2項演算子
    831804    when :OP_SUBSC, :OP_DOT, :OP_REF, :OP_MULT, :OP_DIV, :OP_REMAIN, :OP_ADD, :OP_SUB, :OP_LSFT, :OP_RSFT, :OP_LT, :OP_GT, :OP_LE, :OP_GE, :OP_EQ, :OP_NE, :OP_AND, :OP_EOR, :OP_OR, :OP_LAND, :OP_LOR
    832805      return elements_check_dir_for_param( elements[1], namedList, dir, spec ) && elements_check_dir_for_param( elements[2], namedList, dir, spec )
    833806
    834     # 3é 
    835 æ¼”算子
     807    # 3項演算子
    836808    when :OP_CEX
    837809      return elements_check_dir_for_param( elements[1], namedList, dir, spec ) && elements_check_dir_for_param( elements[2], namedList, dir, spec ) && elements_check_dir_for_param( elements[3], namedList, dir, spec )
     
    845817  #Express# get_allocator_rhs_elem
    846818  #alloc_type::Symbol  :NORMAL_ALLOC|:INTERNAL_ALLOC|:RELAY_ALLOC
    847   #式がアロケータ指定子の右辺として妥当かチェックし、正しければ分解した値を返す
     819  #式がアロケータ指定子の右辺として妥当かチェックし、正しければ分解した値を返す
    848820  #return:
    849821  #  :NORMAL_ALLOC      [ cell_nsp, ep_name ]               # rhs = cell_nsp.ep_name    ex) Alloc.eAlloc
     
    883855  end
    884856
    885   #Expression#Expression のクローンを作成する
     857  #Expression#Expression のクローンを作成する
    886858  def clone_for_composite
    887859    cl = self.clone
     
    891863  end
    892864
    893   #Expression#elements のクローンを作成
     865  #Expression#elements のクローンを作成
    894866  #elements::Array
    895   # このメソッドは、Array のディープコピーを行う
     867  # このメソッドは、Array のディープコピーを行う
    896868  def clone_elements elements
    897869    elements = elements.clone
     
    910882  end
    911883
    912   #=== Expression#セル結合の式を解析する
     884  #=== Expression#セル結合の式を解析する
    913885  # Cell.eEntry  => [ :OP_DOT, [ :IDENTIFIER, token ], token ]
    914886  # Cell.eEntry[expression] => [ :OP_SUBSC, [ :OP_DOT, [ :IDENTIFIER, token ], token ], expression ]
    915887  # Return: [ NamespacePath(cell_name), Integer(subscript) or nil, Token(port_name)]
    916888  def analyze_cell_join_expression
    917     # 右辺の Expression の要素を取り出す
     889    # 右辺の Expression の要素を取り出す
    918890    elements = @elements
    919     if elements[0] == :OP_SUBSC then  # 右辺:受け口é
    920 åˆ—?
     891    if elements[0] == :OP_SUBSC then  # 右辺:受け口配列?
    921892      # elements = [ :OP_SUBSC, [ :OP_DOT, [ :IDENTIFIER, token ], token ], expression ]
    922       subscript = elements[2].eval_const(nil)  # 受け口é
    923 åˆ—の添数
    924       elements  = elements[1]          # mikan é
    925 åˆ—だった場合
     893      subscript = elements[2].eval_const(nil)  # 受け口配列の添数
     894      elements  = elements[1]          # mikan 配列だった場合
    926895    else
    927896      subscript = nil
     
    939908  end
    940909
    941   #=== Expression# セルへの結合の式を生成する
     910  #=== Expression# セルへの結合の式を生成する
    942911  #nsp:: NamespacePath
    943912  #subscript:: Integer
    944913  #port_name:: Symbol
    945   # analyze_cell_join_expression と対になっている
     914  # analyze_cell_join_expression と対になっている
    946915  def self.create_cell_join_expression( nsp, subscript, port_name, locale = nil )
    947916    if ! port_name.instance_of?( Symbol ) then
     
    959928  end
    960929
    961   #=== Expression#整数定数の式を生成する
    962   #val:: Integer : 値: 整数
     930  #=== Expression#整数定数の式を生成する
     931  #val:: Integer : 値: 整数
    963932  def self.create_integer_constant( val, locale = nil )
    964933    if val != Integer( val ) || val < 0 then
     
    968937  end
    969938
    970   #=== Expression#単一の識別子の式を解析する
     939  #=== Expression#単一の識別子の式を解析する
    971940  # Identifier  => [ :IDENTIFIER, token ]
    972941  # Return: NamespacePath(Identifier)
    973942  def analyze_single_identifier
    974     # 右辺の Expression の要素を取り出す
     943    # 右辺の Expression の要素を取り出す
    975944    elements = @elements
    976945    if elements[0] == :IDENTIFIER
     
    982951
    983952  #=== Expression#
    984   #nsp:: NamespacePath :  参ç
    985 §ã™ã‚‹ã‚‚の識別子
     953  #nsp:: NamespacePath :  参照するもの識別子
    986954  def self.create_single_identifier( nsp, locale )
    987955    if ! nsp.instance_of?( NamespacePath ) then
     
    991959  end
    992960
    993   #=== 評価可能かチェックする
    994   #*v:: 可変個引数(任意の型)
    995   # すべてが BaseVal の子クラス(値)であれば、評価可能と判断する
     961  #=== 評価可能かチェックする
     962  #*v:: 可変個引数(任意の型)
     963  # すべてが BaseVal の子クラス(値)であれば、評価可能と判断する
    996964  def evaluable?( *v )
    997965    v.each{ |val|
     
    1012980
    1013981  #c_exp_string::String
    1014   #b_renew::Bool  : true なら C_EXP の clone 作成(エスケープ処理等をしない)
     982  #b_renew::Bool  : true なら C_EXP の clone 作成(エスケープ処理等をしない)
    1015983  def initialize( c_exp_string, b_renew = false )
    1016984    if b_renew then
    1017985      @c_exp_string = c_exp_string
    1018986    else
    1019       # 前後の " を取り除く
     987      # 前後の " を取り除く
    1020988      # str = c_exp_string.to_s.sub( /^\"(.*)\"$/, "\\1" )
    1021989      str = CDLString.remove_dquote c_exp_string.to_s
     
    1024992  end
    1025993
    1026   #=== composite 用に C_EXP を clone する
     994  #=== composite 用に C_EXP を clone する
    1027995  #ct_name::
    1028996  #cell_name::
    1029   # composite の attribute に現れる C_EXP を文字列置換して生成しなおす.
    1030   # この文字列置換は、意味解釈段階で行う.
    1031   # 他の C_EXP の文字列置換は、コード生成段階で行う.
     997  # composite の attribute に現れる C_EXP を文字列置換して生成しなおす.
     998  # この文字列置換は、意味解釈段階で行う.
     999  # 他の C_EXP の文字列置換は、コード生成段階で行う.
    10321000  def clone_for_composite( ct_name, cell_name, locale )
    10331001    dbgPrint "C_EXP: #{ct_name} #{cell_name} #{@c_exp_string}\n"
     
    10441012  end
    10451013
    1046   #=== C_EXP を評価する
    1047   # C_EXP の引き数文字列を返す
    1048   # 本来 C_EXP は eval_const する対象ではないが、便宜上 eval_const で対応
     1014  #=== C_EXP を評価する
     1015  # C_EXP の引き数文字列を返す
     1016  # 本来 C_EXP は eval_const する対象ではないが、便宜上 eval_const で対応
    10491017  def eval_const( name_list, name_list2 = nil )
    10501018     return self
Note: See TracChangeset for help on using the changeset viewer.