1# -*- mode: ruby; coding: us-ascii -*-
2firstline, predefined = __LINE__+1, %[\
14 method_missing MethodMissing
16 singleton_method_added
18 singleton_method_removed
20 singleton_method_undefined
90 respond_to? Respond_to
91 respond_to_missing? Respond_to_missing
95 core#set_variable_alias
98 core#define_singleton_method
102 core#hash_merge_bang_ptr
104 core#hash_merge_bang_kwd
118# VM ID OP Parser Token
156class KeywordError < RuntimeError
157 def self.raise(mesg, line)
158 super(self, mesg, ["#{__FILE__}:#{line}", *caller])
162def id2varname(token, prefix = nil)
164 token = "_#{token.gsub(/\W+/, '_')}"
166 token = token.sub(/\?/, 'P')
167 token = prefix + token if prefix
168 token.sub!(/\A[a-z]/) {$&.upcase}
169 token.sub!(/\A\$/, "_G_")
170 token.sub!(/\A@@/, "_C_")
171 token.sub!(/\A@/, "_I_")
172 token.gsub!(/\W+/, "")
187predefined.split(/^/).each_with_index do |line, num|
189 line.sub!(/\s+#.*/, '')
190 name, token = line.split
192 token = id2varname(token || name)
194 preserved_ids << token
197 if prev = names[name]
198 KeywordError.raise("#{name} is already registered at line #{prev+firstline}", firstline+num)
200 if prev = predefined_ids[token]
201 KeywordError.raise("#{token} is already used for #{prev} at line #{names[prev]+firstline}", firstline+num)
205 when /\A[A-Z]\w*\z/; const_ids
206 when /\A(?!\d)\w+\z/; local_ids
207 when /\A\$(?:\d+|(?!\d)\w+|\W)\z/; global_ids
208 when /\A@@(?!\d)\w+\z/; class_ids
209 when /\A@(?!\d)\w+\z/; instance_ids
210 when /\A((?!\d)\w+)=\z/; attrset_ids
213 predefined_ids[token] = name
216token_ops.split(/^/).each do |line|
218 line.sub!(/\s+#.*/, '')
219 id, op, token = line.split
220 next unless id and op
221 token ||= (id unless /\A\W\z/ =~ op)
222 token_op_ids << [id, op, token, (index += 1 if token)]
225 "LOCAL" => local_ids,
226 "INSTANCE" => instance_ids,
227 "GLOBAL" => global_ids,
228 "CONST" => const_ids,
229 "CLASS" => class_ids,
230 "ATTRSET" => attrset_ids,
231 :preserved => preserved_ids,
232 :predefined => predefined_ids,
233 :token_op => token_op_ids,
234 :last_token => index,