Class: Plugin

Inherits:
Node show all
Defined in:
lib/tecsgen/core/plugin.rb

Overview

Plugin クラス

ThroughPlugin, SignaturePlugin, CelltypePlugin に include する

Constant Summary collapse

PluginArgProc =
@error_backlog
msg1, msg2, …

@locale が設定される前に発生したエラー

{
  "silent" => Proc.new {|obj, rhs| obj.set_silent rhs },
}

Instance Method Summary collapse

Methods inherited from Node

#cdl_error2, #cdl_error3, #cdl_info, #cdl_info2, #cdl_warning, #cdl_warning2, #get_locale, #locale_str

Constructor Details

#initializePlugin

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)を生成

Returns:

  • (Boolean)


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_argObject

プラグイン引数の解釈 ###



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

プラグインのメッセージ出力



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