rubylexer 0.7.6 → 0.7.7
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.
- data/.document +4 -0
- data/History.txt +54 -7
- data/Makefile +43 -0
- data/lib/.document +3 -0
- data/lib/rubylexer.rb +286 -154
- data/lib/rubylexer/.document +9 -0
- data/lib/rubylexer/charhandler.rb +25 -19
- data/lib/rubylexer/context.rb +17 -4
- data/lib/rubylexer/rubycode.rb +1 -1
- data/lib/rubylexer/rulexer.rb +120 -95
- data/lib/rubylexer/symboltable.rb +22 -1
- data/lib/rubylexer/test/oneliners.rb +20 -0
- data/lib/rubylexer/test/oneliners_1.9.rb +146 -0
- data/lib/rubylexer/test/testcases.rb +6 -2
- data/lib/rubylexer/token.rb +22 -6
- data/lib/rubylexer/tokenprinter.rb +6 -6
- data/lib/rubylexer/version.rb +1 -1
- data/rubylexer.gemspec +40 -0
- data/test/code/coloruby.rb +154 -0
- data/test/code/dumptokens.rb +10 -5
- data/test/code/regression.rb +31 -17
- data/test/code/rubylexervsruby.rb +1 -1
- data/test/code/test_1.9.rb +31 -0
- data/test/code/tokentest.rb +6 -6
- data/test/data/{hdr_dos2.rb → hdr_dos2.rb.broken} +0 -0
- data/test/data/{heremonsters.rb.broken → heremonsters_broken.rb} +0 -0
- data/test/data/{heremonsters_dos.rb.broken → heremonsters_dos_broken.rb} +0 -0
- data/test/test_all.rb +2 -0
- metadata +94 -98
- data/Rakefile +0 -37
@@ -37,11 +37,32 @@ class SymbolTable
|
|
37
37
|
list or raise "unbalanced end block"
|
38
38
|
list.each_key {|sym|
|
39
39
|
@symbols[sym].pop
|
40
|
-
@symbols[sym].empty? and @symbols
|
40
|
+
@symbols[sym].empty? and @symbols.delete sym
|
41
41
|
}
|
42
42
|
assert @locals_lists.last
|
43
43
|
end
|
44
44
|
|
45
|
+
def deep_copy
|
46
|
+
result=SymbolTable.allocate
|
47
|
+
new_symbols={}
|
48
|
+
@symbols.each_pair{|str,stack|
|
49
|
+
new_symbols[str.clone]=stack.map{|elem| elem.clone rescue elem }
|
50
|
+
}
|
51
|
+
new_locals_lists=[]
|
52
|
+
@locals_lists.each{|hash|
|
53
|
+
new_locals_lists.push({})
|
54
|
+
hash.each_pair{|str,bool|
|
55
|
+
new_locals_lists.last[str.dup]=bool
|
56
|
+
}
|
57
|
+
}
|
58
|
+
new_locals_lists.push({}) if new_locals_lists.empty?
|
59
|
+
result.instance_eval{
|
60
|
+
@symbols=new_symbols
|
61
|
+
@locals_lists=new_locals_lists
|
62
|
+
}
|
63
|
+
return result
|
64
|
+
end
|
65
|
+
|
45
66
|
def names
|
46
67
|
@symbols.keys
|
47
68
|
end
|
@@ -3,6 +3,23 @@ def x; yield end #this must be first!!!!
|
|
3
3
|
#modifying the list of known local variables. it may be omitted
|
4
4
|
#in cases where it is known that no local vars are defined.
|
5
5
|
|
6
|
+
module A 55 end
|
7
|
+
module Array([Array]).first::E; end
|
8
|
+
module Array ([Array]).first::E; end
|
9
|
+
module Array([Array]).first::E include M; end
|
10
|
+
module Array ([Array]).first::E include M; end
|
11
|
+
module Array([Array]).first::E include M end
|
12
|
+
module Array ([Array]).first::E include M end
|
13
|
+
x{a=Array; module a::Foo; 55 end}
|
14
|
+
x{a=Array; module a::Foo include a; 55 end}
|
15
|
+
x{a=Array; module a::Foo include a; a end}
|
16
|
+
module a.b.c.d.e.f::Quux; YYY=534 end
|
17
|
+
module[Array][0]::Foo; Bazz=556 end
|
18
|
+
|
19
|
+
module(@a)::Foo; Bar=111 end
|
20
|
+
|
21
|
+
module@x::Foo; Bar=1 end
|
22
|
+
|
6
23
|
module A::B; end
|
7
24
|
|
8
25
|
p a rescue b
|
@@ -499,6 +516,9 @@ def ~@; :foo end
|
|
499
516
|
undef ~@
|
500
517
|
alias ~@ non
|
501
518
|
alias non ~@
|
519
|
+
undef :~@
|
520
|
+
alias :~@ non
|
521
|
+
alias non :~@
|
502
522
|
p :~@
|
503
523
|
a.~@
|
504
524
|
a::~@
|
@@ -0,0 +1,146 @@
|
|
1
|
+
module Ruby1_9OneLiners
|
2
|
+
EXPECT_NO_METHODS=[ #no errors either
|
3
|
+
'->a; h do 123 end',
|
4
|
+
'->{}',
|
5
|
+
'-> {}',
|
6
|
+
'->;{}',
|
7
|
+
'->(;){}',
|
8
|
+
'->a{}',
|
9
|
+
'->a {}',
|
10
|
+
'->a;{}',
|
11
|
+
'->(a;){}',
|
12
|
+
'->a,b{}',
|
13
|
+
'->a,b;{}',
|
14
|
+
'->a,b;c{}',
|
15
|
+
'->(a,b;){}',
|
16
|
+
'->(a,b;c){}',
|
17
|
+
'$f.($x,$y)',
|
18
|
+
'$f::($x,$y)',
|
19
|
+
'__ENCODING__',
|
20
|
+
'__ENCODING__ +"foo"',
|
21
|
+
'module __ENCODING__::A; end',
|
22
|
+
'/(?<foo>bar)/ =~ "baz"; foo +1',
|
23
|
+
"/(?'foo'bar)/ =~ 'baz'; foo +1",
|
24
|
+
'/\\\\(?<foo>bar)/ =~ "baz"; foo +1',
|
25
|
+
"/\\\\(?'foo'bar)/ =~ 'baz'; foo +1",
|
26
|
+
'/\\c\\(?<foo>bar)/ =~ "baz"; foo +1',
|
27
|
+
"/\\c\\(?'foo'bar)/ =~ 'baz'; foo +1",
|
28
|
+
'/\\\\c(?<foo>bar)/ =~ "baz"; foo +1',
|
29
|
+
"/\\\\c(?'foo'bar)/ =~ 'baz'; foo +1",
|
30
|
+
'/\\C-\\(?<foo>bar)/ =~ "baz"; foo +1',
|
31
|
+
"/\\C-\\(?'foo'bar)/ =~ 'baz'; foo +1",
|
32
|
+
'/\\\\C-(?<foo>bar)/ =~ "baz"; foo +1',
|
33
|
+
"/\\\\C-(?'foo'bar)/ =~ 'baz'; foo +1",
|
34
|
+
'/\\(?#(?<foo>bar))/ =~ "baz"; foo +1',
|
35
|
+
"/\\(?#(?'foo'bar))/ =~ 'baz'; foo +1",
|
36
|
+
'/\\[(?<foo>bar)]/ =~ "baz"; foo +1',
|
37
|
+
"/\\[(?'foo'bar)]/ =~ 'baz'; foo +1",
|
38
|
+
|
39
|
+
'/z(?<foo>bar)/ =~ "baz"; foo +1',
|
40
|
+
"/z(?'foo'bar)/ =~ 'baz'; foo +1",
|
41
|
+
'/z\\\\(?<foo>bar)/ =~ "baz"; foo +1',
|
42
|
+
"/z\\\\(?'foo'bar)/ =~ 'baz'; foo +1",
|
43
|
+
'/z\\c\\(?<foo>bar)/ =~ "baz"; foo +1',
|
44
|
+
"/z\\c\\(?'foo'bar)/ =~ 'baz'; foo +1",
|
45
|
+
'/z\\\\c(?<foo>bar)/ =~ "baz"; foo +1',
|
46
|
+
"/z\\\\c(?'foo'bar)/ =~ 'baz'; foo +1",
|
47
|
+
'/z\\C-\\(?<foo>bar)/ =~ "baz"; foo +1',
|
48
|
+
"/z\\C-\\(?'foo'bar)/ =~ 'baz'; foo +1",
|
49
|
+
'/z\\\\C-(?<foo>bar)/ =~ "baz"; foo +1',
|
50
|
+
"/z\\\\C-(?'foo'bar)/ =~ 'baz'; foo +1",
|
51
|
+
'/z\\(?#(?<foo>bar))/ =~ "baz"; foo +1',
|
52
|
+
"/z\\(?#(?'foo'bar))/ =~ 'baz'; foo +1",
|
53
|
+
'/z\\[(?<foo>bar)]/ =~ "baz"; foo +1',
|
54
|
+
"/z\\[(?'foo'bar)]/ =~ 'baz'; foo +1",
|
55
|
+
]
|
56
|
+
|
57
|
+
EXPECT_1_METHOD=[
|
58
|
+
'def self.foo; 1 end',
|
59
|
+
'->{ foo=1 }; foo',
|
60
|
+
'->do foo=1 end; foo',
|
61
|
+
'def __FILE__.foo; 1 end',
|
62
|
+
'def __LINE__.foo; 1 end',
|
63
|
+
'def a(b,*c,d) 1 end',
|
64
|
+
'def a(*c,d) 1 end',
|
65
|
+
'def Z::a(b,*c,d) 1 end',
|
66
|
+
'def Z::a(*c,d) 1 end',
|
67
|
+
'a{|b,*c,d| 1 }',
|
68
|
+
'a{|*c,d| 1 }',
|
69
|
+
'def a(b,(x,y),d) 1 end',
|
70
|
+
'def a((x,y),d) 1 end',
|
71
|
+
'def Z::a(b,(x,y),d) 1 end',
|
72
|
+
'def Z::a((x,y),d) 1 end',
|
73
|
+
'a{|b,(x,y),d| 1 }',
|
74
|
+
'a{|(x,y),d| 1 }',
|
75
|
+
'def a(b,(x,*y),d) 1 end',
|
76
|
+
'def a((x,*y),d) 1 end',
|
77
|
+
'def Z::a(b,(x,*y),d) 1 end',
|
78
|
+
'def Z::a((x,*y),d) 1 end',
|
79
|
+
'a{|b,(x,*y),d| 1 }',
|
80
|
+
'a{|(x,*y),d| 1 }',
|
81
|
+
'def a(b,(x,(y,z)),d) 1 end',
|
82
|
+
'def a((x,(y,z)),d) 1 end',
|
83
|
+
'def Z::a(b,(x,(y,z)),d) 1 end',
|
84
|
+
'def Z::a((x,(y,z)),d) 1 end',
|
85
|
+
'a{|b,(x,(y,z)),d| 1 }',
|
86
|
+
'a{|(x,(y,z)),d| 1 }',
|
87
|
+
'module __ENCODING__::A include B; end',
|
88
|
+
'def __ENCODING__; 342 end',
|
89
|
+
'def __ENCODING__.foo; 1 end',
|
90
|
+
'def Z::__ENCODING__; 342 end',
|
91
|
+
#'def Z::__ENCODING__.foo; 1 end', #oops, 2 methods here
|
92
|
+
'/\\(?<foo>bar)/ =~ "baz"; foo +1',
|
93
|
+
"/\\(?'foo'bar)/ =~ 'baz'; foo +1",
|
94
|
+
'/\\c(?<foo>bar)/ =~ "baz"; foo +1',
|
95
|
+
"/\\c(?'foo'bar)/ =~ 'baz'; foo +1",
|
96
|
+
'/\\C-(?<foo>bar)/ =~ "baz"; foo +1',
|
97
|
+
"/\\C-(?'foo'bar)/ =~ 'baz'; foo +1",
|
98
|
+
'/\\M-(?<foo>bar)/ =~ "baz"; foo +1',
|
99
|
+
"/\\M-(?'foo'bar)/ =~ 'baz'; foo +1",
|
100
|
+
'/\\\\\\(?<foo>bar)/ =~ "baz"; foo +1',
|
101
|
+
"/\\\\\\(?'foo'bar)/ =~ 'baz'; foo +1",
|
102
|
+
'/\\\\c\\(?<foo>bar)/ =~ "baz"; foo +1',
|
103
|
+
"/\\\\c\\(?'foo'bar)/ =~ 'baz'; foo +1",
|
104
|
+
'/(?#(?<foo>bar))/ =~ "baz"; foo +1',
|
105
|
+
"/(?#(?'foo'bar))/ =~ 'baz'; foo +1",
|
106
|
+
'/[(?<foo>bar)]/ =~ "baz"; foo +1',
|
107
|
+
"/[(?'foo'bar)]/ =~ 'baz'; foo +1",
|
108
|
+
'/[qwe&&[^ty](?<foo>bar)]/ =~ "baz"; foo +1',
|
109
|
+
"/[qwe&&[^ty](?'foo'bar)]/ =~ 'baz'; foo +1",
|
110
|
+
'/[qwe&&[^(?<foo>bar)]]/ =~ "baz"; foo +1',
|
111
|
+
"/[qwe&&[^(?'foo'bar)]]/ =~ 'baz'; foo +1",
|
112
|
+
'/[qwe&&[^ty&&[^uip]](?<foo>bar)]/ =~ "baz"; foo +1',
|
113
|
+
"/[qwe&&[^ty&&[^uip]](?'foo'bar)]/ =~ 'baz'; foo +1",
|
114
|
+
'/[qwe&&[^ty&&[^uip](?<foo>bar)]]/ =~ "baz"; foo +1',
|
115
|
+
"/[qwe&&[^ty&&[^uip](?'foo'bar)]]/ =~ 'baz'; foo +1",
|
116
|
+
'/[qwe&&[^ty&&[^uip(?<foo>bar)]]]/ =~ "baz"; foo +1',
|
117
|
+
"/[qwe&&[^ty&&[^uip(?'foo'bar)]]]/ =~ 'baz'; foo +1",
|
118
|
+
|
119
|
+
'/z\\(?<foo>bar)/ =~ "baz"; foo +1',
|
120
|
+
"/z\\(?'foo'bar)/ =~ 'baz'; foo +1",
|
121
|
+
'/z\\c(?<foo>bar)/ =~ "baz"; foo +1',
|
122
|
+
"/z\\c(?'foo'bar)/ =~ 'baz'; foo +1",
|
123
|
+
'/z\\C-(?<foo>bar)/ =~ "baz"; foo +1',
|
124
|
+
"/z\\C-(?'foo'bar)/ =~ 'baz'; foo +1",
|
125
|
+
'/z\\M-(?<foo>bar)/ =~ "baz"; foo +1',
|
126
|
+
"/z\\M-(?'foo'bar)/ =~ 'baz'; foo +1",
|
127
|
+
'/z\\\\\\(?<foo>bar)/ =~ "baz"; foo +1',
|
128
|
+
"/z\\\\\\(?'foo'bar)/ =~ 'baz'; foo +1",
|
129
|
+
'/z\\\\c\\(?<foo>bar)/ =~ "baz"; foo +1',
|
130
|
+
"/z\\\\c\\(?'foo'bar)/ =~ 'baz'; foo +1",
|
131
|
+
'/z(?#(?<foo>bar))/ =~ "baz"; foo +1',
|
132
|
+
"/z(?#(?'foo'bar))/ =~ 'baz'; foo +1",
|
133
|
+
'/z[(?<foo>bar)]/ =~ "baz"; foo +1',
|
134
|
+
"/z[(?'foo'bar)]/ =~ 'baz'; foo +1",
|
135
|
+
'/z[qwe&&[^ty](?<foo>bar)]/ =~ "baz"; foo +1',
|
136
|
+
"/z[qwe&&[^ty](?'foo'bar)]/ =~ 'baz'; foo +1",
|
137
|
+
'/z[qwe&&[^(?<foo>bar)]]/ =~ "baz"; foo +1',
|
138
|
+
"/z[qwe&&[^(?'foo'bar)]]/ =~ 'baz'; foo +1",
|
139
|
+
'/z[qwe&&[^ty&&[^uip]](?<foo>bar)]/ =~ "baz"; foo +1',
|
140
|
+
"/z[qwe&&[^ty&&[^uip]](?'foo'bar)]/ =~ 'baz'; foo +1",
|
141
|
+
'/z[qwe&&[^ty&&[^uip](?<foo>bar)]]/ =~ "baz"; foo +1',
|
142
|
+
"/z[qwe&&[^ty&&[^uip](?'foo'bar)]]/ =~ 'baz'; foo +1",
|
143
|
+
'/z[qwe&&[^ty&&[^uip(?<foo>bar)]]]/ =~ "baz"; foo +1',
|
144
|
+
"/z[qwe&&[^ty&&[^uip(?'foo'bar)]]]/ =~ 'baz'; foo +1",
|
145
|
+
]
|
146
|
+
end
|
@@ -8,9 +8,13 @@ module TestCases
|
|
8
8
|
ILLEGAL_STANZAS=IO.read(rldir+'/rubylexer/test/illegal_stanzas.rb').split("\n\n").grep(/./).reverse
|
9
9
|
|
10
10
|
datadir=$:.find{|dir| File.exist? dir+'/../test/data/p.rb' }
|
11
|
-
FILENAMES=Dir[datadir+'/../test/data
|
11
|
+
FILENAMES=Dir[datadir+'/../test/data/*.rb'].reject{|fn| File.directory? fn}
|
12
12
|
FILES=FILENAMES.map{|fn| File.read fn }
|
13
13
|
|
14
|
+
ILLEGAL_FILENAMES=(Dir[datadir+'/../test/data/*']-Dir[datadir+'/../test/data/*.rb'])
|
15
|
+
ILLEGAL_FILENAMES.reject!{|fn| File.directory? fn}
|
16
|
+
ILLEGAL_FILES=ILLEGAL_FILENAMES.map{|fn| File.read fn }
|
17
|
+
|
14
18
|
TESTCASES=ONELINERS+STANZAS+FILES
|
15
|
-
ILLEGAL_TESTCASES=ILLEGAL_ONELINERS+ILLEGAL_STANZAS
|
19
|
+
ILLEGAL_TESTCASES=ILLEGAL_ONELINERS+ILLEGAL_STANZAS+ILLEGAL_FILES
|
16
20
|
end
|
data/lib/rubylexer/token.rb
CHANGED
@@ -63,17 +63,24 @@ class KeywordToken < WToken #also some operators
|
|
63
63
|
@callsite if defined? @callsite
|
64
64
|
end
|
65
65
|
|
66
|
+
attr_accessor :value
|
66
67
|
|
67
68
|
#-----------------------------------
|
68
69
|
def set_infix!
|
69
70
|
@infix=true
|
70
71
|
end
|
71
72
|
|
73
|
+
#-----------------------------------
|
74
|
+
def unary= flag
|
75
|
+
@infix=!flag
|
76
|
+
end
|
77
|
+
|
72
78
|
#-----------------------------------
|
73
79
|
def infix?
|
74
80
|
@infix ||= nil
|
75
81
|
end
|
76
82
|
def prefix?; !infix? end
|
83
|
+
alias unary prefix?
|
77
84
|
|
78
85
|
#-----------------------------------
|
79
86
|
def has_end!
|
@@ -103,9 +110,16 @@ end
|
|
103
110
|
#-------------------------
|
104
111
|
class OperatorToken < WToken
|
105
112
|
attr_accessor :unary
|
113
|
+
attr_writer :as
|
106
114
|
alias prefix? unary
|
107
115
|
def infix?; !prefix? end
|
108
116
|
|
117
|
+
def as
|
118
|
+
return @as if defined? @as
|
119
|
+
if tag and ident[/^[,*&]$/]
|
120
|
+
tag.to_s+ident
|
121
|
+
end
|
122
|
+
end
|
109
123
|
end
|
110
124
|
|
111
125
|
|
@@ -212,6 +226,8 @@ class StringToken < Token
|
|
212
226
|
|
213
227
|
attr_accessor :open #exact sequence of chars used to start the str
|
214
228
|
attr_accessor :close #exact seq of (1) char to stop the str
|
229
|
+
|
230
|
+
attr_accessor :lvars #names used in named backrefs if this is a regex
|
215
231
|
|
216
232
|
def with_line(line)
|
217
233
|
@line=line
|
@@ -255,16 +271,16 @@ class StringToken < Token
|
|
255
271
|
ender=close
|
256
272
|
elems.each{|e|
|
257
273
|
case e
|
258
|
-
when String
|
274
|
+
when String; result<<e
|
259
275
|
# strfrag=translate_escapes strfrag if RubyLexer::FASTER_STRING_ESCAPES
|
260
276
|
# result << send(transname,strfrag,starter,ender)
|
261
|
-
when VarNameToken
|
277
|
+
when VarNameToken;
|
262
278
|
if /^[$@]/===e.to_s
|
263
279
|
result << '#' + e.to_s
|
264
280
|
else
|
265
281
|
result << "\#{#{e}}"
|
266
282
|
end
|
267
|
-
when RubyCode
|
283
|
+
when RubyCode; result << '#' + e.to_s
|
268
284
|
else fail
|
269
285
|
end
|
270
286
|
}
|
@@ -429,7 +445,7 @@ class HerePlaceholderToken < WToken
|
|
429
445
|
|
430
446
|
#@termex=/^#{'[\s\v]*' if dash}#{Regexp.escape ender}$/
|
431
447
|
@termex=Regexp.new \
|
432
|
-
["^", ('[\s\v]*' if dash), Regexp.escape(ender), "$"].
|
448
|
+
["^", ('[\s\v]*' if dash), Regexp.escape(ender), "$"].join
|
433
449
|
@bodyclass=HereBodyToken
|
434
450
|
end
|
435
451
|
|
@@ -442,7 +458,7 @@ class HerePlaceholderToken < WToken
|
|
442
458
|
else
|
443
459
|
@ender
|
444
460
|
end
|
445
|
-
return ["<<",@dash,@quote_real&&@quote,result,@quote_real&&@quote].
|
461
|
+
return ["<<",@dash,@quote_real&&@quote,result,@quote_real&&@quote].join
|
446
462
|
# else
|
447
463
|
# assert !unsafe_to_use
|
448
464
|
# return @string.to_s
|
@@ -557,7 +573,7 @@ EndDefHeaderToken=EndHeaderToken
|
|
557
573
|
|
558
574
|
#-------------------------
|
559
575
|
class EscNlToken < IgnoreToken
|
560
|
-
def initialize(
|
576
|
+
def initialize(ident,offset,filename=nil,linenum=nil)
|
561
577
|
super(ident,offset)
|
562
578
|
#@char='\\'
|
563
579
|
@filename=filename
|
@@ -87,9 +87,9 @@ end
|
|
87
87
|
end end
|
88
88
|
class ZwToken; def ws_munge(tp)
|
89
89
|
case tp.showzw
|
90
|
-
when 2
|
91
|
-
when 1
|
92
|
-
when 0
|
90
|
+
when 2; explicit_form_all
|
91
|
+
when 1; explicit_form
|
92
|
+
when 0; nil
|
93
93
|
else raise 'unknown showzw'
|
94
94
|
end
|
95
95
|
end end
|
@@ -117,7 +117,7 @@ class KeepWsTokenPrinter
|
|
117
117
|
def pprint(tok,output=$stdout)
|
118
118
|
@accum<<aprint(tok).to_s
|
119
119
|
if (@accum.size>ACCUMSIZE and NewlineToken===tok) or EoiToken===tok
|
120
|
-
output.print(@accum)
|
120
|
+
output.print(@accum.join)
|
121
121
|
@accum=[]
|
122
122
|
end
|
123
123
|
end
|
@@ -139,10 +139,10 @@ class KeepWsTokenPrinter
|
|
139
139
|
result=
|
140
140
|
case tok
|
141
141
|
when ZwToken,EoiToken,NoWsToken, HereBodyToken, NewlineToken,
|
142
|
-
ImplicitParamListStartToken,ImplicitParamListEndToken
|
142
|
+
ImplicitParamListStartToken,ImplicitParamListEndToken;
|
143
143
|
tok
|
144
144
|
else
|
145
|
-
|
145
|
+
@sep.dup<<tok.to_s
|
146
146
|
end unless NoWsToken===lasttok
|
147
147
|
|
148
148
|
if str_needs_escnls
|
data/lib/rubylexer/version.rb
CHANGED
data/rubylexer.gemspec
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require "#{File.dirname(__FILE__)}/lib/rubylexer/version"
|
4
|
+
RubyLexer::Description=open("README.txt"){|f| f.read[/^==+ ?description[^\n]*?\n *\n?(.*?\n *\n.*?)\n *\n/im,1] }
|
5
|
+
RubyLexer::Latest_changes="###"+open("History.txt"){|f| f.read[/\A===(.*?)(?====)/m,1] }
|
6
|
+
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = "rubylexer"
|
9
|
+
s.version = RubyLexer::VERSION
|
10
|
+
s.date = Time.now.strftime("%Y-%m-%d")
|
11
|
+
s.authors = ["Caleb Clausen"]
|
12
|
+
s.email = %q{caleb (at) inforadical (dot) net}
|
13
|
+
s.summary = "RubyLexer is a lexer library for Ruby, written in Ruby."
|
14
|
+
s.description = RubyLexer::Description
|
15
|
+
s.homepage = %{http://github.com/coatl/rubylexer}
|
16
|
+
s.rubyforge_project = %q{rubylexer}
|
17
|
+
|
18
|
+
s.files = `git ls-files`.split
|
19
|
+
s.test_files = %w[test/test_all.rb]
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
s.extra_rdoc_files = ["README.txt", "COPYING"]
|
22
|
+
s.has_rdoc = true
|
23
|
+
s.rdoc_options = %w[--main README.txt]
|
24
|
+
|
25
|
+
s.rubygems_version = %q{1.3.0}
|
26
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
27
|
+
|
28
|
+
if s.respond_to? :specification_version then
|
29
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
30
|
+
s.specification_version = 2
|
31
|
+
|
32
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
33
|
+
s.add_runtime_dependency("sequence", [">= 0.2.3"])
|
34
|
+
else
|
35
|
+
s.add_dependency("sequence", [">= 0.2.3"])
|
36
|
+
end
|
37
|
+
else
|
38
|
+
s.add_dependency("sequence", [">= 0.2.3"])
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rubylexer'
|
3
|
+
require 'term/ansicolor'
|
4
|
+
|
5
|
+
|
6
|
+
def coloruby file,fd=open(file)
|
7
|
+
lexer=RubyLexer.new(file,fd)
|
8
|
+
begin
|
9
|
+
token=lexer.get1token
|
10
|
+
print token.colorize
|
11
|
+
end until RubyLexer::EoiToken===token
|
12
|
+
ensure
|
13
|
+
print Term::ANSIColor.reset
|
14
|
+
end
|
15
|
+
|
16
|
+
class RubyLexer
|
17
|
+
class Token
|
18
|
+
include Term::ANSIColor
|
19
|
+
|
20
|
+
def colorize
|
21
|
+
color+ident.to_s
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class VarNameToken
|
26
|
+
alias color blue
|
27
|
+
end
|
28
|
+
|
29
|
+
class MethNameToken
|
30
|
+
alias color green
|
31
|
+
end
|
32
|
+
|
33
|
+
class OperatorToken
|
34
|
+
alias color cyan
|
35
|
+
end
|
36
|
+
|
37
|
+
class KeywordToken
|
38
|
+
def colorize
|
39
|
+
if /[^a-z]/i===ident
|
40
|
+
yellow+ident
|
41
|
+
else
|
42
|
+
red+ident
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class WsToken
|
48
|
+
def colorize
|
49
|
+
black+ident
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
class NewlineToken
|
54
|
+
alias color black
|
55
|
+
end
|
56
|
+
|
57
|
+
class ZwToken
|
58
|
+
def colorize; '' end
|
59
|
+
end
|
60
|
+
|
61
|
+
class FileAndLineToken
|
62
|
+
def colorize; '' end
|
63
|
+
end
|
64
|
+
|
65
|
+
class ImplicitParamListStartToken
|
66
|
+
def colorize; '' end
|
67
|
+
end
|
68
|
+
|
69
|
+
class ImplicitParamListEndToken
|
70
|
+
def colorize; '' end
|
71
|
+
end
|
72
|
+
|
73
|
+
class IgnoreToken
|
74
|
+
def colorize
|
75
|
+
dark+green+ident+reset
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
class EscNlToken
|
80
|
+
def colorize
|
81
|
+
yellow+ident
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
class NumberToken
|
86
|
+
def colorize
|
87
|
+
dark+blue+ident+reset
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
class SymbolToken
|
92
|
+
def colorize
|
93
|
+
if StringToken===ident
|
94
|
+
dark+blue+':'+ident.colorize+reset
|
95
|
+
else
|
96
|
+
dark+blue+ident+reset
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
class StringToken
|
102
|
+
def colorize
|
103
|
+
magenta+open+
|
104
|
+
elems.map{|elem|
|
105
|
+
if String===elem
|
106
|
+
magenta+elem
|
107
|
+
else
|
108
|
+
yellow+'#'+elem.colorize
|
109
|
+
end
|
110
|
+
}.join+
|
111
|
+
magenta+close
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
class RubyCode
|
116
|
+
def colorize
|
117
|
+
ident.map{|tok| tok.colorize }.join
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
class HerePlaceholderToken
|
122
|
+
def colorize
|
123
|
+
"#{blue}<<#{'-' if @dash}#{ender}"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
class HereBodyToken
|
128
|
+
def colorize
|
129
|
+
headtok.string.colorize
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
class EoiToken
|
134
|
+
def colorize
|
135
|
+
return '' #gyaah, @offset has off by one errors
|
136
|
+
data=begin
|
137
|
+
@file.pos=@offset-1
|
138
|
+
@file.read
|
139
|
+
rescue
|
140
|
+
@file[@offset-1..-1]
|
141
|
+
end
|
142
|
+
dark+green+data+reset
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
if __FILE__==$0
|
148
|
+
if ARGV.first=='-e'
|
149
|
+
coloruby ARGV[1],ARGV[1]
|
150
|
+
else
|
151
|
+
coloruby ARGV.first
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|