rubysl-irb 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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
+