Changeset 318 for asp3_gr_sakura/trunk/tecsgen/tecslib/core/plugin.rb
- Timestamp:
- Aug 3, 2017, 10:46:41 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_gr_sakura/trunk/tecsgen/tecslib/core/plugin.rb
-
Property svn:mime-type
changed from
text/x-ruby
totext/x-ruby; charset=UTF-8
r317 r318 6 6 # Copyright (C) 2008-2014 by TOPPERS Project 7 7 #-- 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 # 免責すること. 44 30 # 45 # æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 46 ã 47 # ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 48 # ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 49 # ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 50 # ã®è²¬ä»»ãè² ããªãï¼ 31 # 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 32 # よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 33 # に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 34 # アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 35 # の責任を負わない. 51 36 # 52 # $Id : plugin.rb 2061 2014-05-31 22:15:33Z okuma-top$37 # $Id$ 53 38 #++ 54 39 55 #== class ã¢ã¸ã¥ã¼ã«56 # ThroughPlugin, SignaturePlugin, CelltypePlugin ã« include ãã40 #== class モジュール 41 # ThroughPlugin, SignaturePlugin, CelltypePlugin に include する 57 42 class Plugin < Node 58 #@error_backlog:: [msg1, msg2, ... ] @locale ãè¨å®ãããåã«çºçããã¨ã©ã¼43 #@error_backlog:: [msg1, msg2, ... ] @locale が設定される前に発生したエラー 59 44 60 45 PluginArgProc = { … … 65 50 super 66 51 @b_silent = false 67 @locale = nil # set_locale ãå¼ã³åºãããã¾ã§ nil ã¨ãªã52 @locale = nil # set_locale が呼び出されるまで nil となる 68 53 @error_backlog = [] 69 54 end 70 55 71 56 #=== Plugin#cdl_error 72 # set_locale ãå¼ã³åºãããã¾ã§ @error_backlog ã«ä¿åãä¿çãã57 # set_locale が呼び出されるまで @error_backlog に保存し保留する 73 58 def cdl_error *arg 74 59 if @locale then … … 79 64 end 80 65 81 #=== locale ãè¨å®ãã82 # Node 㯠initialize 㧠locale ãè¨å®ããããplugin 㯠parse ã¨ã¯83 # ç°ãªãã¿ã¤ãã³ã° new ããããããlocale ãåè¨å®ãã84 # ãã®ã¡ã½ããã2度å¼ã³åºã㨠@error_backlog ã®ã¨ã©ã¼ã2度åºåããã¦ãã¾ã66 #=== locale を設定する 67 # Node は initialize で locale を設定するが、plugin は parse とは 68 # 異なるタイミング new されるため、locale を再設定する 69 # このメソッドを2度呼び出すと @error_backlog のエラーが2度出力されてしまう 85 70 def set_locale locale 86 71 @locale = locale … … 90 75 end 91 76 92 ### æå³è§£æ段éã§å¼ã³åºãããã¡ã½ãã###93 #=== CDL ãã¡ã¤ã«ã®çæ94 # typedef, signature, celltype, cell ã®ã³ã¼ããçæ95 # éè¤ãã¦çæãã¦ã¯ãªããªã96 # ãã§ã«çæããã¦ããå ´åã¯åºåããªããã¨ã97 # ãããã¯ååã® import ã«ãããéè¤ãé¿ãããã¨ã98 #file:: FILE çæãããã¡ã¤ã«77 ### 意味解析段階で呼び出されるメソッド ### 78 #=== CDL ファイルの生成 79 # typedef, signature, celltype, cell のコードを生成 80 # 重複して生成してはならない 81 # すでに生成されている場合は出力しないこと。 82 # もしくは同名の import により、重複を避けること。 83 #file:: FILE 生成するファイル 99 84 def gen_cdl_file file 100 85 end 101 86 102 87 103 ### ã³ã¼ãç段éã§å¼ã³åºãããã¡ã½ãã###104 #=== ãã©ã°ã¤ã³ã¯ gen_ep_func ãæä¾ããã105 # gen_ep_func å®ç¾© â ãã³ãã¬ã¼ãã§ã¯ãªããã»ã«ã¿ã¤ãã³ã¼ã(tCelltype.c)ãçæ106 # gen_ep_func æªå®ç¾© â ãã³ãã¬ã¼ã(tCelltype_templ.c)ãçæ88 ### コード生段階で呼び出されるメソッド ### 89 #=== プラグインは gen_ep_func を提供するか 90 # gen_ep_func 定義 ⇒ テンプレートではない、セルタイプコード(tCelltype.c)を生成 91 # gen_ep_func 未定義 ⇒ テンプレート(tCelltype_templ.c)を生成 107 92 def gen_ep_func? 108 93 self.class.method_defined?( :gen_ep_func_body ) 109 94 end 110 95 111 #=== åãå£é¢æ°ã®æ¬ä½(Cè¨èª)ãçæãã 112 # ãã©ã°ã¤ã³ã®å ´åãå¤æ´ããå¿ 113 è¦ã®ãªãã»ã«ã¿ã¤ãã³ã¼ããçæãã 114 # ãã®ã¡ã½ãããæªå®ç¾©ã§ããã°ããã©ã°ã¤ã³ã¯ã»ã«ã¿ã¤ãã³ã¼ããçæããªã (é常éããã³ãã¬ã¼ããçæãã) 115 # gen_cdl_file ã®ä¸ã§çæãããã»ã«ã¿ã¤ãã«å¯¾ãã¦å¼ã³åºããã 116 #file:: FILE åºåå 117 ãã¡ã¤ã« (tCelltype.c) 96 #=== 受け口関数の本体(C言語)を生成する 97 # プラグインの場合、変更する必要のないセルタイプコードを生成する 98 # このメソッドが未定義であれば、プラグインはセルタイプコードを生成しない (通常通りテンプレートを生成する) 99 # gen_cdl_file の中で生成されたセルタイプに対して呼び出される 100 #file:: FILE 出力先ファイル (tCelltype.c) 118 101 #b_singleton:: bool true if singleton 119 102 #ct_name:: Symbol … … 127 110 # end 128 111 129 #=== åãå£é¢æ°ã® preamble (Cè¨èª)ãçæãã 130 # å¿ 131 è¦ãªã preamble é¨ã«åºåãã 132 # gen_cdl_file ã®ä¸ã§ã§çæãããã»ã«ã¿ã¤ãã«å¯¾ãã¦å¼ã³åºããã 133 #file:: FILE åºåå 134 ãã¡ã¤ã« 112 #=== 受け口関数の preamble (C言語)を生成する 113 # 必要なら preamble 部に出力する 114 # gen_cdl_file の中でで生成されたセルタイプに対して呼び出される 115 #file:: FILE 出力先ファイル 135 116 #b_singleton:: bool true if singleton 136 117 #ct_name:: Symbol 137 118 #global_ct_name:: string 138 119 def gen_preamble( file, b_singleton, ct_name, global_ct_name ) 139 # ããã©ã«ãã§ã¯ä½ãåºåããªã 140 end 141 142 #=== åãå£é¢æ°ã® postamble (Cè¨èª)ãçæãã 143 # å¿ 144 è¦ãªã postamble é¨ã«åºåãã 145 # gen_cdl_file ã®ä¸ã§çæãããã»ã«ã¿ã¤ãã«å¯¾ãã¦å¼ã³åºããã 146 #file:: FILE åºåå 147 ãã¡ã¤ã« 120 # デフォルトでは何も出力しない 121 end 122 123 #=== 受け口関数の postamble (C言語)を生成する 124 # 必要なら postamble 部に出力する 125 # gen_cdl_file の中で生成されたセルタイプに対して呼び出される 126 #file:: FILE 出力先ファイル 148 127 #b_singleton:: bool true if singleton 149 128 #ct_name:: Symbol 150 129 #global_ct_name:: string 151 130 def gen_postamble( file, b_singleton, ct_name, global_ct_name ) 152 # ããã©ã«ãã§ã¯ä½ãåºåããªã153 end 154 155 #=== gen_cdl_file ã®ä¸ã§çæãããã»ã«ã¿ã¤ãã«æ°ããã»ã«ãçæããã156 # ã©ã®ã»ã«ã¿ã¤ãã㯠cell.get_celltype ã§åãã131 # デフォルトでは何も出力しない 132 end 133 134 #=== gen_cdl_file の中で生成されたセルタイプに新しいセルが生成された 135 # どのセルタイプかは cell.get_celltype で分かる 157 136 # 158 #file:: FILE åºåå 159 ãã¡ã¤ã« 137 #file:: FILE 出力先ファイル 160 138 #b_singleton:: bool true if singleton 161 139 #ct_name:: Symbol 162 140 #global_ct_name:: string 163 141 def new_cell cell 164 # ããã©ã«ãã§ã¯ä½ãããªã165 end 166 167 ### ãã©ã°ã¤ã³å¼æ°ã®è§£é###142 # デフォルトでは何もしない 143 end 144 145 ### プラグイン引数の解釈 ### 168 146 def parse_plugin_arg 169 147 arg = @plugin_arg_str.dup 170 148 171 # æ¹è¡ãæ¶ã149 # 改行を消す 172 150 arg.gsub!( /\\\n/, "" ) 173 151 174 152 while arg != "" 175 153 176 # åã®ç©ºç½èªã¿é£ã°ã154 # 前の空白読み飛ばす 177 155 arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1') 178 156 179 # èå¥ååå¾157 # 識別子取得 180 158 if arg =~ /\A[a-zA-Z_]\w*/ then 181 159 ident = $~ … … 186 164 end 187 165 188 # åã®ç©ºç½èªã¿é£ã°ã166 # 前の空白読み飛ばす 189 167 arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1') 190 168 … … 196 174 end 197 175 198 # åã®ç©ºç½èªã¿é£ã°ã176 # 前の空白読み飛ばす 199 177 arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1') 200 178 201 # å³è¾ºæåå202 if arg =~ /\A\\"(.*?)\\"\s*,/ then # \" \" ã§å²ã¾ãã¦ããå ´å203 rhs = $1 204 remain = $' 205 elsif arg =~ /\A%(.*?)%\s*,/ then # % % ã§å²ã¾ãã¦ããå ´å206 rhs = $1 207 remain = $' 208 elsif arg =~ /\A!(.*?)!\s*,/ then # $ $ ã§å²ã¾ãã¦ããå ´å209 rhs = $1 210 remain = $' 211 elsif arg =~ /\A'(.*?)'\s*,/ then # $ $ ã§å²ã¾ãã¦ããå ´å212 rhs = $1 213 remain = $' 214 elsif arg =~ /\A\\"(.*?)\\"\s*,/ then # || ã«ã [,$] ã«ãã§ããªãã£ã179 # 右辺文字列 180 if arg =~ /\A\\"(.*?)\\"\s*,/ then # \" \" で囲まれている場合 181 rhs = $1 182 remain = $' 183 elsif arg =~ /\A%(.*?)%\s*,/ then # % % で囲まれている場合 184 rhs = $1 185 remain = $' 186 elsif arg =~ /\A!(.*?)!\s*,/ then # $ $ で囲まれている場合 187 rhs = $1 188 remain = $' 189 elsif arg =~ /\A'(.*?)'\s*,/ then # $ $ で囲まれている場合 190 rhs = $1 191 remain = $' 192 elsif arg =~ /\A\\"(.*?)\\"\s*,/ then # || にも [,$] にもできなかった 215 193 rhs = $1 216 194 remain = $' 217 195 # elsif arg =~ /\A(.*?)\s*$/ then 218 elsif arg =~ /\A\\"(.*?)\\"\s*\z/ then # \" \" ã§å²ã¾ãã¦ããå ´å219 rhs = $1 220 remain = $' 221 elsif arg =~ /\A%(.*?)%\s*\z/ then # % % ã§å²ã¾ãã¦ããå ´å222 rhs = $1 223 remain = $' 224 elsif arg =~ /\A!(.*?)!\s*\z/ then # $ $ ã§å²ã¾ãã¦ããå ´å225 rhs = $1 226 remain = $' 227 elsif arg =~ /\A'(.*?)'\s*\z/ then # $ $ ã§å²ã¾ãã¦ããå ´å228 rhs = $1 229 remain = $' 230 elsif arg =~ /\A\\"(.*?)\\"\s*\z/ then # || ã«ã [,$] ã«ãã§ããªãã£ã196 elsif arg =~ /\A\\"(.*?)\\"\s*\z/ then # \" \" で囲まれている場合 197 rhs = $1 198 remain = $' 199 elsif arg =~ /\A%(.*?)%\s*\z/ then # % % で囲まれている場合 200 rhs = $1 201 remain = $' 202 elsif arg =~ /\A!(.*?)!\s*\z/ then # $ $ で囲まれている場合 203 rhs = $1 204 remain = $' 205 elsif arg =~ /\A'(.*?)'\s*\z/ then # $ $ で囲まれている場合 206 rhs = $1 207 remain = $' 208 elsif arg =~ /\A\\"(.*?)\\"\s*\z/ then # || にも [,$] にもできなかった 231 209 rhs = $1 232 210 remain = $' … … 234 212 rhs = $1 235 213 remain = $' 236 # åã®ç©ºç½èªã¿é£ã°ã214 # 前の空白読み飛ばす 237 215 rhs.sub!( /\A\s*(.*)\s*\z/, '\1') 238 216 elsif arg =~ /\A(.*?)\s*\z/ then … … 244 222 end 245 223 246 # 0 æåã®æååã to_sym ããã¨ä¾å¤çºçããã®ã§ç©ºç½æåã¨ãã224 # 0文字の文字列を to_sym すると例外発生するので空白文字とする 247 225 if rhs == "" then 248 226 rhs = " " 249 227 end 250 228 251 arg = remain # arg ã®æ®ãã®é¨å252 arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1') # åã®ç©ºç½èªã¿é£ã°ã253 254 # \ ãå¤ã255 rhs = rhs.gsub( /\\(.)/, "\\1" ) # ãã㧠$' ãå¤ãããã¨ã«æ³¨æï¼229 arg = remain # arg の残りの部分 230 arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1') # 前の空白読み飛ばす 231 232 # \ を外す 233 rhs = rhs.gsub( /\\(.)/, "\\1" ) # ここで $' が変わることに注意! 256 234 # print "parse_plugin_arg: #{ident} #{rhs}\n" 257 235 @plugin_arg_list[ ident ] = rhs … … 262 240 end 263 241 264 #=== ãã©ã°ã¤ã³å¼æ°ããã§ãã¯ãã265 # @plugin_arg_check_proc_tab ã«å¾ã£ã¦ãã©ã°ã¤ã³å¼æ°ããã§ãã¯ããã266 # å¤ãç¨æ³ï¼åã¯ã©ã¹ã§ãªã¼ãã¼ã©ã¤ãããå¼æ°èå¥åãæ£ããããã§ãã¯ãã267 #ident:: string: å¼æ°èå¥å268 #rhs:: string: å³è¾ºæåå242 #=== プラグイン引数をチェックする 243 # @plugin_arg_check_proc_tab に従ってプラグイン引数をチェックすする 244 # 古い用法:子クラスでオーバーライドし、引数識別子が正しいかチェックする 245 #ident:: string: 引数識別子 246 #rhs:: string: 右辺文字列 269 247 def check_plugin_arg( ident, rhs ) 270 248 … … 291 269 end 292 270 293 #=== ãã©ã°ã¤ã³ã®ã¡ãã»ã¼ã¸åºå271 #=== プラグインのメッセージ出力 294 272 def print_msg( msg ) 295 273 if @b_silent == true then … … 299 277 end 300 278 301 #=== ãã©ã°ã¤ã³å¼æ°silent279 #=== プラグイン引数 silent 302 280 def set_silent rhs 303 281 if rhs == "true" || rhs == nil then … … 307 285 end 308 286 309 #== åºåæååã EUC ããåºåãã¡ã¤ã«ã« convert ãã310 # tecsgen ã®ã½ã¼ã¹ã³ã¼ã㯠EUC ã§è¨è¿°ããã¦ãã311 # ããããåºåãã¡ã¤ã«ã®æåã³ã¼ãã«å¤æãã¦åºåãã287 #== 出力文字列を EUC から出力ファイルに convert する 288 # tecsgen のソースコードは EUC で記述されている 289 # これを、出力ファイルの文字コードに変換して出力する 312 290 # 313 # generate.rb ã§åºåãããã®ã¯ message.rb ã§å¤æãã¦ãã314 # generate.rb ã§åºåãããã®ã¯ APPFile ã¯ã©ã¹ã使ç¨ãã¦ãã315 # mikan: CFile ã§åºåãããã®ã« factory ã§è¿½è¨ã§ããªã (cdl ãã¡ã¤ã«ã®å ´åã追è¨ã§ãã¦ãæå³ããªã)291 # generate.rb で出力するものは message.rb で変換している 292 # generate.rb で出力するものは APPFile クラスを使用している 293 # mikan: CFile で出力したものに factory で追記できない (cdl ファイルの場合、追記できても意味がない) 316 294 class CFile 317 295 def self.open( path, mode ) -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.