rubysl-irb 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.travis.yml +8 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +25 -0
  6. data/README.md +29 -0
  7. data/Rakefile +1 -0
  8. data/lib/irb/cmd/chws.rb +33 -0
  9. data/lib/irb/cmd/fork.rb +39 -0
  10. data/lib/irb/cmd/help.rb +31 -0
  11. data/lib/irb/cmd/load.rb +67 -0
  12. data/lib/irb/cmd/nop.rb +39 -0
  13. data/lib/irb/cmd/pushws.rb +39 -0
  14. data/lib/irb/cmd/subirb.rb +43 -0
  15. data/lib/irb/completion.rb +205 -0
  16. data/lib/irb/context.rb +255 -0
  17. data/lib/irb/ext/change-ws.rb +62 -0
  18. data/lib/irb/ext/history.rb +110 -0
  19. data/lib/irb/ext/loader.rb +120 -0
  20. data/lib/irb/ext/math-mode.rb +37 -0
  21. data/lib/irb/ext/multi-irb.rb +241 -0
  22. data/lib/irb/ext/save-history.rb +70 -0
  23. data/lib/irb/ext/tracer.rb +61 -0
  24. data/lib/irb/ext/use-loader.rb +65 -0
  25. data/lib/irb/ext/workspaces.rb +56 -0
  26. data/lib/irb/extend-command.rb +264 -0
  27. data/lib/irb/frame.rb +67 -0
  28. data/lib/irb/help.rb +35 -0
  29. data/lib/irb/init.rb +258 -0
  30. data/lib/irb/input-method.rb +120 -0
  31. data/lib/irb/lc/error.rb +30 -0
  32. data/lib/irb/lc/help-message.rb +37 -0
  33. data/lib/irb/lc/ja/error.rb +27 -0
  34. data/lib/irb/lc/ja/help-message +36 -0
  35. data/lib/irb/locale.rb +184 -0
  36. data/lib/irb/notifier.rb +145 -0
  37. data/lib/irb/output-method.rb +85 -0
  38. data/lib/irb/rubinius.rb +55 -0
  39. data/lib/irb/ruby-lex.rb +1149 -0
  40. data/lib/irb/ruby-token.rb +273 -0
  41. data/lib/irb/slex.rb +285 -0
  42. data/lib/irb/version.rb +16 -0
  43. data/lib/irb/workspace.rb +107 -0
  44. data/lib/irb/ws-for-case-2.rb +15 -0
  45. data/lib/irb/xmp.rb +86 -0
  46. data/lib/irb.rb +1 -0
  47. data/lib/rubysl/irb/irb.rb +356 -0
  48. data/lib/rubysl/irb/version.rb +5 -0
  49. data/lib/rubysl/irb.rb +2 -0
  50. data/rubysl-irb.gemspec +31 -0
  51. metadata +219 -0
