1 # -*- mode: ruby; coding: us-ascii -*-
2 firstline, predefined = __LINE__+1, %[\
10 method_missing MethodMissing
12 singleton_method_added
14 singleton_method_removed
16 singleton_method_undefined
51 respond_to? Respond_to
52 respond_to_missing? Respond_to_missing
56 core#set_variable_alias
59 core#define_singleton_method
72 # VM ID OP Parser Token
108 class KeywordError < RuntimeError
109 def self.raise(mesg, line)
110 super(self, mesg, ["#{__FILE__}:#{line}", *caller])
124 predefined.split(/^/).each_with_index do |line, num|
126 line.sub!(/\s+#.*/, '')
127 name, token = line.split
131 token = "_#{token.gsub(/\W+/, '_')}"
133 token = token.sub(/\?/, 'P').sub(/\A[a-z]/) {$&.upcase}
134 token.sub!(/\A\$/, "_G_")
135 token.sub!(/\A@@/, "_C_")
136 token.sub!(/\A@/, "_I_")
137 token.gsub!(/\W+/, "")
140 preserved_ids << token
143 if prev = names[name]
144 KeywordError.raise("#{name} is already registered at line #{prev+firstline}", firstline+num)
146 if prev = predefined_ids[token]
147 KeywordError.raise("#{token} is already used for #{prev} at line #{names[prev]+firstline}", firstline+num)
151 when /\A[A-Z]\w*\z/; const_ids
152 when /\A(?!\d)\w+\z/; local_ids
153 when /\A\$(?:\d+|(?!\d)\w+|\W)\z/; global_ids
154 when /\A@@(?!\d)\w+\z/; class_ids
155 when /\A@(?!\d)\w+\z/; instance_ids
156 when /\A((?!\d)\w+)=\z/; attrset_ids
159 predefined_ids[token] = name
161 token_ops.split(/^/).each do |line|
163 line.sub!(/\s+#.*/, '')
164 id, op, token = line.split
165 next unless id and op
166 token ||= (id unless /\A\W\z/ =~ op)
167 token_op_ids << [id, op, token]
170 "LOCAL" => local_ids,
171 "INSTANCE" => instance_ids,
172 "GLOBAL" => global_ids,
173 "CONST" => const_ids,
174 "CLASS" => class_ids,
175 "ATTRSET" => attrset_ids,
176 :preserved => preserved_ids,
177 :predefined => predefined_ids,
178 :token_op => token_op_ids,