Changeset 429 for EcnlProtoTool/trunk/asp3_dcre/cfg/pass1.rb
- Timestamp:
- Jul 3, 2020, 7:19:17 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/cfg/pass1.rb
r360 r429 4 4 # 5 5 # Copyright (C) 2015 by FUJI SOFT INCORPORATED, JAPAN 6 # Copyright (C) 2015-201 7by Embedded and Real-Time Systems Laboratory6 # Copyright (C) 2015-2018 by Embedded and Real-Time Systems Laboratory 7 7 # Graduate School of Information Science, Nagoya Univ., JAPAN 8 8 # … … 36 36 # の責任を負わない. 37 37 # 38 # $Id $38 # $Id: pass1.rb 165 2019-01-11 01:29:47Z ertl-hiro $ 39 39 # 40 40 … … 61 61 "LONG_MAX" => { EXPR: "LONG_MAX", SIGNED: true }, 62 62 "LONG_MIN" => { EXPR: "LONG_MIN", SIGNED: true }, 63 "ULONG_MAX" => { EXPR: "ULONG_MAX" } 63 "ULONG_MAX" => { EXPR: "ULONG_MAX" }, 64 "SIL_ENDIAN_BIG" \ 65 => { EXPR: "true", BOOL: true, CONDITION: "defined(SIL_ENDIAN_BIG)" }, 66 "SIL_ENDIAN_LITTLE" \ 67 => { EXPR: "true", BOOL: true, CONDITION: "defined(SIL_ENDIAN_LITTLE)" } 64 68 } 65 69 … … 68 72 # 69 73 $apiDefinition = { "INCLUDE" => 70 { :PARAM => [ { :NAME => :file, :STRING => true }]}}74 { :PARAM => [ { :NAME => :file, :STRING_LITERAL => true }]}} 71 75 72 76 # … … 121 125 apiParam[:EXPTYPE] = "signed_t" 122 126 apiParam[:SIGNED] = true 127 when "^" # ポインタ整数定数式パラメータ 128 apiParam[:EXPTYPE] = "uintptr_t" 129 apiParam[:INTPTR] = true 123 130 when "&" # 一般整数定数式パラメータ 124 131 # do nothing 125 132 when "$" # 文字列定数式パラメータ 126 133 apiParam[:STRING] = true 134 apiParam[:EXPTYPE] = "char *" 127 135 else 128 136 error_exit("`#{param}' is invalid") … … 171 179 { skip_blanks: true, skip_lines: /^#/ }) 172 180 symvalCsv.each do |record| 181 symbol = {} 182 173 183 # 変数名 174 184 if record[0].nil? 175 185 error_exit("invalid variable name in " \ 176 186 "`#{symvalTableFileName}:#{symvalCsv.to_io.lineno}'") 177 end 178 179 symbol = {} 180 variable = record[0] 187 elsif /^(.+)\[(.+)\]$/ =~ record[0] 188 variable = $1 189 symbol[:NUMSTRVAR] = $2 190 else 191 variable = record[0] 192 end 181 193 182 194 # 式 … … 192 204 when /^[bB]/ # 真偽値 193 205 symbol[:BOOL] = true 206 when /^[iI]/ # ポインタ整数値 207 symbol[:INTPTR] = true 194 208 when /^[uU]/ # 符号無し整数値 195 209 # 何も設定しない … … 367 381 skipSpace(cfgFile, withinApi) 368 382 if @line.nil? # ファイル末であればエラー終了 369 error_exit(" unexpexced end-of-file")383 error_exit("#{cfgFile.getFileName}: unexpeced end-of-file") 370 384 end 371 385 end … … 472 486 end 473 487 474 if apiParam.has_key?(:STRING )488 if apiParam.has_key?(:STRING_LITERAL) 475 489 return(param.unquote) 476 490 else … … 604 618 # プリプロセッサディレクティブを読む 605 619 case @line 606 when /^#include\b(.*)$/ 607 $includeFiles.push($1.strip) 608 when /^#(ifdef|ifndef|if|endif|else|elif)\b/ 609 directive = { :DIRECTIVE => @line.strip } 620 when /^#(include|ifdef|ifndef|if|endif|else|elif)\b/ 621 directive = {} 622 directive[:DIRECTIVE] = @line.strip 623 directive[:_FILE_] = cfgFile.getFileName 624 directive[:_LINE_] = cfgFile.getLineNo 610 625 $cfgFileInfo.push(directive) 611 626 else … … 619 634 case apiName 620 635 when "KERNEL_DOMAIN" 621 if $supportDomain.nil?636 if !$supportDomain 622 637 parse_warning(cfgFile, "`KERNEL_DOMAIN' is not supported") 623 638 end … … 629 644 @@nestDC.push("domain") 630 645 when "DOMAIN" 631 if $supportDomain.nil?646 if !$supportDomain 632 647 parse_warning(cfgFile, "`DOMAIN' is not supported") 633 648 end … … 655 670 @@nestDC.push("domain") 656 671 when "CLASS" 657 if $supportClass.nil?672 if !$supportClass 658 673 parse_warning(cfgFile, "`CLASS' is not supported") 659 674 end … … 676 691 includeFilePath = SearchFilePath(staticApi[:file]) 677 692 if includeFilePath.nil? 678 parse_error(cfgFile, "`#{staticApi[:file]}' not found") 693 error = {} 694 error[:DIRECTIVE] = "#error '#{staticApi[:file]}' not found." 695 error[:_FILE_] = cfgFile.getFileName 696 error[:_LINE_] = cfgFile.getLineNo 697 $cfgFileInfo.push(error) 679 698 else 680 699 $dependencyFiles.push(includeFilePath) … … 694 713 $cfgFileInfo.push(staticApi) 695 714 end 715 716 # ";"を読む 717 skipToToken(cfgFile, false) # 次の文字まで読み飛ばす 718 if (/^\;(.*)$/ =~ @line) 719 @line = $1 720 else 721 parse_error(cfgFile, "`;' expected after static API") 722 end 696 723 else 697 724 parse_error(cfgFile, "unknown static API: #{apiName}") … … 727 754 # 728 755 def self.OutLineNumber(cfgInfo) 729 @cfg1Out.add("#line #{cfgInfo[:_LINE_]} \"#{cfgInfo[:_FILE_] .gsub('\\', '/')}\"")756 @cfg1Out.add("#line #{cfgInfo[:_LINE_]} \"#{cfgInfo[:_FILE_]}\"") 730 757 end 731 758 … … 734 761 # 735 762 def self.OutClassLineNumber(cfgInfo) 736 @cfg1Out.add("#line #{cfgInfo[:CLASS_LINE_]} \"#{cfgInfo[:CLASS_FILE_] .gsub('\\', '/')}\"")763 @cfg1Out.add("#line #{cfgInfo[:CLASS_LINE_]} \"#{cfgInfo[:CLASS_FILE_]}\"") 737 764 end 738 765 … … 763 790 EOS 764 791 765 # インクルードヘッダファイル 766 $includeFiles.each do |file| 767 @cfg1Out.add("#include #{file}") 792 # インクルードディレクティブ(#include)の生成 793 $cfgFileInfo.each do |cfgInfo| 794 if cfgInfo.has_key?(:DIRECTIVE) 795 OutLineNumber(cfgInfo) 796 @cfg1Out.add(cfgInfo[:DIRECTIVE]) 797 end 768 798 end 769 799 … … 780 810 #include "#{CFG1_OUT_TARGET_H}" 781 811 782 #if defined(SIL_ENDIAN_BIG) && defined(SIL_ENDIAN_LITTLE)783 #error Both SIL_ENDIAN_BIG and SIL_ENDIAN_LITTLE are defined.784 #endif785 #if !defined(SIL_ENDIAN_BIG) && !defined(SIL_ENDIAN_LITTLE)786 #error Neither SIL_ENDIAN_BIG nor SIL_ENDIAN_LITTLE is defined.787 #endif788 789 812 const uint32_t #{CFG1_MAGIC_NUM} = 0x12345678; 790 813 const uint32_t #{CFG1_SIZEOF_SIGNED} = sizeof(signed_t); 814 const uint32_t #{CFG1_SIZEOF_INTPTR} = sizeof(intptr_t); 815 const uint32_t #{CFG1_SIZEOF_CHARPTR} = sizeof(char *); 791 816 EOS 792 817 793 818 # 値取得シンボルの処理 794 819 $symbolValueTable.each do |symbolName, symbolData| 795 if symbolData.has_key?(:BOOL) || symbolData.has_key?(:SIGNED) 820 if symbolData.has_key?(:BOOL) 821 type = "signed_t" 822 elsif symbolData.has_key?(:INTPTR) 823 type = "uintptr_t" 824 elsif symbolData.has_key?(:SIGNED) 796 825 type = "signed_t" 797 826 else … … 825 854 $cfgFileInfo.each do |cfgInfo| 826 855 if cfgInfo.has_key?(:DIRECTIVE) 827 @cfg1Out.add2(cfgInfo[:DIRECTIVE]) 856 # 条件ディレクティブを出力 857 if cfgInfo[:DIRECTIVE] =~ /^#(ifdef|ifndef|if|endif|else|elif)\b/ 858 OutLineNumber(cfgInfo) 859 @cfg1Out.add2(cfgInfo[:DIRECTIVE]) 860 end 828 861 else 829 862 apiDef = $apiDefinition[cfgInfo[:APINAME]] … … 882 915 $cfgFileInfo = [] 883 916 $dependencyFiles = $configFileNames.dup 884 $includeFiles = []885 917 $domainId = { "TDOM_KERNEL" => -1, "TDOM_NONE" => -2 } 886 918 $configFileNames.each do |configFileName| … … 939 971 # パス2に引き渡す情報をファイルに生成 940 972 # 941 if $omitOutputDb.nil?973 if !$omitOutputDb 942 974 db = PStore.new(CFG1_OUT_DB) 943 975 db.transaction do … … 945 977 db[:symbolValueTable] = $symbolValueTable 946 978 db[:cfgFileInfo] = $cfgFileInfo 947 db[:includeFiles] = $includeFiles948 979 db[:domainId] = $domainId 949 980 end
Note:
See TracChangeset
for help on using the changeset viewer.