@@ -0,0 +1,273 @@
1
+ #
2
+ # irb/ruby-token.rb - ruby tokens
3
+ # $Release Version: 0.9.5$
4
+ # $Revision: 11708 $
5
+ # $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
6
+ # by Keiju ISHITSUKA(keiju@ruby-lang.org)
7
+ #
8
+ # --
9
+ #
10
+ #
11
+ #
12
+ module RubyToken
13
+ EXPR_BEG = :EXPR_BEG
14
+ EXPR_MID = :EXPR_MID
15
+ EXPR_END = :EXPR_END
16
+ EXPR_ARG = :EXPR_ARG
17
+ EXPR_FNAME = :EXPR_FNAME
18
+ EXPR_DOT = :EXPR_DOT
19
+ EXPR_CLASS = :EXPR_CLASS
20
+
21
+ # for ruby 1.4X
22
+ if !defined?(Symbol)
23
+ Symbol = Integer
24
+ end
25
+
26
+ class Token
27
+ def initialize(seek, line_no, char_no)
28
+ @seek = seek
29
+ @line_no = line_no
30
+ @char_no = char_no
31
+ end
32
+ attr :seek
33
+ attr :line_no
34
+ attr :char_no
35
+ end
36
+
37
+ class TkNode < Token
38
+ def initialize(seek, line_no, char_no)
39
+ super
40
+ end
41
+ attr :node
42
+ end
43
+
44
+ class TkId < Token
45
+ def initialize(seek, line_no, char_no, name)
46
+ super(seek, line_no, char_no)
47
+ @name = name
48
+ end
49
+ attr :name
50
+ end
51
+
52
+ class TkVal < Token
53
+ def initialize(seek, line_no, char_no, value = nil)
54
+ super(seek, line_no, char_no)
55
+ @value = value
56
+ end
57
+ attr :value
58
+ end
59
+
60
+ class TkOp < Token
61
+ attr :name, true
62
+ end
63
+
64
+ class TkOPASGN < TkOp
65
+ def initialize(seek, line_no, char_no, op)
66
+ super(seek, line_no, char_no)
67
+ op = TkReading2Token[op][0] unless op.kind_of?(Symbol)
68
+ @op = op
69
+ end
70
+ attr :op
71
+ end
72
+
73
+ class TkUnknownChar < Token
74
+ def initialize(seek, line_no, char_no, id)
75
+ super(seek, line_no, char_no)
76
+ @name = name
77
+ end
78
+ attr :name
79
+ end
80
+
81
+ class TkError < Token
82
+ end
83
+
84
+ def Token(token, value = nil)
85
+ case token
86
+ when String
87
+ if (tk = TkReading2Token[token]).nil?
88
+ IRB.fail TkReading2TokenNoKey, token
89
+ end
90
+ tk = Token(tk[0], value)
91
+ if tk.kind_of?(TkOp)
92
+ tk.name = token
93
+ end
94
+ return tk
95
+ when Symbol
96
+ if (tk = TkSymbol2Token[token]).nil?
97
+ IRB.fail TkSymbol2TokenNoKey, token
98
+ end
99
+ return Token(tk[0], value)
100
+ else
101
+ if (token.ancestors & [TkId, TkVal, TkOPASGN, TkUnknownChar]).empty?
102
+ token.new(@prev_seek, @prev_line_no, @prev_char_no)
103
+ else
104
+ token.new(@prev_seek, @prev_line_no, @prev_char_no, value)
105
+ end
106
+ end
107
+ end
108
+
109
+ TokenDefinitions = [
110
+ [:TkCLASS, TkId, "class", EXPR_CLASS],
111
+ [:TkMODULE, TkId, "module", EXPR_BEG],
112
+ [:TkDEF, TkId, "def", EXPR_FNAME],
113
+ [:TkUNDEF, TkId, "undef", EXPR_FNAME],
114
+ [:TkBEGIN, TkId, "begin", EXPR_BEG],
115
+ [:TkRESCUE, TkId, "rescue", EXPR_MID],
116
+ [:TkENSURE, TkId, "ensure", EXPR_BEG],
117
+ [:TkEND, TkId, "end", EXPR_END],
118
+ [:TkIF, TkId, "if", EXPR_BEG, :TkIF_MOD],
119
+ [:TkUNLESS, TkId, "unless", EXPR_BEG, :TkUNLESS_MOD],
120
+ [:TkTHEN, TkId, "then", EXPR_BEG],
121
+ [:TkELSIF, TkId, "elsif", EXPR_BEG],
122
+ [:TkELSE, TkId, "else", EXPR_BEG],
123
+ [:TkCASE, TkId, "case", EXPR_BEG],
124
+ [:TkWHEN, TkId, "when", EXPR_BEG],
125
+ [:TkWHILE, TkId, "while", EXPR_BEG, :TkWHILE_MOD],
126
+ [:TkUNTIL, TkId, "until", EXPR_BEG, :TkUNTIL_MOD],
127
+ [:TkFOR, TkId, "for", EXPR_BEG],
128
+ [:TkBREAK, TkId, "break", EXPR_END],
129
+ [:TkNEXT, TkId, "next", EXPR_END],
130
+ [:TkREDO, TkId, "redo", EXPR_END],
131
+ [:TkRETRY, TkId, "retry", EXPR_END],
132
+ [:TkIN, TkId, "in", EXPR_BEG],
133
+ [:TkDO, TkId, "do", EXPR_BEG],
134
+ [:TkRETURN, TkId, "return", EXPR_MID],
135
+ [:TkYIELD, TkId, "yield", EXPR_END],
136
+ [:TkSUPER, TkId, "super", EXPR_END],
137
+ [:TkSELF, TkId, "self", EXPR_END],
138
+ [:TkNIL, TkId, "nil", EXPR_END],
139
+ [:TkTRUE, TkId, "true", EXPR_END],
140
+ [:TkFALSE, TkId, "false", EXPR_END],
141
+ [:TkAND, TkId, "and", EXPR_BEG],
142
+ [:TkOR, TkId, "or", EXPR_BEG],
143
+ [:TkNOT, TkId, "not", EXPR_BEG],
144
+ [:TkIF_MOD, TkId],
145
+ [:TkUNLESS_MOD, TkId],
146
+ [:TkWHILE_MOD, TkId],
147
+ [:TkUNTIL_MOD, TkId],
148
+ [:TkALIAS, TkId, "alias", EXPR_FNAME],
149
+ [:TkDEFINED, TkId, "defined?", EXPR_END],
150
+ [:TklBEGIN, TkId, "BEGIN", EXPR_END],
151
+ [:TklEND, TkId, "END", EXPR_END],
152
+ [:Tk__LINE__, TkId, "__LINE__", EXPR_END],
153
+ [:Tk__FILE__, TkId, "__FILE__", EXPR_END],
154
+
155
+ [:TkIDENTIFIER, TkId],
156
+ [:TkFID, TkId],
157
+ [:TkGVAR, TkId],
158
+ [:TkCVAR, TkId],
159
+ [:TkIVAR, TkId],
160
+ [:TkCONSTANT, TkId],
161
+
162
+ [:TkINTEGER, TkVal],
163
+ [:TkFLOAT, TkVal],
164
+ [:TkSTRING, TkVal],
165
+ [:TkXSTRING, TkVal],
166
+ [:TkREGEXP, TkVal],
167
+ [:TkSYMBOL, TkVal],
168
+
169
+ [:TkDSTRING, TkNode],
170
+ [:TkDXSTRING, TkNode],
171
+ [:TkDREGEXP, TkNode],
172
+ [:TkNTH_REF, TkNode],
173
+ [:TkBACK_REF, TkNode],
174
+
175
+ [:TkUPLUS, TkOp, "+@"],
176
+ [:TkUMINUS, TkOp, "-@"],
177
+ [:TkPOW, TkOp, "**"],
178
+ [:TkCMP, TkOp, "<=>"],
179
+ [:TkEQ, TkOp, "=="],
180
+ [:TkEQQ, TkOp, "==="],
181
+ [:TkNEQ, TkOp, "!="],
182
+ [:TkGEQ, TkOp, ">="],
183
+ [:TkLEQ, TkOp, "<="],
184
+ [:TkANDOP, TkOp, "&&"],
185
+ [:TkOROP, TkOp, "||"],
186
+ [:TkMATCH, TkOp, "=~"],
187
+ [:TkNMATCH, TkOp, "!~"],
188
+ [:TkDOT2, TkOp, ".."],
189
+ [:TkDOT3, TkOp, "..."],
190
+ [:TkAREF, TkOp, "[]"],
191
+ [:TkASET, TkOp, "[]="],
192
+ [:TkLSHFT, TkOp, "<<"],
193
+ [:TkRSHFT, TkOp, ">>"],
194
+ [:TkCOLON2, TkOp],
195
+ [:TkCOLON3, TkOp],
196
+ # [:OPASGN, TkOp], # +=, -= etc. #
197
+ [:TkASSOC, TkOp, "=>"],
198
+ [:TkQUESTION, TkOp, "?"], #?
199
+ [:TkCOLON, TkOp, ":"], #:
200
+
201
+ [:TkfLPAREN], # func( #
202
+ [:TkfLBRACK], # func[ #
203
+ [:TkfLBRACE], # func{ #
204
+ [:TkSTAR], # *arg
205
+ [:TkAMPER], # &arg #
206
+ [:TkSYMBEG], # :SYMBOL
207
+
208
+ [:TkGT, TkOp, ">"],
209
+ [:TkLT, TkOp, "<"],
210
+ [:TkPLUS, TkOp, "+"],
211
+ [:TkMINUS, TkOp, "-"],
212
+ [:TkMULT, TkOp, "*"],
213
+ [:TkDIV, TkOp, "/"],
214
+ [:TkMOD, TkOp, "%"],
215
+ [:TkBITOR, TkOp, "|"],
216
+ [:TkBITXOR, TkOp, "^"],
217
+ [:TkBITAND, TkOp, "&"],
218
+ [:TkBITNOT, TkOp, "~"],
219
+ [:TkNOTOP, TkOp, "!"],
220
+
221
+ [:TkBACKQUOTE, TkOp, "`"],
222
+
223
+ [:TkASSIGN, Token, "="],
224
+ [:TkDOT, Token, "."],
225
+ [:TkLPAREN, Token, "("], #(exp)
226
+ [:TkLBRACK, Token, "["], #[arry]
227
+ [:TkLBRACE, Token, "{"], #{hash}
228
+ [:TkRPAREN, Token, ")"],
229
+ [:TkRBRACK, Token, "]"],
230
+ [:TkRBRACE, Token, "}"],
231
+ [:TkCOMMA, Token, ","],
232
+ [:TkSEMICOLON, Token, ";"],
233
+
234
+ [:TkCOMMENT],
235
+ [:TkRD_COMMENT],
236
+ [:TkSPACE],
237
+ [:TkNL],
238
+ [:TkEND_OF_SCRIPT],
239
+
240
+ [:TkBACKSLASH, TkUnknownChar, "\\"],
241
+ [:TkAT, TkUnknownChar, "@"],
242
+ [:TkDOLLAR, TkUnknownChar, "$"],
243
+ ]
244
+
245
+ # {reading => token_class}
246
+ # {reading => [token_class, *opt]}
247
+ TkReading2Token = {}
248
+ TkSymbol2Token = {}
249
+
250
+ def RubyToken.def_token(token_n, super_token = Token, reading = nil, *opts)
251
+ token_n = token_n.id2name if token_n.kind_of?(Symbol)
252
+ if RubyToken.const_defined?(token_n)
253
+ IRB.fail AlreadyDefinedToken, token_n
254
+ end
255
+ token_c = eval("class #{token_n} < #{super_token}; end; #{token_n}")
256
+
257
+ if reading
258
+ if TkReading2Token[reading]
259
+ IRB.fail TkReading2TokenDuplicateError, token_n, reading
260
+ end
261
+ if opts.empty?
262
+ TkReading2Token[reading] = [token_c]
263
+ else
264
+ TkReading2Token[reading] = [token_c].concat(opts)
265
+ end
266
+ end
267
+ TkSymbol2Token[token_n.intern] = token_c
268
+ end
269
+
270
+ for defs in TokenDefinitions
271
+ def_token(*defs)
272
+ end
273
+ end
data/lib/irb/slex.rb ADDED
@@ -0,0 +1,285 @@
1
+ #
2
+ # irb/slex.rb - symple lex analizer
3
+ # $Release Version: 0.9.5$
4
+ # $Revision: 11708 $
5
+ # $Date: 2007-02-12 15:01:19 -0800 (Mon, 12 Feb 2007) $
6
+ # by Keiju ISHITSUKA(keiju@ruby-lang.org)
7
+ #
8
+ # --
9
+ #
10
+ #
11
+ #
12
+
13
+ require "e2mmap"
14
+ require "irb/notifier"
15
+
16
+ module IRB
17
+ class SLex
18
+ @RCS_ID='-$Id: slex.rb 11708 2007-02-12 23:01:19Z shyouhei $-'
19
+
20
+ extend Exception2MessageMapper
21
+ def_exception :ErrNodeNothing, "node nothing"
22
+ def_exception :ErrNodeAlreadyExists, "node already exists"
23
+
24
+ DOUT = Notifier::def_notifier("SLex::")
25
+ D_WARN = DOUT::def_notifier(1, "Warn: ")
26
+ D_DEBUG = DOUT::def_notifier(2, "Debug: ")
27
+ D_DETAIL = DOUT::def_notifier(4, "Detail: ")
28
+
29
+ DOUT.level = Notifier::D_NOMSG
30
+
31
+ def initialize
32
+ @head = Node.new("")
33
+ end
34
+
35
+ def def_rule(token, preproc = nil, postproc = nil, &block)
36
+ D_DETAIL.pp token
37
+
38
+ postproc = block if block_given?
39
+ node = create(token, preproc, postproc)
40
+ end
41
+
42
+ def def_rules(*tokens, &block)
43
+ if block_given?
44
+ p = block
45
+ end
46
+ for token in tokens
47
+ def_rule(token, nil, p)
48
+ end
49
+ end
50
+
51
+ def preproc(token, proc)
52
+ node = search(token)
53
+ node.preproc=proc
54
+ end
55
+
56
+ #$BMW%A%'%C%/(B?
57
+ def postproc(token)
58
+ node = search(token, proc)
59
+ node.postproc=proc
60
+ end
61
+
62
+ def search(token)
63
+ @head.search(token.split(//))
64
+ end
65
+
66
+ def create(token, preproc = nil, postproc = nil)
67
+ @head.create_subnode(token.split(//), preproc, postproc)
68
+ end
69
+
70
+ def match(token)
71
+ case token
72
+ when Array
73
+ when String
74
+ return match(token.split(//))
75
+ else
76
+ return @head.match_io(token)
77
+ end
78
+ ret = @head.match(token)
79
+ D_DETAIL.exec_if{D_DEATIL.printf "match end: %s:%s\n", ret, token.inspect}
80
+ ret
81
+ end
82
+
83
+ def inspect
84
+ format("<SLex: @head = %s>", @head.inspect)
85
+ end
86
+
87
+ #----------------------------------------------------------------------
88
+ #
89
+ # class Node -
90
+ #
91
+ #----------------------------------------------------------------------
92
+ class Node
93
+ # if postproc is nil, this node is an abstract node.
94
+ # if postproc is non-nil, this node is a real node.
95
+ def initialize(preproc = nil, postproc = nil)
96
+ @Tree = {}
97
+ @preproc = preproc
98
+ @postproc = postproc
99
+ end
100
+
101
+ attr_accessor :preproc
102
+ attr_accessor :postproc
103
+
104
+ def search(chrs, opt = nil)
105
+ return self if chrs.empty?
106
+ ch = chrs.shift
107
+ if node = @Tree[ch]
108
+ node.search(chrs, opt)
109
+ else
110
+ if opt
111
+ chrs.unshift ch
112
+ self.create_subnode(chrs)
113
+ else
114
+ SLex.fail ErrNodeNothing
115
+ end
116
+ end
117
+ end
118
+
119
+ def create_subnode(chrs, preproc = nil, postproc = nil)
120
+ if chrs.empty?
121
+ if @postproc
122
+ D_DETAIL.pp node
123
+ SLex.fail ErrNodeAlreadyExists
124
+ else
125
+ D_DEBUG.puts "change abstract node to real node."
126
+ @preproc = preproc
127
+ @postproc = postproc
128
+ end
129
+ return self
130
+ end
131
+
132
+ ch = chrs.shift
133
+ if node = @Tree[ch]
134
+ if chrs.empty?
135
+ if node.postproc
136
+ DebugLogger.pp node
137
+ DebugLogger.pp self
138
+ DebugLogger.pp ch
139
+ DebugLogger.pp chrs
140
+ SLex.fail ErrNodeAlreadyExists
141
+ else
142
+ D_WARN.puts "change abstract node to real node"
143
+ node.preproc = preproc
144
+ node.postproc = postproc
145
+ end
146
+ else
147
+ node.create_subnode(chrs, preproc, postproc)
148
+ end
149
+ else
150
+ if chrs.empty?
151
+ node = Node.new(preproc, postproc)
152
+ else
153
+ node = Node.new
154
+ node.create_subnode(chrs, preproc, postproc)
155
+ end
156
+ @Tree[ch] = node
157
+ end
158
+ node
159
+ end
160
+
161
+ #
162
+ # chrs: String
163
+ # character array
164
+ # io must have getc()/ungetc(); and ungetc() must be
165
+ # able to be called arbitrary number of times.
166
+ #
167
+ def match(chrs, op = "")
168
+ D_DETAIL.print "match>: ", chrs, "op:", op, "\n"
169
+ if chrs.empty?
170
+ if @preproc.nil? || @preproc.call(op, chrs)
171
+ DOUT.printf(D_DETAIL, "op1: %s\n", op)
172
+ @postproc.call(op, chrs)
173
+ else
174
+ nil
175
+ end
176
+ else
177
+ ch = chrs.shift
178
+ if node = @Tree[ch]
179
+ if ret = node.match(chrs, op+ch)
180
+ return ret
181
+ else
182
+ chrs.unshift ch
183
+ if @postproc and @preproc.nil? || @preproc.call(op, chrs)
184
+ DOUT.printf(D_DETAIL, "op2: %s\n", op.inspect)
185
+ ret = @postproc.call(op, chrs)
186
+ return ret
187
+ else
188
+ return nil
189
+ end
190
+ end
191
+ else
192
+ chrs.unshift ch
193
+ if @postproc and @preproc.nil? || @preproc.call(op, chrs)
194
+ DOUT.printf(D_DETAIL, "op3: %s\n", op)
195
+ @postproc.call(op, chrs)
196
+ return ""
197
+ else
198
+ return nil
199
+ end
200
+ end
201
+ end
202
+ end
203
+
204
+ def match_io(io, op = "")
205
+ if op == ""
206
+ ch = io.getc
207
+ if ch == nil
208
+ return nil
209
+ end
210
+ else
211
+ ch = io.getc_of_rests
212
+ end
213
+ if ch.nil?
214
+ if @preproc.nil? || @preproc.call(op, io)
215
+ D_DETAIL.printf("op1: %s\n", op)
216
+ @postproc.call(op, io)
217
+ else
218
+ nil
219
+ end
220
+ else
221
+ if node = @Tree[ch]
222
+ if ret = node.match_io(io, op+ch)
223
+ ret
224
+ else
225
+ io.ungetc ch
226
+ if @postproc and @preproc.nil? || @preproc.call(op, io)
227
+ DOUT.exec_if{D_DETAIL.printf "op2: %s\n", op.inspect}
228
+ @postproc.call(op, io)
229
+ else
230
+ nil
231
+ end
232
+ end
233
+ else
234
+ io.ungetc ch
235
+ if @postproc and @preproc.nil? || @preproc.call(op, io)
236
+ D_DETAIL.printf("op3: %s\n", op)
237
+ @postproc.call(op, io)
238
+ else
239
+ nil
240
+ end
241
+ end
242
+ end
243
+ end
244
+ end
245
+ end
246
+ end
247
+
248
+ SLex=IRB::SLex
249
+
250
+ if $0 == __FILE__
251
+ # Tracer.on
252
+ case $1
253
+ when "1"
254
+ tr = SLex.new
255
+ print "0: ", tr.inspect, "\n"
256
+ tr.def_rule("=") {print "=\n"}
257
+ print "1: ", tr.inspect, "\n"
258
+ tr.def_rule("==") {print "==\n"}
259
+ print "2: ", tr.inspect, "\n"
260
+
261
+ print "case 1:\n"
262
+ print tr.match("="), "\n"
263
+ print "case 2:\n"
264
+ print tr.match("=="), "\n"
265
+ print "case 3:\n"
266
+ print tr.match("=>"), "\n"
267
+
268
+ when "2"
269
+ tr = SLex.new
270
+ print "0: ", tr.inspect, "\n"
271
+ tr.def_rule("=") {print "=\n"}
272
+ print "1: ", tr.inspect, "\n"
273
+ tr.def_rule("==", proc{false}) {print "==\n"}
274
+ print "2: ", tr.inspect, "\n"
275
+
276
+ print "case 1:\n"
277
+ print tr.match("="), "\n"
278
+ print "case 2:\n"
279
+ print tr.match("=="), "\n"
280
+ print "case 3:\n"
281
+ print tr.match("=>"), "\n"
282
+ end
283
+ exit
284
+ end
285
+