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.tab.rb

    • Property svn:mime-type changed from text/x-ruby to text/x-ruby;charset=UTF-8
    r270 r321  
    9494  }
    9595
    96   # 指定子 '[]' å†
    97 ã§ã®ã¿ä½¿ç”¨ã§ãã‚‹ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰
     96  # 指定子 '[]' 内でのみ使用できるキーワード
    9897  RESERVED2 = {
    9998    # specifier
     
    112111    # port (entry)
    113112    'inline' => :INLINE,
    114     'ref_desc' => :REF_DESC,   # call も可
     113    'ref_desc' => :REF_DESC,   # call も可
    115114
    116115    # port (call)
     
    156155  }
    157156
    158   # 再帰的なパーサのためのスタック
     157  # 再帰的なパーサのためのスタック
    159158  @@generator_nest = -1
    160159  @@generator_stack = []
    161160  @@current_locale = []
    162161
    163   # import_C 中である
     162  # import_C 中である
    164163  @@import_C = false
    165164
    166   # すべての構文解析が完了した
     165  # すべての構文解析が完了した
    167166  @@b_end_all_parse = false
    168167
    169168  def self.parse( file_name, plugin = nil, b_reuse = false )
    170     # パーサインスタンスを生成(別パーサで読み込む)
     169    # パーサインスタンスを生成(別パーサで読み込む)
    171170    parser = Generator.new
    172171
    173     # plugin から import されている場合の plugin 設定
     172    # plugin から import されている場合の plugin 設定
    174173    parser.set_plugin plugin
    175174
    176     # reuse フラグを設定
     175    # reuse フラグを設定
    177176    parser.set_reuse b_reuse
    178177
    179     # cdl をパース
     178    # cdl をパース
    180179    parser.parse( [file_name] )
    181180
    182     # 終期化 パーサスタックを戻す
     181    # 終期化 パーサスタックを戻す
    183182    parser.finalize
    184183  end
     
    200199  def self.get_plugin
    201200    if @@generator_stack[@@generator_nest] then
    202       # tecsgen 引数の cdl が import される場合は nil
     201      # tecsgen 引数の cdl が import される場合は nil
    203202      return @@generator_stack[@@generator_nest].get_plugin
    204203    else
     
    217216  def self.is_reuse?
    218217    if @@generator_stack[@@generator_nest] then
    219       # tecsgen 引数の cdl が import される場合は nil
     218      # tecsgen 引数の cdl が import される場合は nil
    220219      return @@generator_stack[@@generator_nest].is_reuse?
    221220    else
     
    247246      b_in_string = false
    248247
    249       # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
     248      # euc のコメントを utf8 として扱うと、コメントの終わりを誤る問題の対策
    250249      TECS_LANG::set_kcode_binary
    251250
     
    257256          TECSIO.foreach(file) {|line|
    258257            col = 1
    259 #            line.rstrip!         æ”¹è¡Œå«ã‚€æ–‡å­—列を扱うようになったので、ここで空白を取り除けなくなった
     258#            line.rstrip!         改行含む文字列を扱うようになったので、ここで空白を取り除けなくなった
    260259
    261260            until line.empty?
     
    263262              if b_in_comment
    264263                case line
    265                   # コメント終了
     264                  # コメント終了
    266265                when /\A\*\//
    267266                  b_in_comment = false
    268267                when /\A./
    269268                  ;
    270                 when /\s+/     # line.rstrip! を止めたため \n などの空白文字とまっちするルールがå¿
    271 è¦ã«ãªã£ãŸ
     269                when /\s+/     # line.rstrip! を止めたため \n などの空白文字とまっちするルールが必要になった
    272270                  ;
    273271                end
     
    277275                  @q <<  [:STRING_LITERAL, Token.new(string, file, lineno, col)]
    278276                  b_in_string = false
    279                 elsif line =~ /\A.*\\\n/     # 改行 \n は '.' にマッチしない
     277                elsif line =~ /\A.*\\\n/     # 改行 \n は '.' にマッチしない
    280278                  string += $&
    281                 elsif line =~ /\A.*\n/     # 改行 \n は '.' にマッチしない
     279                elsif line =~ /\A.*\n/     # 改行 \n は '.' にマッチしない
    282280                  string += line
    283                   # この位置では error メソッドは使えない (token 読出し前)
     281                  # この位置では error メソッドは使えない (token 読出し前)
    284282                  puts "error: #{file} line #{lineno}: string literal has newline without escape"
    285283                  @@n_error += 1
     
    287285              else
    288286                case line
    289                 # 空白、プリプロセスディレクティブ
     287                # 空白、プリプロセスディレクティブ
    290288                when /\A\s+/
    291289                  ;
    292                 # 識別子
     290                # 識別子
    293291                when /\A[a-zA-Z_]\w*/
    294292                  word = $&
    295293                  @q << [RESERVED[word] || :IDENTIFIER, Token.new(word.intern, file, lineno, col)]
    296                 # 16 進数定数
     294                # 16 進数定数
    297295                when /\A0x[0-9A-Fa-f]+/
    298296                  @q << [:HEX_CONSTANT, Token.new($&, file, lineno, col)]
    299                 # 8 進数定数
     297                # 8 進数定数
    300298                when /\A0[0-7]+/
    301299                  @q << [:OCTAL_CONSTANT, Token.new($&, file, lineno, col)]
    302                 # 浮動小数定数
     300                # 浮動小数定数
    303301                when /\A[0-9]+\.([0-9]*)?([Ee][+-]?[0-9]+)?/
    304302                  @q << [:FLOATING_CONSTANT, Token.new($&, file, lineno, col)]
    305                 # 整数定数
     303                # 整数定数
    306304                when /\A\d+/
    307305                  @q << [:INTEGER_CONSTANT, Token.new($&.to_i, file, lineno, col)]
    308                 # 文字定数
     306                # 文字定数
    309307                when /\A'(?:[^'\\]|\\.)'/
    310308                  @q << [:CHARACTER_LITERAL, Token.new($&, file, lineno, col)]
    311                 # 文字列
    312 #                "#include  #include #include \"../systask/logtask.cfg\"       æœ€å¾Œã® " 忘れ)で無限ループ
     309                # 文字列
     310#                "#include  #include #include \"../systask/logtask.cfg\"       最後の " 忘れ)で無限ループ
    313311#                when /\A"(?:[^"\\]+|\\.)*"/
    314                 when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
     312                when /\A"(?:[^"\\]|\\.)*"/   # これはうまく行くようだ
    315313                  @q << [:STRING_LITERAL, Token.new($&, file, lineno, col)]
    316                 # 文字列 (改行あり)
     314                # 文字列 (改行あり)
    317315                when /\A"(?:[^"\\]|\\.)*\\\n$/
    318316                  string = $&
    319317                  b_in_string = true
    320                 # 文字列 (改行あり, escape なし)
     318                # 文字列 (改行あり, escape なし)
    321319                when /\A("(?:[^"\\]|\e\.)*)\n$/
    322320                  string = $1 + "\\\n"
    323321                  b_in_string = true
    324                   # この位置では error メソッドは使えない (token 読出し前) # mikan cdl_error ではない
     322                  # この位置では error メソッドは使えない (token 読出し前) # mikan cdl_error ではない
    325323                  puts "error: #{file} line #{lineno}: string literal has newline without escape"
    326324                  @@n_error += 1
    327                 # 山括弧で囲まれた文字列
     325                # 山括弧で囲まれた文字列
    328326                when /\A<[0-9A-Za-z_\. \/]+>/   # AB: angle bracke
    329327                  @q << [:AB_STRING_LITERAL, Token.new($&, file, lineno, col)]
    330                 # 行コメント
     328                # 行コメント
    331329                when /\A\/\/.*$/
    332                   # 読み飛ばすだけ
    333                 # コメント開始
     330                  # 読み飛ばすだけ
     331                # コメント開始
    334332                when /\A\/\*/
    335333                  b_in_comment = true
    336                 # '>>', '<<' など
     334                # '>>', '<<' など
    337335                when /\A>>/, /\A<</, /\A==/, /\A!=/, /\A\&\&/, /\A\|\|/
    338336                  @q << [$&, Token.new($&, file, lineno, col)]
    339337                when /\A::/, /\A=>/, /\A<=/, /\A>=/
    340338                  @q << [$&, Token.new($&, file, lineno, col)]
    341                 # '(', ')' など一文字の記号、または未知の記号
     339                # '(', ')' など一文字の記号、または未知の記号
    342340                when /\A./
    343341                  @q << [$&, Token.new($&, file, lineno, col)]
     
    363361      }
    364362
    365       # 終了の印
     363      # 終了の印
    366364      @q << nil
    367365
     
    383381
    384382      if token[0] == :IDENTIFIER then
    385         # TYPE_NAME トークンへ置換え
     383        # TYPE_NAME トークンへ置換え
    386384        if Namespace.is_typename?( token[1].val ) then
    387385          token[0] = :TYPE_NAME
    388386        elsif @in_specifier && RESERVED2[ token[1].val.to_s ] then
    389           # 指定子キーワード( '[', ']' å†
    390 ã§ã®ã¿æœ‰åŠ¹)
     387          # 指定子キーワード( '[', ']' 内でのみ有効)
    391388          token[0] = RESERVED2[ token[1].val.to_s ]
    392389        end
    393390      end
    394391
    395       if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
     392      if $debug then     # 070107 token 無効時ここを通さないようした (through 対応 -d の時に例外発生)
    396393        locale = @@current_locale[@@generator_nest]
    397394        if token then
     
    424421  @@n_warning = 0
    425422
    426   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
     423  # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でエラー発生は不適切)
    427424  def self.error( msg, *arg )
    428425    locale = nil
     
    434431
    435432    msg = TECSMsg.get_error_message( msg )
    436     # $1, $2, ... を arg で置換
     433    # $1, $2, ... を arg で置換
    437434    count = 1
    438435    arg.each{ |a|
     
    442439    }
    443440
    444     # import_C の中でのエラー?
     441    # import_C の中でのエラー?
    445442    if @@import_C then
    446443      C_parser.error( msg )
    447444    else
    448445
    449       # Node の記憶する 位置 (locale) を使用した場合、変更以前に比べ、
    450       # 問題発生箇所と異なる位置にエラーが出るため、構文解析中のエラー
    451       # は、解析中の位置を出力する.(new_XXX で owner が子要素のチェッ
    452       # クをすると owner の行番号が出てしまう点で、ずれが生じている)
     446      # Node の記憶する 位置 (locale) を使用した場合、変更以前に比べ、
     447      # 問題発生箇所と異なる位置にエラーが出るため、構文解析中のエラー
     448      # は、解析中の位置を出力する.(new_XXX で owner が子要素のチェッ
     449      # クをすると owner の行番号が出てしまう点で、ずれが生じている)
    453450
    454451      if @@b_end_all_parse == false || locale == nil then
     
    463460  end
    464461
    465   # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
     462  # このメソッドは構文解析、意味解析からのみ呼出し可(コード生成でウォーニング発生は不適切)
    466463  def self.warning( msg, *arg )
    467464    locale = nil
     
    473470
    474471    msg = TECSMsg.get_warning_message( msg )
    475     # $1, $2, ... を arg で置換
     472    # $1, $2, ... を arg で置換
    476473    count = 1
    477474    arg.each{ |a|
     
    481478    }
    482479
    483     # import_C の中でのウォーニング?
     480    # import_C の中でのウォーニング?
    484481    if @@import_C then
    485482      C_parser.warning( msg )
     
    508505  end
    509506
    510   #===  '[' specifier 始め
     507  #===  '[' specifier 始め
    511508  def set_in_specifier
    512509    # p "set_in_specifier"
     
    514511  end
    515512
    516   #=== ']' specifier 終わり
     513  #=== ']' specifier 終わり
    517514  def unset_in_specifier
    518515    # p "unset_in_specifier"
     
    520517  end
    521518
    522   # statement_specifier は構文解釈途中で参ç
    523 §ã—たいため
     519  # statement_specifier は構文解釈途中で参照したいため
    524520  @@statement_specifier_stack = []
    525521  def self.add_statement_specifier( ss )
     
    538534  end
    539535
    540   #=== すべての構文解析が完了したことを報告
     536  #=== すべての構文解析が完了したことを報告
    541537  def self.end_all_parse
    542538    @@b_end_all_parse = true
     
    22642260module_eval(<<'.,.,', 'bnf.y.rb', 76)
    22652261  def _reduce_13(val, _values, result)
    2266                         # 連接した文字列を1つの文字列にまとめる
     2262                        # 連接した文字列を1つの文字列にまとめる
    22672263                        str = "\"" + val[0].val.gsub( /\"(.*)\"/, "\\1" ) + val[1].val.gsub( /\"(.*)\"/, "\\1" ) + "\""
    22682264                        result = Token.new( str, val[0].file, val[0].lineno, val[0].col )
     
    31593155  def _reduce_153(val, _values, result)
    31603156                        val[0].add_param( val[2] )
    3161                         # result = val[0] 不要
     3157                        # result = val[0] 不要
    31623158               
    31633159    result
     
    33143310                                result = val[1]
    33153311                        else
    3316                                 # エラー:仮で val[0] を返す
     3312                                # エラー:仮で val[0] を返す
    33173313                                result = val[0]
    33183314                        end
     
    34583454                        obj = val[3]
    34593455                        if obj.kind_of?( Cell ) || obj.kind_of?( Signature ) || obj.kind_of?( Celltype ) || obj.kind_of?( CompositeCelltype )then
    3460                                 # cell, signature 以外は、指定子を置けない
     3456                                # cell, signature 以外は、指定子を置けない
    34613457                        else
    3462               Generator.get_statement_specifier   # クリア
     3458              Generator.get_statement_specifier   # クリア
    34633459              Generator.error( "G1009 unexpected specifier"  )
    34643460                        end
     
    38313827                                val[1].check
    38323828                        else
    3833                                 # mikan 関数のé
    3834 åˆ—も以下のメッセージになる
     3829                                # mikan 関数の配列も以下のメッセージになる
    38353830                                Generator.error( "G1010 Not function"  )
    38363831                                result = nil
     
    38873882  def _reduce_264(val, _values, result)
    38883883                        if val[3].kind_of? Port then
    3889                                 val[3].set_specifier val[1]  # 設定順序あり
     3884                                val[3].set_specifier val[1]  # 設定順序あり
    38903885                                Celltype.new_port( val[3] )
    38913886                        else
    3892                                 # Port 以外では指定子はエラー
     3887                                # Port 以外では指定子はエラー
    38933888                                Generator.error( "G1012 $1 : cannot put specifier here" , val[1] )
    38943889                        end
     
    40954090  def _reduce_297(val, _values, result)
    40964091                        val[3].each{ |i|       # i:Decl
    4097                                 i.set_kind( :ATTRIBUTE )   # 設定順序あり
     4092                                i.set_kind( :ATTRIBUTE )   # 設定順序あり
    40984093                                i.set_specifier_list( [val[1]] )
    40994094                                i.check
     
    41774172  def _reduce_308(val, _values, result)
    41784173                        val[3].each{ |i|       # i:Decl
    4179                                 i.set_kind( :VAR )   # 設定順序あり
     4174                                i.set_kind( :VAR )   # 設定順序あり
    41804175                                i.set_specifier_list( [val[1]] )
    41814176                                i.check
     
    44584453  def _reduce_353(val, _values, result)
    44594454                        if val[0].kind_of?( Port ) then
    4460                                 CompositeCelltype.new_port( val[0] )   # é
    4461 å»¶ã—て登録
     4455                                CompositeCelltype.new_port( val[0] )   # 遅延して登録
    44624456                        end
    44634457               
     
    44694463  def _reduce_354(val, _values, result)
    44704464                        if val[3].kind_of?( Port ) then
    4471                                 # port 以外 val[3] に有効な値がå
    4472 ¥ã£ã¦ã„ないので、以下のメソッドを適用できない
    4473                                 # 現状 port, cell 以外は指定子を受け付けない
    4474                                 # (しかし将来他の文も指定子を受け付ける可能性があるので、この位置に記述する)
     4465                                # port 以外 val[3] に有効な値が入っていないので、以下のメソッドを適用できない
     4466                                # 現状 port, cell 以外は指定子を受け付けない
     4467                                # (しかし将来他の文も指定子を受け付ける可能性があるので、この位置に記述する)
    44754468                                val[3].set_specifier( Generator.get_statement_specifier )
    4476                                 CompositeCelltype.new_port( val[3] )   # é
    4477 å»¶ã—て登録 (set_specifier 後)
     4469                                CompositeCelltype.new_port( val[3] )   # 遅延して登録 (set_specifier 後)
    44784470                        elsif val[3].kind_of?( Cell ) then
    4479                                 # Cell.end_of_parse にて設定
     4471                                # Cell.end_of_parse にて設定
    44804472                        else
    4481               Generator.get_statement_specifier   # クリア
     4473              Generator.get_statement_specifier   # クリア
    44824474              Generator.error( "G1013 unexpected specifier"  )
    44834475                        end
     
    47564748                        if obj.kind_of?( Cell ) then
    47574749                        else
    4758               Generator.get_statement_specifier   # クリア
     4750              Generator.get_statement_specifier   # クリア
    47594751              Generator.error( "G9999 unexpected specifier"  )
    47604752                        end
     
    48544846
    48554847
    4856 # ファイル => INCLUDE("header")のé
    4857 åˆ—
     4848# ファイル => INCLUDE("header")の配列
    48584849Include = Hash.new {|hash, key| hash[key] = []}
    48594850
     
    49094900
    49104901#= TECSIO
    4911 #  Ruby2.0(1.9) 対応に伴い導å
    4912 ¥ã—たクラス
    4913 #  SJIS 以外では、ASCII-8BIT としてå
    4914 ¥åŠ›ã™ã‚‹
     4902#  Ruby2.0(1.9) 対応に伴い導入したクラス
     4903#  SJIS 以外では、ASCII-8BIT として入力する
    49154904class TECSIO
    4916   def self.foreach(file) # ブロック引数 { |line| }
    4917     pr = Proc.new   # このメソッドのブロック引数を pr に代å
    4918 ¥
     4905  def self.foreach(file) # ブロック引数 { |line| }
     4906    pr = Proc.new   # このメソッドのブロック引数を pr に代入
    49194907    if $b_no_kcode then
    49204908          msg = "E".encode $Ruby19_File_Encode
    49214909      if( $Ruby19_File_Encode == "Shift_JIS" )
    49224910
    4923         # Shift JIS は、いったん Windows-31J として読み込ませ、Shift_JIS に変換させる.
    4924         # コメント等に含まれる SJIS に不適切な文字コードは '?' または REPLACEMENT CHARACTER に変換される.
    4925         # EUC や UTF-8 で記述された CDL が混在していても、Ruby 例外が発生することなく処理を進めることができる.
    4926         # 文字コード指定が SJIS であって、文字列リテラルの中に、文字コードがSJIS 以外の非 ASCII が含まれている場合、
    4927         # Ruby 1.8 の tecsgen では文字コード指定に影響なく処理されたものが、Ruby 1.9 以降では '?' に置き換わる可能性がある.
     4911        # Shift JIS は、いったん Windows-31J として読み込ませ、Shift_JIS に変換させる.
     4912        # コメント等に含まれる SJIS に不適切な文字コードは '?' または REPLACEMENT CHARACTER に変換される.
     4913        # EUC や UTF-8 で記述された CDL が混在していても、Ruby 例外が発生することなく処理を進めることができる.
     4914        # 文字コード指定が SJIS であって、文字列リテラルの中に、文字コードがSJIS 以外の非 ASCII が含まれている場合、
     4915        # Ruby 1.8 の tecsgen では文字コード指定に影響なく処理されたものが、Ruby 1.9 以降では '?' に置き換わる可能性がある.
    49284916
    49294917        mode = "r:Windows-31J"
     
    49494937  end
    49504938
    4951   #=== 文字コードが相違する場合一致させる
    4952   # msg と str の文字コードが相違する場合、str を msg の文字コードに変換する
    4953   # 変換不可の文字コードは '?' (utf-8 の場合 U+FFFD (REPLACEMENT CHARACTER )) に変換
     4939  #=== 文字コードが相違する場合一致させる
     4940  # msg と str の文字コードが相違する場合、str を msg の文字コードに変換する
     4941  # 変換不可の文字コードは '?' (utf-8 の場合 U+FFFD (REPLACEMENT CHARACTER )) に変換
    49544942  #
    4955   # このメソッドは、エラーメッセージ出力でも使用されていることに注意.
     4943  # このメソッドは、エラーメッセージ出力でも使用されていることに注意.
    49564944  #
    49574945  #msg_enc::Encode | String
    49584946  def self.str_code_convert( msg, str )
    49594947    if $b_no_kcode == false then
    4960       return str                          # Ruby V1.8 まで
     4948      return str                          # Ruby V1.8 まで
    49614949    end
    49624950    if msg.encoding != str.encoding then
    4963       option = { :invalid => :replace, :undef => :replace }   # 例外を発生させず、'?' に変換する(utf-8 は 0xfffd)
     4951      option = { :invalid => :replace, :undef => :replace }   # 例外を発生させず、'?' に変換する(utf-8 は 0xfffd)
    49644952      # return str.encode( msg.encoding, option )
    49654953      str = str.encode( "utf-8", option )
Note: See TracChangeset for help on using the changeset viewer.