00001 # -*- mode: ruby; coding: us-ascii -*-
00002 firstline, predefined = __LINE__+1, %[\
00003 intern
00004 method_missing MethodMissing
00005 length
00006 size
00007 gets
00008 succ
00009 each
00010 proc
00011 lambda
00012 send
00013 __send__
00014 initialize
00015 initialize_copy
00016 initialize_clone
00017 initialize_dup
00018 _ UScore
00019 "/*NULL*/" NULL
00020 empty?
00021 respond_to? Respond_to
00022 respond_to_missing? Respond_to_missing
00023 <IFUNC>
00024 <CFUNC>
00025 core#set_method_alias
00026 core#set_variable_alias
00027 core#undef_method
00028 core#define_method
00029 core#define_singleton_method
00030 core#set_postexe
00031 core#hash_from_ary
00032 core#hash_merge_ary
00033 core#hash_merge_ptr
00034 core#hash_merge_kwd
00035 ]
00036
00037 class KeywordError < RuntimeError
00038 def self.raise(mesg, line)
00039 super(self, mesg, ["#{__FILE__}:#{line}", *caller])
00040 end
00041 end
00042
00043 predefined_ids = {}
00044 preserved_ids = []
00045 local_ids = []
00046 instance_ids = []
00047 global_ids = []
00048 const_ids = []
00049 class_ids = []
00050 names = {}
00051 predefined.split(/^/).each_with_index do |line, num|
00052 next if /^#/ =~ line
00053 line.sub!(/\s+#.*/, '')
00054 name, token = line.split
00055 next unless name
00056 token ||= name
00057 if /#/ =~ token
00058 token = "_#{token.gsub(/\W+/, '_')}"
00059 else
00060 token = token.sub(/\?/, 'P').sub(/\A[a-z]/) {$&.upcase}
00061 token.sub!(/\A\$/, "_G_")
00062 token.sub!(/\A@@/, "_C_")
00063 token.sub!(/\A@/, "_I_")
00064 token.gsub!(/\W+/, "")
00065 end
00066 if prev = names[name]
00067 KeywordError.raise("#{name} is already registered at line #{prev+firstline}", firstline+num)
00068 end
00069 if prev = predefined_ids[token]
00070 KeywordError.raise("#{token} is already used for #{prev} at line #{names[prev]+firstline}", firstline+num)
00071 end
00072 names[name] = num
00073 case name
00074 when /\A[A-Z]\w*\z/; const_ids
00075 when /\A(?!\d)\w+\z/; local_ids
00076 when /\A\$(?:\d+|(?!\d)\w+)\z/; global_ids
00077 when /\A@@(?!\d)\w+\z/; class_ids
00078 when /\A@(?!\d)\w+\z/; instance_ids
00079 when /\A((?!\d)\w+)=\z/
00080 KeywordError.raise("use ID2ATTRSET(#{$1}) instead of ATTRSET #{name}", firstline+num)
00081 else preserved_ids
00082 end << token
00083 predefined_ids[token] = name
00084 end
00085 {
00086 "LOCAL" => local_ids,
00087 "INSTANCE" => instance_ids,
00088 "GLOBAL" => global_ids,
00089 "CONST" => const_ids,
00090 "CLASS" => class_ids,
00091 :preserved => preserved_ids,
00092 :predefined => predefined_ids,
00093 }
00094