Class: Plugin
Overview
Plugin クラス
ThroughPlugin, SignaturePlugin, CelltypePlugin に include する
Direct Known Subclasses
CellPlugin, CelltypePlugin, CompositePlugin, DomainPlugin, SignaturePlugin, ThroughPlugin
Constant Summary collapse
- PluginArgProc =
- @error_backlog
- msg1, msg2, …
-
@locale が設定される前に発生したエラー
{ "silent" => Proc.new {|obj, rhs| obj.set_silent rhs }, }
Instance Method Summary collapse
-
#cdl_error(*arg) ⇒ Object
Plugin#cdl_error set_locale が呼び出されるまで @error_backlog に保存し保留する.
-
#check_plugin_arg(ident, rhs) ⇒ Object
プラグイン引数をチェックする 古い用法:子クラスでオーバーライドし、引数識別子が正しいかチェックする ident:: string: 引数識別子 rhs:: string: 右辺文字列.
-
#gen_cdl_file(file) ⇒ Object
- 意味解析段階で呼び出されるメソッド ### <<< コメント誤り (V1.4.2) === CDL ファイルの生成 typedef, signature, celltype, cell のコードを生成 重複して生成してはならない すでに生成されている場合は出力しないこと。 もしくは同名の import により、重複を避けること。 file
-
FILE 生成するファイル.
-
#gen_ep_func? ⇒ Boolean
プラグインは gen_ep_func を提供するか gen_ep_func 定義 ⇒ テンプレートではない、セルタイプコード(tCelltype.c)を生成 gen_ep_func 未定義 ⇒ テンプレート(tCelltype_templ.c)を生成.
-
#gen_postamble(file, b_singleton, ct_name, global_ct_name) ⇒ Object
受け口関数の postamble (C言語)を生成する 必要なら postamble 部に出力する gen_cdl_file の中で生成されたセルタイプに対して呼び出される file:: FILE 出力先ファイル b_singleton:: bool true if singleton ct_name:: Symbol global_ct_name:: string.
-
#gen_preamble(file, b_singleton, ct_name, global_ct_name) ⇒ Object
受け口関数の preamble (C言語)を生成する 必要なら preamble 部に出力する gen_cdl_file の中でで生成されたセルタイプに対して呼び出される file:: FILE 出力先ファイル b_singleton:: bool true if singleton ct_name:: Symbol global_ct_name:: string.
-
#initialize ⇒ Plugin
constructor
A new instance of Plugin.
-
#new_cell(cell) ⇒ Object
gen_cdl_file の中で生成されたセルタイプに新しいセルが生成された どのセルタイプかは cell.get_celltype で分かる.
-
#parse_plugin_arg ⇒ Object
プラグイン引数の解釈 ###.
-
#print_msg(msg) ⇒ Object
プラグインのメッセージ出力.
-
#set_locale(locale) ⇒ Object
locale を設定する Node は initialize で locale を設定するが、plugin は parse とは 異なるタイミング new されるため、locale を再設定する このメソッドを2度呼び出すと @error_backlog のエラーが2度出力されてしまう.
-
#set_silent(rhs) ⇒ Object
プラグイン引数 silent.
Methods inherited from Node
#cdl_error2, #cdl_error3, #cdl_info, #cdl_info2, #cdl_warning, #cdl_warning2, #get_locale, #locale_str
Constructor Details
#initialize ⇒ Plugin
Returns a new instance of Plugin.
48 49 50 51 52 53 |
# File 'lib/tecsgen/core/plugin.rb', line 48 def initialize super @b_silent = false @locale = nil # set_locale が呼び出されるまで nil となる @error_backlog = [] end |
Instance Method Details
#cdl_error(*arg) ⇒ Object
Plugin#cdl_error
set_locale が呼び出されるまで @error_backlog に保存し保留する
57 58 59 60 61 62 63 |
# File 'lib/tecsgen/core/plugin.rb', line 57 def cdl_error(*arg) if @locale Generator.error2(@locale, *arg) else @error_backlog << arg end end |
#check_plugin_arg(ident, rhs) ⇒ Object
プラグイン引数をチェックする
古い用法:子クラスでオーバーライドし、引数識別子が正しいかチェックする
- ident
-
string: 引数識別子
- rhs
-
string: 右辺文字列
248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 |
# File 'lib/tecsgen/core/plugin.rb', line 248 def check_plugin_arg(ident, rhs) dbgPrint "check_plugin_arg: #{ident} #{rhs.to_str}\n" proc = nil if @plugin_arg_check_proc_tab proc = @plugin_arg_check_proc_tab[ident.to_s] end if proc.nil? proc = PluginArgProc[ident.to_s] end if proc.instance_of? Proc dbgPrint "calling: #{self.class.name}.#{proc}\n" proc.call(self, rhs) else params = "" delim = "" @plugin_arg_check_proc_tab.each{|j, p| params = "#{params}#{delim}#{j}" delim = ", " } cdl_error("P1004 $1: unknown plugin argument\'s identifier\n $2 are acceptible for RPCPlugin.", ident, params) end end |
#gen_cdl_file(file) ⇒ Object
意味解析段階で呼び出されるメソッド ### <<< コメント誤り (V1.4.2)
CDL ファイルの生成
typedef, signature, celltype, cell のコードを生成
重複して生成してはならない
すでに生成されている場合は出力しないこと。
もしくは同名の import により、重複を避けること。
- file
-
FILE 生成するファイル
86 87 |
# File 'lib/tecsgen/core/plugin.rb', line 86 def gen_cdl_file(file) end |
#gen_ep_func? ⇒ Boolean
プラグインは gen_ep_func を提供するか
gen_ep_func 定義 ⇒ テンプレートではない、セルタイプコード(tCelltype.c)を生成 gen_ep_func 未定義 ⇒ テンプレート(tCelltype_templ.c)を生成
93 94 95 |
# File 'lib/tecsgen/core/plugin.rb', line 93 def gen_ep_func? self.class.method_defined?(:gen_ep_func_body) end |
#gen_postamble(file, b_singleton, ct_name, global_ct_name) ⇒ Object
受け口関数の postamble (C言語)を生成する
必要なら postamble 部に出力する
gen_cdl_file の中で生成されたセルタイプに対して呼び出される
- file
-
FILE 出力先ファイル
- b_singleton
-
bool true if singleton
- ct_name
-
Symbol
- global_ct_name
-
string
131 132 133 |
# File 'lib/tecsgen/core/plugin.rb', line 131 def gen_postamble(file, b_singleton, ct_name, global_ct_name) # デフォルトでは何も出力しない end |
#gen_preamble(file, b_singleton, ct_name, global_ct_name) ⇒ Object
受け口関数の preamble (C言語)を生成する
必要なら preamble 部に出力する
gen_cdl_file の中でで生成されたセルタイプに対して呼び出される
- file
-
FILE 出力先ファイル
- b_singleton
-
bool true if singleton
- ct_name
-
Symbol
- global_ct_name
-
string
120 121 122 |
# File 'lib/tecsgen/core/plugin.rb', line 120 def gen_preamble(file, b_singleton, ct_name, global_ct_name) # デフォルトでは何も出力しない end |
#new_cell(cell) ⇒ Object
gen_cdl_file の中で生成されたセルタイプに新しいセルが生成された
どのセルタイプかは cell.get_celltype で分かる
- file
-
FILE 出力先ファイル
- b_singleton
-
bool true if singleton
- ct_name
-
Symbol
- global_ct_name
-
string
142 143 144 |
# File 'lib/tecsgen/core/plugin.rb', line 142 def new_cell(cell) # デフォルトでは何もしない end |
#parse_plugin_arg ⇒ Object
プラグイン引数の解釈 ###
147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 |
# File 'lib/tecsgen/core/plugin.rb', line 147 def parse_plugin_arg arg = @plugin_arg_str.dup # 改行を消す arg.gsub!(/\\\n/, "") while arg != "" # 前の空白読み飛ばす arg.sub!(/\A\s*(?:\\\n)*\s*(.*)/, '\1') # 識別子取得 if arg =~ /\A[a-zA-Z_]\w*/ ident = $~ arg = $' else cdl_error("P1001 plugin arg: cannot find identifier in $1", arg) return end # 前の空白読み飛ばす arg.sub!(/\A\s*(?:\\\n)*\s*(.*)/, '\1') if arg =~ /=/ arg = $' else cdl_error("P1002 plugin arg: expecting \'=\' not \'$1\'", arg) return end # 前の空白読み飛ばす arg.sub!(/\A\s*(?:\\\n)*\s*(.*)/, '\1') # 右辺文字列 if arg =~ /\A\\"(.*?)\\"\s*,/ # \" \" で囲まれている場合 rhs = $1 remain = $' elsif arg =~ /\A%(.*?)%\s*,/ # % % で囲まれている場合 rhs = $1 remain = $' elsif arg =~ /\A!(.*?)!\s*,/ # $ $ で囲まれている場合 rhs = $1 remain = $' elsif arg =~ /\A'(.*?)'\s*,/ # $ $ で囲まれている場合 rhs = $1 remain = $' elsif arg =~ /\A\\"(.*?)\\"\s*,/ # || にも [,$] にもできなかった rhs = $1 remain = $' # elsif arg =~ /\A(.*?)\s*$/ then elsif arg =~ /\A\\"(.*?)\\"\s*\z/ # \" \" で囲まれている場合 rhs = $1 remain = $' elsif arg =~ /\A%(.*?)%\s*\z/ # % % で囲まれている場合 rhs = $1 remain = $' elsif arg =~ /\A!(.*?)!\s*\z/ # $ $ で囲まれている場合 rhs = $1 remain = $' elsif arg =~ /\A'(.*?)'\s*\z/ # $ $ で囲まれている場合 rhs = $1 remain = $' elsif arg =~ /\A\\"(.*?)\\"\s*\z/ # || にも [,$] にもできなかった rhs = $1 remain = $' elsif arg =~ /\A(.*?),/ rhs = $1 remain = $' # 前の空白読み飛ばす rhs.sub!(/\A\s*(.*)\s*\z/, '\1') elsif arg =~ /\A(.*?)\s*\z/ rhs = $1 remain = $' else cdl_error("P1003 plugin arg: unexpected $1", arg) return end # 0文字の文字列を to_sym すると例外発生するので空白文字とする if rhs == "" rhs = " " end arg = remain # arg の残りの部分 arg.sub!(/\A\s*(?:\\\n)*\s*(.*)/, '\1') # 前の空白読み飛ばす # \ を外す rhs = rhs.gsub(/\\(.)/, "\\1") # ここで $' が変わることに注意! # print "parse_plugin_arg: #{ident} #{rhs}\n" @plugin_arg_list[ident] = rhs check_plugin_arg(ident, rhs) end # @plugin_arg_list.each{|i,r| print "ident: #{i} rhs: #{r}\n" } end |
#print_msg(msg) ⇒ Object
プラグインのメッセージ出力
272 273 274 275 276 277 |
# File 'lib/tecsgen/core/plugin.rb', line 272 def print_msg(msg) if @b_silent == true return end print msg end |
#set_locale(locale) ⇒ Object
locale を設定する
Node は initialize で locale を設定するが、plugin は parse とは 異なるタイミング new されるため、locale を再設定する このメソッドを2度呼び出すと @error_backlog のエラーが2度出力されてしまう
69 70 71 72 73 74 |
# File 'lib/tecsgen/core/plugin.rb', line 69 def set_locale(locale) @locale = locale @error_backlog.each {|arg| Generator.error2(locale, *arg) } end |
#set_silent(rhs) ⇒ Object
プラグイン引数 silent
280 281 282 283 284 |
# File 'lib/tecsgen/core/plugin.rb', line 280 def set_silent(rhs) if rhs == "true" || rhs.nil? @b_silent = true end end |