- Timestamp:
- May 22, 2019, 10:03:37 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
azure_iot_hub/trunk/asp3_dcre/tecsgen/tecslib/core/plugin.rb
-
Property svn:mime-type
changed from
text/x-ruby
totext/x-ruby;charset=UTF-8
r388 r389 6 6 # Copyright (C) 2008-2017 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 37 # $Id$ 53 38 #++ 54 39 55 #== Plugin ã¯ã©ã¹56 # ThroughPlugin, SignaturePlugin, CelltypePlugin ã« include ãã40 #== Plugin クラス 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 # generate æå®åã®å ´åãæ§æ解é次第(end_of_parseã§)å¼ã³åºããã94 # generate æã®å ´åãåºç¾æ¬¡ç¬¬å¼ã³åºããã95 ### æå³è§£æ段éã§å¼ã³åºãããã¡ã½ãã ### <<< ã³ã¡ã³ã誤ã(V1.4.2)96 #=== CDL ãã¡ã¤ã«ã®çæ97 # typedef, signature, celltype, cell ã®ã³ã¼ããçæ98 # éè¤ãã¦çæãã¦ã¯ãªããªã99 # ãã§ã«çæããã¦ããå ´åã¯åºåããªããã¨ã100 # ãããã¯ååã® import ã«ãããéè¤ãé¿ãããã¨ã101 #file:: FILE çæãããã¡ã¤ã«77 ### 構文解釈 または 意味解析段階で呼び出されるメソッド ### 78 # generate 指定子の場合、構文解釈次第(end_of_parseで)呼び出される 79 # generate 文の場合、出現次第呼び出される 80 ### 意味解析段階で呼び出されるメソッド ### <<< コメント誤り (V1.4.2) 81 #=== CDL ファイルの生成 82 # typedef, signature, celltype, cell のコードを生成 83 # 重複して生成してはならない 84 # すでに生成されている場合は出力しないこと。 85 # もしくは同名の import により、重複を避けること。 86 #file:: FILE 生成するファイル 102 87 def gen_cdl_file file 103 88 end 104 89 105 90 106 ### ã³ã¼ãç段éã§å¼ã³åºãããã¡ã½ãã###107 #=== ãã©ã°ã¤ã³ã¯ gen_ep_func ãæä¾ããã108 # gen_ep_func å®ç¾© â ãã³ãã¬ã¼ãã§ã¯ãªããã»ã«ã¿ã¤ãã³ã¼ã(tCelltype.c)ãçæ109 # gen_ep_func æªå®ç¾© â ãã³ãã¬ã¼ã(tCelltype_templ.c)ãçæ91 ### コード生段階で呼び出されるメソッド ### 92 #=== プラグインは gen_ep_func を提供するか 93 # gen_ep_func 定義 ⇒ テンプレートではない、セルタイプコード(tCelltype.c)を生成 94 # gen_ep_func 未定義 ⇒ テンプレート(tCelltype_templ.c)を生成 110 95 def gen_ep_func? 111 96 self.class.method_defined?( :gen_ep_func_body ) 112 97 end 113 98 114 #=== åãå£é¢æ°ã®æ¬ä½(Cè¨èª)ãçæãã 115 # ãã©ã°ã¤ã³ã®å ´åãå¤æ´ããå¿ 116 è¦ã®ãªãã»ã«ã¿ã¤ãã³ã¼ããçæãã 117 # ãã®ã¡ã½ãããæªå®ç¾©ã§ããã°ããã©ã°ã¤ã³ã¯ã»ã«ã¿ã¤ãã³ã¼ããçæããªã (é常éããã³ãã¬ã¼ããçæãã) 118 # gen_cdl_file ã®ä¸ã§çæãããã»ã«ã¿ã¤ãã«å¯¾ãã¦å¼ã³åºããã 119 #file:: FILE åºåå 120 ãã¡ã¤ã« (tCelltype.c) 99 #=== 受け口関数の本体(C言語)を生成する 100 # プラグインの場合、変更する必要のないセルタイプコードを生成する 101 # このメソッドが未定義であれば、プラグインはセルタイプコードを生成しない (通常通りテンプレートを生成する) 102 # gen_cdl_file の中で生成されたセルタイプに対して呼び出される 103 #file:: FILE 出力先ファイル (tCelltype.c) 121 104 #b_singleton:: bool true if singleton 122 105 #ct_name:: Symbol … … 130 113 # end 131 114 132 #=== åãå£é¢æ°ã® preamble (Cè¨èª)ãçæãã 133 # å¿ 134 è¦ãªã preamble é¨ã«åºåãã 135 # gen_cdl_file ã®ä¸ã§ã§çæãããã»ã«ã¿ã¤ãã«å¯¾ãã¦å¼ã³åºããã 136 #file:: FILE åºåå 137 ãã¡ã¤ã« 115 #=== 受け口関数の preamble (C言語)を生成する 116 # 必要なら preamble 部に出力する 117 # gen_cdl_file の中でで生成されたセルタイプに対して呼び出される 118 #file:: FILE 出力先ファイル 138 119 #b_singleton:: bool true if singleton 139 120 #ct_name:: Symbol 140 121 #global_ct_name:: string 141 122 def gen_preamble( file, b_singleton, ct_name, global_ct_name ) 142 # ããã©ã«ãã§ã¯ä½ãåºåããªã 143 end 144 145 #=== åãå£é¢æ°ã® postamble (Cè¨èª)ãçæãã 146 # å¿ 147 è¦ãªã postamble é¨ã«åºåãã 148 # gen_cdl_file ã®ä¸ã§çæãããã»ã«ã¿ã¤ãã«å¯¾ãã¦å¼ã³åºããã 149 #file:: FILE åºåå 150 ãã¡ã¤ã« 123 # デフォルトでは何も出力しない 124 end 125 126 #=== 受け口関数の postamble (C言語)を生成する 127 # 必要なら postamble 部に出力する 128 # gen_cdl_file の中で生成されたセルタイプに対して呼び出される 129 #file:: FILE 出力先ファイル 151 130 #b_singleton:: bool true if singleton 152 131 #ct_name:: Symbol 153 132 #global_ct_name:: string 154 133 def gen_postamble( file, b_singleton, ct_name, global_ct_name ) 155 # ããã©ã«ãã§ã¯ä½ãåºåããªã156 end 157 158 #=== gen_cdl_file ã®ä¸ã§çæãããã»ã«ã¿ã¤ãã«æ°ããã»ã«ãçæããã159 # ã©ã®ã»ã«ã¿ã¤ãã㯠cell.get_celltype ã§åãã134 # デフォルトでは何も出力しない 135 end 136 137 #=== gen_cdl_file の中で生成されたセルタイプに新しいセルが生成された 138 # どのセルタイプかは cell.get_celltype で分かる 160 139 # 161 #file:: FILE åºåå 162 ãã¡ã¤ã« 140 #file:: FILE 出力先ファイル 163 141 #b_singleton:: bool true if singleton 164 142 #ct_name:: Symbol 165 143 #global_ct_name:: string 166 144 def new_cell cell 167 # ããã©ã«ãã§ã¯ä½ãããªã168 end 169 170 ### ãã©ã°ã¤ã³å¼æ°ã®è§£é###145 # デフォルトでは何もしない 146 end 147 148 ### プラグイン引数の解釈 ### 171 149 def parse_plugin_arg 172 150 arg = @plugin_arg_str.dup 173 151 174 # æ¹è¡ãæ¶ã152 # 改行を消す 175 153 arg.gsub!( /\\\n/, "" ) 176 154 177 155 while arg != "" 178 156 179 # åã®ç©ºç½èªã¿é£ã°ã157 # 前の空白読み飛ばす 180 158 arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1') 181 159 182 # èå¥ååå¾160 # 識別子取得 183 161 if arg =~ /\A[a-zA-Z_]\w*/ then 184 162 ident = $~.to_s # … … 189 167 end 190 168 191 # åã®ç©ºç½èªã¿é£ã°ã169 # 前の空白読み飛ばす 192 170 arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1') 193 171 … … 199 177 end 200 178 201 # åã®ç©ºç½èªã¿é£ã°ã179 # 前の空白読み飛ばす 202 180 arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1') 203 181 204 # å³è¾ºæåå205 if 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 # $ $ ã§å²ã¾ãã¦ããå ´å215 rhs = $1 216 remain = $' 217 elsif arg =~ /\A\\"(.*?)\\"\s*,/ then # || ã«ã [,$] ã«ãã§ããªãã£ã182 # 右辺文字列 183 if 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 # $ $ で囲まれている場合 193 rhs = $1 194 remain = $' 195 elsif arg =~ /\A\\"(.*?)\\"\s*,/ then # || にも [,$] にもできなかった 218 196 rhs = $1 219 197 remain = $' 220 198 # elsif arg =~ /\A(.*?)\s*$/ then 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 # $ $ ã§å²ã¾ãã¦ããå ´å231 rhs = $1 232 remain = $' 233 elsif arg =~ /\A\\"(.*?)\\"\s*\z/ then # || ã«ã [,$] ã«ãã§ããªãã£ã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 # $ $ で囲まれている場合 209 rhs = $1 210 remain = $' 211 elsif arg =~ /\A\\"(.*?)\\"\s*\z/ then # || にも [,$] にもできなかった 234 212 rhs = $1 235 213 remain = $' … … 237 215 rhs = $1 238 216 remain = $' 239 # åã®ç©ºç½èªã¿é£ã°ã217 # 前の空白読み飛ばす 240 218 rhs.sub!( /\A\s*(.*)\s*\z/, '\1') 241 219 elsif arg =~ /\A(.*?)\s*\z/ then … … 247 225 end 248 226 249 # 0 æåã®æååã to_sym ããã¨ä¾å¤çºçããã®ã§ç©ºç½æåã¨ãã227 # 0文字の文字列を to_sym すると例外発生するので空白文字とする 250 228 if rhs == "" then 251 229 rhs = " " 252 230 end 253 231 254 arg = remain # arg ã®æ®ãã®é¨å255 arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1') # åã®ç©ºç½èªã¿é£ã°ã256 257 # \ ãå¤ã258 rhs = rhs.gsub( /\\(.)/, "\\1" ) # ãã㧠$' ãå¤ãããã¨ã«æ³¨æï¼232 arg = remain # arg の残りの部分 233 arg.sub!( /\A\s*(?:\\\n)*\s*(.*)/, '\1') # 前の空白読み飛ばす 234 235 # \ を外す 236 rhs = rhs.gsub( /\\(.)/, "\\1" ) # ここで $' が変わることに注意! 259 237 # print "parse_plugin_arg: #{ident} #{rhs}\n" 260 238 @plugin_arg_list[ ident ] = rhs … … 265 243 end 266 244 267 #=== ãã©ã°ã¤ã³å¼æ°ããã§ãã¯ãã268 # @plugin_arg_check_proc_tab ã«å¾ã£ã¦ãã©ã°ã¤ã³å¼æ°ããã§ãã¯ããã269 # å¤ãç¨æ³ï¼åã¯ã©ã¹ã§ãªã¼ãã¼ã©ã¤ãããå¼æ°èå¥åãæ£ããããã§ãã¯ãã270 #ident:: string: å¼æ°èå¥å271 #rhs:: string: å³è¾ºæåå245 #=== プラグイン引数をチェックする 246 # @plugin_arg_check_proc_tab に従ってプラグイン引数をチェックすする 247 # 古い用法:子クラスでオーバーライドし、引数識別子が正しいかチェックする 248 #ident:: string: 引数識別子 249 #rhs:: string: 右辺文字列 272 250 def check_plugin_arg( ident, rhs ) 273 251 … … 294 272 end 295 273 296 #=== ãã©ã°ã¤ã³ã®ã¡ãã»ã¼ã¸åºå274 #=== プラグインのメッセージ出力 297 275 def print_msg( msg ) 298 276 if @b_silent == true then … … 302 280 end 303 281 304 #=== ãã©ã°ã¤ã³å¼æ°silent282 #=== プラグイン引数 silent 305 283 def set_silent rhs 306 284 if rhs == "true" || rhs == nil then … … 310 288 end 311 289 312 #== åºåæååã utf-8 ããåºåãã¡ã¤ã«ã« convert ãã313 # tecsgen ã®ã½ã¼ã¹ã³ã¼ã㯠utf-8 ã§è¨è¿°ããã¦ãã314 # ããããåºåãã¡ã¤ã«ã®æåã³ã¼ãã«å¤æãã¦åºåãã290 #== 出力文字列を utf-8 から出力ファイルに convert する 291 # tecsgen のソースコードは utf-8 で記述されている 292 # これを、出力ファイルの文字コードに変換して出力する 315 293 # 316 # generate.rb ã§åºåãããã®ã¯ message.rb ã§å¤æãã¦ãã317 # generate.rb ã§åºåãããã®ã¯ APPFile ã¯ã©ã¹ã使ç¨ãã¦ãã318 # mikan: CFile ã§åºåãããã®ã« factory ã§è¿½è¨ã§ããªã (cdl ãã¡ã¤ã«ã®å ´åã追è¨ã§ãã¦ãæå³ããªã)294 # generate.rb で出力するものは message.rb で変換している 295 # generate.rb で出力するものは APPFile クラスを使用している 296 # mikan: CFile で出力したものに factory で追記できない (cdl ファイルの場合、追記できても意味がない) 319 297 class CFile 320 298 def self.open( path, mode ) -
Property svn:mime-type
changed from
Note:
See TracChangeset
for help on using the changeset viewer.