-
Notifications
You must be signed in to change notification settings - Fork 24
Expand file tree
/
Copy pathsym.rb
More file actions
157 lines (150 loc) · 3.5 KB
/
Copy pathsym.rb
File metadata and controls
157 lines (150 loc) · 3.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
require 'atom'
require 'quoted'
module Tokens
class Sym
def self.expect(s)
return nil if s.peek != ?:
s.get
buf = Atom.expect(s)
# If we got an atom (like 'a'), check if it's followed by '=' to form a setter symbol (like ':a=')
# BUT: don't consume '=' if it's part of '=>' (hash rocket)
if buf && s.peek == ?=
s.get # consume '='
if s.peek == ?>
# This is '=>' (hash rocket), not a setter symbol - unget the '='
s.unget("=")
else
# This is a setter symbol like ':a='
buf = "#{buf}=".to_sym
end
end
bs = ":#{buf.to_s}"
return bs.to_sym if buf
# Check for operator symbols BEFORE Quoted.expect
# because some operators (like %) can start string literals
# Lots more operators are legal.
# FIXME: Need to check which set is legal - it's annoying inconsistent it appears
if s.peek == ?[
s.get
if s.peek == ?]
s.get
if s.peek == ?=
s.get
return :":[]="
end
return :":[]"
end
s.unget("[")
elsif s.peek == ?/
s.get
return :":/"
elsif s.peek == ?-
s.get
if s.peek == ?@
s.get
return :":-@"
end
return :":-"
elsif s.peek == ?+
s.get
if s.peek == ?@
s.get
return :":+@"
end
return :":+"
elsif s.peek == ?%
s.get
return :":%"
elsif s.peek == ?*
s.get
if s.peek == ?*
s.get
return :":**"
end
return :":*"
elsif s.peek == ?=
s.get
if s.peek == ?=
s.get
if s.peek == ?=
s.get
return :":==="
end
return :":=="
elsif s.peek == ?~
s.get
return :":=~"
end
return :":="
elsif s.peek == ?<
s.get
if s.peek == ?<
s.get
return :":<<"
elsif s.peek == ?=
s.get
if s.peek == ?>
s.get
return ":<=>".to_sym
end
return :":<="
end
return :":<"
elsif s.peek == ?>
s.get
if s.peek == ?>
s.get
return :":>>"
elsif s.peek == ?=
s.get
return :":>="
end
return :":>"
elsif s.peek == ?&
s.get
if s.peek == ?&
# Don't consume second & - :&& is not a valid symbol, && is a keyword
s.unget("&")
return nil
end
return :":&"
elsif s.peek == ?|
s.get
if s.peek == ?|
# Don't consume second | - :|| is not a valid symbol, || is a keyword
s.unget("|")
return nil
end
return :":|"
elsif s.peek == ?^
s.get
return :":^"
elsif s.peek == ?~
s.get
return :":~"
elsif s.peek == ?!
s.get
if s.peek == ?=
s.get
if s.peek == ?=
s.get
return :":!=="
end
return :":!="
end
return :":!"
end
c = s.peek
buf = Quoted.expect(s)
if buf
# Prefix with : to mark as symbol
# For empty string, ":".to_sym gives symbol with name ":"
# which when [1..-1] stripped gives ""
bs = ":#{buf.to_s}"
return bs.to_sym
end
s.unget(":")
return nil
end
end
end