rb8-trepanning 0.1.3-universal-ruby-1.9.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (274) hide show
  1. data/.gitignore +3 -0
  2. data/CHANGES +34 -0
  3. data/ChangeLog +875 -0
  4. data/README.textile +59 -0
  5. data/Rakefile +215 -0
  6. data/app/.gitignore +1 -0
  7. data/app/cmd_parse.kpeg +241 -0
  8. data/app/cmd_parse.rb +212 -0
  9. data/app/cmd_parser.rb +1948 -0
  10. data/app/complete.rb +79 -0
  11. data/app/default.rb +90 -0
  12. data/app/display.rb +148 -0
  13. data/app/eventbuffer.rb +147 -0
  14. data/app/frame.rb +166 -0
  15. data/app/irb.rb +114 -0
  16. data/app/options.rb +200 -0
  17. data/app/run.rb +74 -0
  18. data/app/util.rb +65 -0
  19. data/bin/.gitignore +1 -0
  20. data/bin/trepan8 +115 -0
  21. data/data/.gitignore +1 -0
  22. data/data/irbrc +41 -0
  23. data/interface/.gitignore +1 -0
  24. data/interface/base_intf.rb +109 -0
  25. data/interface/client.rb +82 -0
  26. data/interface/comcodes.rb +20 -0
  27. data/interface/script.rb +110 -0
  28. data/interface/server.rb +147 -0
  29. data/interface/user.rb +165 -0
  30. data/io/base_io.rb +148 -0
  31. data/io/input.rb +158 -0
  32. data/io/null_output.rb +46 -0
  33. data/io/string_array.rb +156 -0
  34. data/io/tcpclient.rb +129 -0
  35. data/io/tcpfns.rb +33 -0
  36. data/io/tcpserver.rb +141 -0
  37. data/lib/debugger.rb +8 -0
  38. data/lib/trepanning.rb +283 -0
  39. data/processor/.gitignore +1 -0
  40. data/processor/command-ruby-debug/breakpoints.rb +155 -0
  41. data/processor/command-ruby-debug/catchpoint.rb +55 -0
  42. data/processor/command-ruby-debug/condition.rb +49 -0
  43. data/processor/command-ruby-debug/control.rb +31 -0
  44. data/processor/command-ruby-debug/display.rb +120 -0
  45. data/processor/command-ruby-debug/enable.rb +202 -0
  46. data/processor/command-ruby-debug/frame.rb +199 -0
  47. data/processor/command-ruby-debug/help.rb +63 -0
  48. data/processor/command-ruby-debug/info.rb +359 -0
  49. data/processor/command-ruby-debug/method.rb +84 -0
  50. data/processor/command-ruby-debug/reload.rb +40 -0
  51. data/processor/command-ruby-debug/save.rb +90 -0
  52. data/processor/command-ruby-debug/set.rb +237 -0
  53. data/processor/command-ruby-debug/show.rb +251 -0
  54. data/processor/command-ruby-debug/source.rb +36 -0
  55. data/processor/command-ruby-debug/threads.rb +189 -0
  56. data/processor/command-ruby-debug/trace.rb +57 -0
  57. data/processor/command-ruby-debug/variables.rb +199 -0
  58. data/processor/command.rb +270 -0
  59. data/processor/command/.gitignore +1 -0
  60. data/processor/command/alias.rb +54 -0
  61. data/processor/command/backtrace.rb +123 -0
  62. data/processor/command/base/cmd.rb +177 -0
  63. data/processor/command/base/subcmd.rb +230 -0
  64. data/processor/command/base/submgr.rb +188 -0
  65. data/processor/command/base/subsubcmd.rb +128 -0
  66. data/processor/command/base/subsubmgr.rb +199 -0
  67. data/processor/command/break.rb +114 -0
  68. data/processor/command/catch.rb +71 -0
  69. data/processor/command/complete.rb +39 -0
  70. data/processor/command/continue.rb +57 -0
  71. data/processor/command/directory.rb +50 -0
  72. data/processor/command/disable.rb +85 -0
  73. data/processor/command/display.rb +78 -0
  74. data/processor/command/down.rb +54 -0
  75. data/processor/command/edit.rb +79 -0
  76. data/processor/command/enable.rb +48 -0
  77. data/processor/command/eval.rb +90 -0
  78. data/processor/command/exit.rb +66 -0
  79. data/processor/command/finish.rb +59 -0
  80. data/processor/command/frame.rb +97 -0
  81. data/processor/command/help.rb +230 -0
  82. data/processor/command/help/.gitignore +1 -0
  83. data/processor/command/help/README +10 -0
  84. data/processor/command/help/command.txt +58 -0
  85. data/processor/command/help/examples.txt +16 -0
  86. data/processor/command/help/filename.txt +40 -0
  87. data/processor/command/help/location.txt +37 -0
  88. data/processor/command/help/suffixes.txt +17 -0
  89. data/processor/command/info.rb +28 -0
  90. data/processor/command/info_subcmd/.gitignore +1 -0
  91. data/processor/command/info_subcmd/args.rb +39 -0
  92. data/processor/command/info_subcmd/breakpoints.rb +80 -0
  93. data/processor/command/info_subcmd/catch.rb +36 -0
  94. data/processor/command/info_subcmd/files.rb +39 -0
  95. data/processor/command/info_subcmd/globals.rb +64 -0
  96. data/processor/command/info_subcmd/line.rb +30 -0
  97. data/processor/command/info_subcmd/locals.rb +69 -0
  98. data/processor/command/info_subcmd/macro.rb +62 -0
  99. data/processor/command/info_subcmd/program.rb +51 -0
  100. data/processor/command/info_subcmd/ruby.rb +57 -0
  101. data/processor/command/info_subcmd/source.rb +74 -0
  102. data/processor/command/info_subcmd/stack.rb +25 -0
  103. data/processor/command/info_subcmd/threads.rb +75 -0
  104. data/processor/command/kill.rb +78 -0
  105. data/processor/command/list.rb +117 -0
  106. data/processor/command/macro.rb +68 -0
  107. data/processor/command/next.rb +79 -0
  108. data/processor/command/parsetree.rb +56 -0
  109. data/processor/command/pp.rb +40 -0
  110. data/processor/command/pr.rb +37 -0
  111. data/processor/command/ps.rb +40 -0
  112. data/processor/command/restart.rb +86 -0
  113. data/processor/command/save.rb +58 -0
  114. data/processor/command/set.rb +47 -0
  115. data/processor/command/set_subcmd/.gitignore +1 -0
  116. data/processor/command/set_subcmd/abbrev.rb +25 -0
  117. data/processor/command/set_subcmd/auto.rb +27 -0
  118. data/processor/command/set_subcmd/auto_subcmd/.gitignore +1 -0
  119. data/processor/command/set_subcmd/auto_subcmd/eval.rb +53 -0
  120. data/processor/command/set_subcmd/auto_subcmd/irb.rb +33 -0
  121. data/processor/command/set_subcmd/auto_subcmd/list.rb +33 -0
  122. data/processor/command/set_subcmd/basename.rb +25 -0
  123. data/processor/command/set_subcmd/callstyle.rb +46 -0
  124. data/processor/command/set_subcmd/confirm.rb +24 -0
  125. data/processor/command/set_subcmd/debug.rb +47 -0
  126. data/processor/command/set_subcmd/different.rb +61 -0
  127. data/processor/command/set_subcmd/highlight.rb +43 -0
  128. data/processor/command/set_subcmd/max.rb +26 -0
  129. data/processor/command/set_subcmd/max_subcmd/list.rb +49 -0
  130. data/processor/command/set_subcmd/max_subcmd/stack.rb +50 -0
  131. data/processor/command/set_subcmd/max_subcmd/string.rb +76 -0
  132. data/processor/command/set_subcmd/max_subcmd/width.rb +49 -0
  133. data/processor/command/set_subcmd/reload.rb +42 -0
  134. data/processor/command/set_subcmd/timer.rb +58 -0
  135. data/processor/command/set_subcmd/trace.rb +37 -0
  136. data/processor/command/set_subcmd/trace_subcmd/buffer.rb +42 -0
  137. data/processor/command/set_subcmd/trace_subcmd/print.rb +41 -0
  138. data/processor/command/shell.rb +139 -0
  139. data/processor/command/show.rb +39 -0
  140. data/processor/command/show_subcmd/.gitignore +1 -0
  141. data/processor/command/show_subcmd/abbrev.rb +20 -0
  142. data/processor/command/show_subcmd/alias.rb +46 -0
  143. data/processor/command/show_subcmd/args.rb +34 -0
  144. data/processor/command/show_subcmd/auto.rb +28 -0
  145. data/processor/command/show_subcmd/auto_subcmd/eval.rb +27 -0
  146. data/processor/command/show_subcmd/auto_subcmd/irb.rb +23 -0
  147. data/processor/command/show_subcmd/auto_subcmd/list.rb +22 -0
  148. data/processor/command/show_subcmd/basename.rb +20 -0
  149. data/processor/command/show_subcmd/callstyle.rb +22 -0
  150. data/processor/command/show_subcmd/confirm.rb +18 -0
  151. data/processor/command/show_subcmd/debug.rb +26 -0
  152. data/processor/command/show_subcmd/debug_subcmd/dbgr.rb +21 -0
  153. data/processor/command/show_subcmd/debug_subcmd/skip.rb +22 -0
  154. data/processor/command/show_subcmd/debug_subcmd/step.rb +22 -0
  155. data/processor/command/show_subcmd/different.rb +26 -0
  156. data/processor/command/show_subcmd/directories.rb +22 -0
  157. data/processor/command/show_subcmd/highlight.rb +24 -0
  158. data/processor/command/show_subcmd/max.rb +27 -0
  159. data/processor/command/show_subcmd/max_subcmd/list.rb +38 -0
  160. data/processor/command/show_subcmd/max_subcmd/stack.rb +36 -0
  161. data/processor/command/show_subcmd/max_subcmd/string.rb +42 -0
  162. data/processor/command/show_subcmd/max_subcmd/width.rb +37 -0
  163. data/processor/command/show_subcmd/reload.rb +18 -0
  164. data/processor/command/show_subcmd/timer.rb +18 -0
  165. data/processor/command/show_subcmd/trace.rb +29 -0
  166. data/processor/command/show_subcmd/trace_subcmd/buffer.rb +65 -0
  167. data/processor/command/show_subcmd/trace_subcmd/print.rb +23 -0
  168. data/processor/command/show_subcmd/version.rb +23 -0
  169. data/processor/command/source.rb +134 -0
  170. data/processor/command/step.rb +81 -0
  171. data/processor/command/tbreak.rb +19 -0
  172. data/processor/command/unalias.rb +44 -0
  173. data/processor/command/undisplay.rb +59 -0
  174. data/processor/command/up.rb +72 -0
  175. data/processor/default.rb +56 -0
  176. data/processor/display.rb +17 -0
  177. data/processor/eval.rb +113 -0
  178. data/processor/eventbuf.rb +105 -0
  179. data/processor/frame.rb +172 -0
  180. data/processor/help.rb +92 -0
  181. data/processor/helper.rb +76 -0
  182. data/processor/hook.rb +134 -0
  183. data/processor/load_cmds.rb +258 -0
  184. data/processor/location.rb +174 -0
  185. data/processor/main.rb +455 -0
  186. data/processor/mock.rb +136 -0
  187. data/processor/msg.rb +61 -0
  188. data/processor/processor.rb +674 -0
  189. data/processor/running.rb +168 -0
  190. data/processor/stepping.rb +18 -0
  191. data/processor/subcmd.rb +161 -0
  192. data/processor/validate.rb +355 -0
  193. data/processor/virtual.rb +34 -0
  194. data/test/data/.gitignore +1 -0
  195. data/test/data/break_bad.cmd +19 -0
  196. data/test/data/break_bad.right +29 -0
  197. data/test/data/break_loop_bug.cmd +5 -0
  198. data/test/data/break_loop_bug.right +15 -0
  199. data/test/data/dollar-0.right +2 -0
  200. data/test/data/dollar-0a.right +2 -0
  201. data/test/data/dollar-0b.right +2 -0
  202. data/test/data/edit.cmd +14 -0
  203. data/test/data/edit.right +24 -0
  204. data/test/data/file-with-space.cmd +6 -0
  205. data/test/data/file-with-space.right +4 -0
  206. data/test/data/printvar.cmd +17 -0
  207. data/test/data/printvar.right +31 -0
  208. data/test/data/raise.cmd +11 -0
  209. data/test/data/raise.right +19 -0
  210. data/test/data/source.cmd +5 -0
  211. data/test/data/source.right +18 -0
  212. data/test/data/stepping-1.9.right +50 -0
  213. data/test/data/stepping.cmd +21 -0
  214. data/test/data/stepping.right +48 -0
  215. data/test/data/trepan8-save.1 +6 -0
  216. data/test/example/bp_loop_issue.rb +3 -0
  217. data/test/example/break-bug.rb +7 -0
  218. data/test/example/brkpt-class-bug.rb +8 -0
  219. data/test/example/classes.rb +11 -0
  220. data/test/example/dollar-0.rb +5 -0
  221. data/test/example/except-bug1.rb +4 -0
  222. data/test/example/except-bug2.rb +7 -0
  223. data/test/example/file with space.rb +1 -0
  224. data/test/example/gcd.rb +18 -0
  225. data/test/example/info-var-bug.rb +47 -0
  226. data/test/example/info-var-bug2.rb +2 -0
  227. data/test/example/null.rb +1 -0
  228. data/test/example/pm-bug.rb +3 -0
  229. data/test/example/pm.rb +11 -0
  230. data/test/example/raise.rb +3 -0
  231. data/test/integration/.gitignore +4 -0
  232. data/test/integration/config.yaml +8 -0
  233. data/test/integration/helper.rb +154 -0
  234. data/test/integration/test-break_bad.rb +26 -0
  235. data/test/integration/test-dollar-0.rb +31 -0
  236. data/test/integration/test-edit.rb +17 -0
  237. data/test/integration/test-file-with-space.rb +26 -0
  238. data/test/integration/test-printvar.rb +17 -0
  239. data/test/integration/test-raise.rb +21 -0
  240. data/test/integration/test-source.rb +16 -0
  241. data/test/integration/test-stepping.rb +24 -0
  242. data/test/unit/.gitignore +1 -0
  243. data/test/unit/cmd-helper.rb +52 -0
  244. data/test/unit/mock-helper.rb +12 -0
  245. data/test/unit/test-app-cmd_parse.rb +97 -0
  246. data/test/unit/test-app-cmd_parser.rb +23 -0
  247. data/test/unit/test-app-complete.rb +39 -0
  248. data/test/unit/test-app-frame.rb +32 -0
  249. data/test/unit/test-app-options.rb +92 -0
  250. data/test/unit/test-app-run.rb +14 -0
  251. data/test/unit/test-app-util.rb +44 -0
  252. data/test/unit/test-base-cmd.rb +45 -0
  253. data/test/unit/test-base-subcmd.rb +57 -0
  254. data/test/unit/test-base-submgr.rb +23 -0
  255. data/test/unit/test-base-subsubcmd.rb +17 -0
  256. data/test/unit/test-cmd-alias.rb +48 -0
  257. data/test/unit/test-cmd-exit.rb +27 -0
  258. data/test/unit/test-cmd-help.rb +104 -0
  259. data/test/unit/test-cmd-kill.rb +46 -0
  260. data/test/unit/test-cmd-source.rb +34 -0
  261. data/test/unit/test-completion.rb +42 -0
  262. data/test/unit/test-intf-user.rb +46 -0
  263. data/test/unit/test-io-input.rb +27 -0
  264. data/test/unit/test-io-tcp.rb +33 -0
  265. data/test/unit/test-io-tcpclient.rb +54 -0
  266. data/test/unit/test-io-tcpfns.rb +17 -0
  267. data/test/unit/test-io-tcpserver.rb +50 -0
  268. data/test/unit/test-proc-eval.rb +36 -0
  269. data/test/unit/test-proc-hook.rb +30 -0
  270. data/test/unit/test-proc-load_cmds.rb +50 -0
  271. data/test/unit/test-proc-location.rb +79 -0
  272. data/test/unit/test-subcmd-help.rb +44 -0
  273. data/trepan8.gemspec +58 -0
  274. metadata +388 -0
data/app/cmd_parse.rb ADDED
@@ -0,0 +1,212 @@
1
+ # use_grammar.rb
2
+ require 'rubygems'
3
+ require 'require_relative'
4
+ require_relative 'cmd_parser'
5
+
6
+ module Trepan
7
+ module CmdParser
8
+
9
+ module_function
10
+ # Given a KPeg parse object, return the method of that parse or raise a
11
+ # Name error if we can't find a method. parent_class is the parent class of
12
+ # the object we've found so far and "binding" is used if we need
13
+ # to use eval to find the method.
14
+ def resolve_method(m, bind, parent_class = nil)
15
+ name = m.name
16
+ # DEBUG p name
17
+ errmsg = nil
18
+ if m.type == :constant
19
+ begin
20
+ if parent_class
21
+ klass = parent_class.const_get(m.chain[0].name)
22
+ else
23
+ errmsg = "Constant #{m} is not a class or module"
24
+ raise NameError, errmsg unless m.chain[0]
25
+ klass = eval(m.chain[0].name, bind)
26
+ end
27
+ errmsg = "Constant #{klass} is not a class or module" unless
28
+ raise NameError, errmsg unless
29
+ klass.kind_of?(Class) or klass.kind_of?(Module)
30
+ m = m.chain[1]
31
+ if klass.instance_methods.member?('binding')
32
+ bind = klass.bind
33
+ elsif klass.private_instance_methods.member?('binding')
34
+ bind = klass.send(:binding)
35
+ else
36
+ bind = nil
37
+ end
38
+ resolve_method(m, bind, klass)
39
+ rescue NameError
40
+ errmsg ||= "Can't resolve constant #{name}"
41
+ raise NameError, errmsg
42
+ end
43
+ else
44
+ is_class =
45
+ begin
46
+ m.chain && m.chain[0] &&
47
+ Class == eval("#{m.chain[0].name}.class", bind)
48
+ rescue
49
+ false
50
+ end
51
+ if is_class
52
+ # Handles stuff like:
53
+ # x = File
54
+ # x.basename
55
+ # Above, we tested we get a class back when we evalate m.chain[0]
56
+ # below. So it is safe to run the eval.
57
+ klass = eval("#{m.chain[0].name}", bind)
58
+ resolve_method(m.chain[1], klass.send(:binding), klass)
59
+ else
60
+ begin
61
+ errmsg = "Can't get method for #{name.inspect}"
62
+ if m.chain && m.chain[0]
63
+ parent_obj = eval("#{m.chain[0].name}", bind) if !parent_class && bind
64
+ end
65
+ parent = parent_class || parent_obj
66
+ meth =
67
+ if parent
68
+ errmsg << "in #{parent}"
69
+ lookup_name = m.chain && m.chain[1] ? m.chain[1].name : name
70
+ if parent.respond_to?('instance_methods') &&
71
+ (parent.instance_methods.member?(lookup_name) ||
72
+ parent.instance_methods.member?(lookup_name.to_sym))
73
+ parent.instance_method(lookup_name) ||
74
+ parent.instance_method(lookup_name.to_sym)
75
+ elsif parent.respond_to?('methods')
76
+ parent.method(lookup_name)
77
+ end
78
+ elsif m.chain && m.chain[1]
79
+ eval("#{m.chain[0].name}.method(#{lookup_name.name.inspect})", bind)
80
+ else
81
+ eval("self.method(#{name.inspect})", bind)
82
+ end
83
+ return meth
84
+ rescue
85
+ raise NameError, errmsg
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ # Return the method by evaluating parse_struct.
92
+ # nil is returned if we can't parse str
93
+ def meth_for_parse_struct(parse_struct, start_binding)
94
+ resolve_method(parse_struct, start_binding)
95
+ end
96
+
97
+ # Parse str and return the method associated with that.
98
+ # nil is returned if we can't parse str
99
+ def meth_for_string(str, start_binding)
100
+ @cp ? @cp.setup_parser(str) : @cp = CmdParse.new(str)
101
+ begin
102
+ if @cp._class_module_chain
103
+ # Did we match all of it?
104
+ if @cp.result.name == str.strip
105
+ meth_for_parse_struct(@cp.result, start_binding)
106
+ else
107
+ nil
108
+ end
109
+ else
110
+ # FIXME: change to raise ParseError?
111
+ nil
112
+ end
113
+ rescue NameError
114
+ return nil
115
+ end
116
+ end
117
+
118
+ def parse_terminal(terminal_name, loc_str, opts={})
119
+ @cp ? @cp.setup_parser(loc_str) : @cp = CmdParse.new(loc_str, opts)
120
+ @cp.send(terminal_name) ? @cp : nil
121
+ end
122
+
123
+ def parse_location(loc_str, opts={})
124
+ parse = parse_terminal(:_location, loc_str, opts)
125
+ parse ? parse.result : nil
126
+ end
127
+
128
+ def parse_breakpoint(str, opts={})
129
+ parse = parse_terminal(:_breakpoint_stmt, str, opts)
130
+ parse ? parse.result : nil
131
+ end
132
+
133
+ def parse_breakpoint_no_condition(str, opts={})
134
+ parse = parse_terminal(:_breakpoint_stmt_no_condition, str, opts)
135
+ parse ? parse.result : nil
136
+ end
137
+
138
+ def parse_list(str, opts={})
139
+ parse = parse_terminal(:_list_stmt, str, opts)
140
+ parse ? parse.result : nil
141
+ end
142
+ end
143
+ end
144
+
145
+ if __FILE__ == $0
146
+ # Demo it.
147
+ %w(a a1 $global __FILE__ Constant 0 1e10 a.b).each do |name|
148
+ cp = CmdParse.new(name)
149
+ if cp._identifier && cp.result.name == name
150
+ p [cp.string, cp.result, 'succeeded']
151
+ else
152
+ puts "#{name} failed"
153
+ end
154
+ end
155
+
156
+ %w(Object A::B A::B::C A::B::C::D A::B.c A.b.c.d A(5)
157
+ Rubinius::VariableScope::method_visibility
158
+ ).each do |name|
159
+ cp = CmdParse.new(name)
160
+ if cp._class_module_chain && cp.result.name == name
161
+ p [cp.string, cp.result, 'succeeded']
162
+ else
163
+ puts "#{name} failed"
164
+ end
165
+ end
166
+
167
+ def five; 5 end
168
+ include Trepan::CmdParser
169
+ p meth_for_string('Array.map', binding)
170
+ p meth_for_string('Rubinius::VM.backtrace', binding)
171
+ %w(five
172
+ Array.map
173
+ Rubinius::VM.backtrace
174
+ Kernel.eval
175
+ Kernel::eval).each do |str|
176
+ meth = meth_for_string(str, binding)
177
+ p meth
178
+ end
179
+ module Testing
180
+ def testing; 5 end
181
+ module_function :testing
182
+ end
183
+ p meth_for_string('Testing.testing', binding)
184
+ p meth_for_string('File.basename', binding)
185
+ x = File
186
+ # require_relative '../lib/trepanning'
187
+ # debugger
188
+ p meth_for_string('x.basename', binding)
189
+ def x.five; 5; end
190
+ p meth_for_string('x.five', binding)
191
+ p x.five
192
+
193
+ p parse_terminal(:_line_number, '5').result
194
+ p parse_terminal(:_vm_offset, '@5').result
195
+
196
+ # Location stuff
197
+ ['fn', 'fn 5', 'fn @5', '@5', '5',
198
+ '../test/example/test\ fname\ with\ blank.rb'].each do |location|
199
+ p parse_location(location)
200
+ end
201
+
202
+ # require_relative '../lib/trepanning'; debugger
203
+ # parse_location('../test/example/test\ fname\ with\ blank.rb')
204
+
205
+ # Location stuff
206
+ ['fn if a > b', 'fn 5 unless c > d', 'fn:5 if x', '@5', '5'].each do |str|
207
+ p parse_breakpoint(str)
208
+ end
209
+
210
+
211
+ end
212
+
data/app/cmd_parser.rb ADDED
@@ -0,0 +1,1948 @@
1
+ class CmdParse
2
+ # STANDALONE START
3
+ def setup_parser(str, debug=false)
4
+ @string = str
5
+ @pos = 0
6
+ @memoizations = Hash.new { |h,k| h[k] = {} }
7
+ @result = nil
8
+ @failing_offset = -1
9
+ @expected_string = []
10
+
11
+ enhance_errors! if debug
12
+ end
13
+
14
+ # This is distinct from setup_parser so that a standalone parser
15
+ # can redefine #initialize and still have access to the proper
16
+ # parser setup code.
17
+ #
18
+ def initialize(str, debug=false)
19
+ setup_parser(str, debug)
20
+ end
21
+
22
+ attr_reader :string
23
+ attr_reader :result, :failing_offset, :expected_string
24
+ attr_accessor :pos
25
+
26
+ # STANDALONE START
27
+ def current_column(target=pos)
28
+ offset = 0
29
+ string.each_line do |line|
30
+ len = line.size
31
+ return (target - offset) if offset + len >= target
32
+ offset += len
33
+ end
34
+
35
+ -1
36
+ end
37
+
38
+ def current_line(target=pos)
39
+ cur_offset = 0
40
+ cur_line = 0
41
+
42
+ string.each_line do |line|
43
+ cur_line += 1
44
+ cur_offset += line.size
45
+ return cur_line if cur_offset >= target
46
+ end
47
+
48
+ -1
49
+ end
50
+
51
+ def lines
52
+ lines = []
53
+ string.each_line { |l| lines << l }
54
+ lines
55
+ end
56
+
57
+ def error_expectation
58
+ error_pos = failing_offset()
59
+ line_no = current_line(error_pos)
60
+ col_no = current_column(error_pos)
61
+
62
+ expected = expected_string()
63
+
64
+ prefix = nil
65
+
66
+ case expected
67
+ when String
68
+ prefix = expected.inspect
69
+ when Range
70
+ prefix = "to be between #{expected.begin} and #{expected.end}"
71
+ when Array
72
+ prefix = "to be one of #{expected.inspect}"
73
+ when nil
74
+ prefix = "anything (no more input)"
75
+ else
76
+ prefix = "unknown"
77
+ end
78
+
79
+ return "Expected #{prefix} at line #{line_no}, column #{col_no} (offset #{error_pos})"
80
+ end
81
+
82
+ def show_error(io=STDOUT)
83
+ error_pos = failing_offset()
84
+ line_no = current_line(error_pos)
85
+ col_no = current_column(error_pos)
86
+
87
+ io.puts error_expectation()
88
+ io.puts "Got: #{string[error_pos,1].inspect}"
89
+ line = lines[line_no-1]
90
+ io.puts "=> #{line}"
91
+ io.print(" " * (col_no + 3))
92
+ io.puts "^"
93
+ end
94
+
95
+ #
96
+
97
+ def get_text(start)
98
+ @string[start..@pos-1]
99
+ end
100
+
101
+ def show_pos
102
+ width = 10
103
+ if @pos < width
104
+ "#{@pos} (\"#{@string[0,@pos]}\" @ \"#{@string[@pos,width]}\")"
105
+ else
106
+ "#{@pos} (\"... #{@string[@pos - width, width]}\" @ \"#{@string[@pos,width]}\")"
107
+ end
108
+ end
109
+
110
+ def add_failure(obj)
111
+ @expected_string = obj
112
+ @failing_offset = @pos if @pos > @failing_offset
113
+ end
114
+
115
+ def match_string(str)
116
+ len = str.size
117
+ if @string[pos,len] == str
118
+ @pos += len
119
+ return str
120
+ end
121
+
122
+ add_failure(str)
123
+
124
+ return nil
125
+ end
126
+
127
+ def fail_range(start,fin)
128
+ @pos -= 1
129
+
130
+ add_failure Range.new(start, fin)
131
+ end
132
+
133
+ def scan(reg)
134
+ if m = reg.match(@string[@pos..-1])
135
+ width = m.end(0)
136
+ @pos += width
137
+ return true
138
+ end
139
+
140
+ add_failure reg
141
+
142
+ return nil
143
+ end
144
+
145
+ if "".respond_to? :getbyte
146
+ def get_byte
147
+ if @pos >= @string.size
148
+ add_failure nil
149
+ return nil
150
+ end
151
+
152
+ s = @string.getbyte @pos
153
+ @pos += 1
154
+ s
155
+ end
156
+ else
157
+ def get_byte
158
+ if @pos >= @string.size
159
+ add_failure nil
160
+ return nil
161
+ end
162
+
163
+ s = @string[@pos]
164
+ @pos += 1
165
+ s
166
+ end
167
+ end
168
+
169
+ module EnhancedErrors
170
+ def add_failure(obj)
171
+ @expected_string << obj
172
+ @failing_offset = @pos if @pos > @failing_offset
173
+ end
174
+
175
+ def match_string(str)
176
+ if ans = super
177
+ @expected_string.clear
178
+ end
179
+
180
+ ans
181
+ end
182
+
183
+ def scan(reg)
184
+ if ans = super
185
+ @expected_string.clear
186
+ end
187
+
188
+ ans
189
+ end
190
+
191
+ def get_byte
192
+ if ans = super
193
+ @expected_string.clear
194
+ end
195
+
196
+ ans
197
+ end
198
+ end
199
+
200
+ def enhance_errors!
201
+ extend EnhancedErrors
202
+ end
203
+
204
+ def parse
205
+ _root ? true : false
206
+ end
207
+
208
+ class LeftRecursive
209
+ def initialize(detected=false)
210
+ @detected = detected
211
+ end
212
+
213
+ attr_accessor :detected
214
+ end
215
+
216
+ class MemoEntry
217
+ def initialize(ans, pos)
218
+ @ans = ans
219
+ @pos = pos
220
+ @uses = 1
221
+ @result = nil
222
+ end
223
+
224
+ attr_reader :ans, :pos, :uses, :result
225
+
226
+ def inc!
227
+ @uses += 1
228
+ end
229
+
230
+ def move!(ans, pos, result)
231
+ @ans = ans
232
+ @pos = pos
233
+ @result = result
234
+ end
235
+ end
236
+
237
+ def apply(rule)
238
+ if m = @memoizations[rule][@pos]
239
+ m.inc!
240
+
241
+ prev = @pos
242
+ @pos = m.pos
243
+ if m.ans.kind_of? LeftRecursive
244
+ m.ans.detected = true
245
+ return nil
246
+ end
247
+
248
+ @result = m.result
249
+
250
+ return m.ans
251
+ else
252
+ lr = LeftRecursive.new(false)
253
+ m = MemoEntry.new(lr, @pos)
254
+ @memoizations[rule][@pos] = m
255
+ start_pos = @pos
256
+
257
+ ans = __send__ rule
258
+
259
+ m.move! ans, @pos, @result
260
+
261
+ # Don't bother trying to grow the left recursion
262
+ # if it's failing straight away (thus there is no seed)
263
+ if ans and lr.detected
264
+ return grow_lr(rule, start_pos, m)
265
+ else
266
+ return ans
267
+ end
268
+
269
+ return ans
270
+ end
271
+ end
272
+
273
+ def grow_lr(rule, start_pos, m)
274
+ while true
275
+ @pos = start_pos
276
+ @result = m.result
277
+
278
+ ans = __send__ rule
279
+ return nil unless ans
280
+
281
+ break if @pos <= m.pos
282
+
283
+ m.move! ans, @pos, @result
284
+ end
285
+
286
+ @result = m.result
287
+ @pos = m.pos
288
+ return m.ans
289
+ end
290
+
291
+ #
292
+
293
+
294
+ #####################################################
295
+ # Structure to hold composite method names
296
+ unless defined? SymbolEntry
297
+
298
+ SymbolEntry = Struct.new(:type, :name, :chain)
299
+
300
+
301
+ # Structure to hold position information
302
+ Position = Struct.new(:container_type, :container,
303
+ :position_type, :position)
304
+
305
+ # Structure to hold breakpoint information
306
+ Breakpoint = Struct.new(:position, :negate, :condition)
307
+
308
+ # Structure to hold list information
309
+ List = Struct.new(:position, :num)
310
+
311
+ DEFAULT_OPTS = {
312
+ :debug=>false,
313
+ :file_exists_proc => Proc.new{|filename|
314
+ File.readable?(filename) && !File.directory?(filename)
315
+ }
316
+ }
317
+ end
318
+
319
+ def initialize(str, opts={})
320
+ @opts = DEFAULT_OPTS.merge(opts)
321
+ setup_parser(str, opts[:debug])
322
+ @file_exists_proc = @opts[:file_exists_proc]
323
+ end
324
+
325
+
326
+
327
+
328
+
329
+ # upcase_letter = /[A-Z]/
330
+ def _upcase_letter
331
+ _tmp = scan(/\A(?-mix:[A-Z])/)
332
+ return _tmp
333
+ end
334
+
335
+ # downcase_letter = /[a-z]/
336
+ def _downcase_letter
337
+ _tmp = scan(/\A(?-mix:[a-z])/)
338
+ return _tmp
339
+ end
340
+
341
+ # suffix_letter = /[=!?]/
342
+ def _suffix_letter
343
+ _tmp = scan(/\A(?-mix:[=!?])/)
344
+ return _tmp
345
+ end
346
+
347
+ # letter = (upcase_letter | downcase_letter)
348
+ def _letter
349
+
350
+ _save = self.pos
351
+ while true # choice
352
+ _tmp = apply(:_upcase_letter)
353
+ break if _tmp
354
+ self.pos = _save
355
+ _tmp = apply(:_downcase_letter)
356
+ break if _tmp
357
+ self.pos = _save
358
+ break
359
+ end # end choice
360
+
361
+ return _tmp
362
+ end
363
+
364
+ # id_symbol = (letter | "_" | [0-9])
365
+ def _id_symbol
366
+
367
+ _save = self.pos
368
+ while true # choice
369
+ _tmp = apply(:_letter)
370
+ break if _tmp
371
+ self.pos = _save
372
+ _tmp = match_string("_")
373
+ break if _tmp
374
+ self.pos = _save
375
+ _tmp = get_byte
376
+ if _tmp
377
+ unless _tmp >= 48 and _tmp <= 57
378
+ fail_range('0', '9')
379
+ _tmp = nil
380
+ end
381
+ end
382
+ break if _tmp
383
+ self.pos = _save
384
+ break
385
+ end # end choice
386
+
387
+ return _tmp
388
+ end
389
+
390
+ # vm_identifier = < (downcase_letter | "_") id_symbol* suffix_letter? > { SymbolEntry.new(:variable, text) }
391
+ def _vm_identifier
392
+
393
+ _save = self.pos
394
+ while true # sequence
395
+ _text_start = self.pos
396
+
397
+ _save1 = self.pos
398
+ while true # sequence
399
+
400
+ _save2 = self.pos
401
+ while true # choice
402
+ _tmp = apply(:_downcase_letter)
403
+ break if _tmp
404
+ self.pos = _save2
405
+ _tmp = match_string("_")
406
+ break if _tmp
407
+ self.pos = _save2
408
+ break
409
+ end # end choice
410
+
411
+ unless _tmp
412
+ self.pos = _save1
413
+ break
414
+ end
415
+ while true
416
+ _tmp = apply(:_id_symbol)
417
+ break unless _tmp
418
+ end
419
+ _tmp = true
420
+ unless _tmp
421
+ self.pos = _save1
422
+ break
423
+ end
424
+ _save4 = self.pos
425
+ _tmp = apply(:_suffix_letter)
426
+ unless _tmp
427
+ _tmp = true
428
+ self.pos = _save4
429
+ end
430
+ unless _tmp
431
+ self.pos = _save1
432
+ end
433
+ break
434
+ end # end sequence
435
+
436
+ if _tmp
437
+ text = get_text(_text_start)
438
+ end
439
+ unless _tmp
440
+ self.pos = _save
441
+ break
442
+ end
443
+ @result = begin;
444
+ SymbolEntry.new(:variable, text)
445
+ ; end
446
+ _tmp = true
447
+ unless _tmp
448
+ self.pos = _save
449
+ end
450
+ break
451
+ end # end sequence
452
+
453
+ return _tmp
454
+ end
455
+
456
+ # variable_identifier = < (downcase_letter | "_") id_symbol* > { SymbolEntry.new(:variable, text) }
457
+ def _variable_identifier
458
+
459
+ _save = self.pos
460
+ while true # sequence
461
+ _text_start = self.pos
462
+
463
+ _save1 = self.pos
464
+ while true # sequence
465
+
466
+ _save2 = self.pos
467
+ while true # choice
468
+ _tmp = apply(:_downcase_letter)
469
+ break if _tmp
470
+ self.pos = _save2
471
+ _tmp = match_string("_")
472
+ break if _tmp
473
+ self.pos = _save2
474
+ break
475
+ end # end choice
476
+
477
+ unless _tmp
478
+ self.pos = _save1
479
+ break
480
+ end
481
+ while true
482
+ _tmp = apply(:_id_symbol)
483
+ break unless _tmp
484
+ end
485
+ _tmp = true
486
+ unless _tmp
487
+ self.pos = _save1
488
+ end
489
+ break
490
+ end # end sequence
491
+
492
+ if _tmp
493
+ text = get_text(_text_start)
494
+ end
495
+ unless _tmp
496
+ self.pos = _save
497
+ break
498
+ end
499
+ @result = begin;
500
+ SymbolEntry.new(:variable, text)
501
+ ; end
502
+ _tmp = true
503
+ unless _tmp
504
+ self.pos = _save
505
+ end
506
+ break
507
+ end # end sequence
508
+
509
+ return _tmp
510
+ end
511
+
512
+ # constant_identifier = < upcase_letter id_symbol* > { SymbolEntry.new(:constant, text) }
513
+ def _constant_identifier
514
+
515
+ _save = self.pos
516
+ while true # sequence
517
+ _text_start = self.pos
518
+
519
+ _save1 = self.pos
520
+ while true # sequence
521
+ _tmp = apply(:_upcase_letter)
522
+ unless _tmp
523
+ self.pos = _save1
524
+ break
525
+ end
526
+ while true
527
+ _tmp = apply(:_id_symbol)
528
+ break unless _tmp
529
+ end
530
+ _tmp = true
531
+ unless _tmp
532
+ self.pos = _save1
533
+ end
534
+ break
535
+ end # end sequence
536
+
537
+ if _tmp
538
+ text = get_text(_text_start)
539
+ end
540
+ unless _tmp
541
+ self.pos = _save
542
+ break
543
+ end
544
+ @result = begin;
545
+ SymbolEntry.new(:constant, text)
546
+ ; end
547
+ _tmp = true
548
+ unless _tmp
549
+ self.pos = _save
550
+ end
551
+ break
552
+ end # end sequence
553
+
554
+ return _tmp
555
+ end
556
+
557
+ # global_identifier = < "$" (constant_identifier | variable_identifier) > { SymbolEntry.new(:global, text) }
558
+ def _global_identifier
559
+
560
+ _save = self.pos
561
+ while true # sequence
562
+ _text_start = self.pos
563
+
564
+ _save1 = self.pos
565
+ while true # sequence
566
+ _tmp = match_string("$")
567
+ unless _tmp
568
+ self.pos = _save1
569
+ break
570
+ end
571
+
572
+ _save2 = self.pos
573
+ while true # choice
574
+ _tmp = apply(:_constant_identifier)
575
+ break if _tmp
576
+ self.pos = _save2
577
+ _tmp = apply(:_variable_identifier)
578
+ break if _tmp
579
+ self.pos = _save2
580
+ break
581
+ end # end choice
582
+
583
+ unless _tmp
584
+ self.pos = _save1
585
+ end
586
+ break
587
+ end # end sequence
588
+
589
+ if _tmp
590
+ text = get_text(_text_start)
591
+ end
592
+ unless _tmp
593
+ self.pos = _save
594
+ break
595
+ end
596
+ @result = begin;
597
+ SymbolEntry.new(:global, text)
598
+ ; end
599
+ _tmp = true
600
+ unless _tmp
601
+ self.pos = _save
602
+ end
603
+ break
604
+ end # end sequence
605
+
606
+ return _tmp
607
+ end
608
+
609
+ # local_internal_identifier = (constant_identifier | variable_identifier)
610
+ def _local_internal_identifier
611
+
612
+ _save = self.pos
613
+ while true # choice
614
+ _tmp = apply(:_constant_identifier)
615
+ break if _tmp
616
+ self.pos = _save
617
+ _tmp = apply(:_variable_identifier)
618
+ break if _tmp
619
+ self.pos = _save
620
+ break
621
+ end # end choice
622
+
623
+ return _tmp
624
+ end
625
+
626
+ # local_identifier = (constant_identifier | vm_identifier)
627
+ def _local_identifier
628
+
629
+ _save = self.pos
630
+ while true # choice
631
+ _tmp = apply(:_constant_identifier)
632
+ break if _tmp
633
+ self.pos = _save
634
+ _tmp = apply(:_vm_identifier)
635
+ break if _tmp
636
+ self.pos = _save
637
+ break
638
+ end # end choice
639
+
640
+ return _tmp
641
+ end
642
+
643
+ # instance_identifier = < "@" local_identifier > { SymbolEntry.new(:instance, text) }
644
+ def _instance_identifier
645
+
646
+ _save = self.pos
647
+ while true # sequence
648
+ _text_start = self.pos
649
+
650
+ _save1 = self.pos
651
+ while true # sequence
652
+ _tmp = match_string("@")
653
+ unless _tmp
654
+ self.pos = _save1
655
+ break
656
+ end
657
+ _tmp = apply(:_local_identifier)
658
+ unless _tmp
659
+ self.pos = _save1
660
+ end
661
+ break
662
+ end # end sequence
663
+
664
+ if _tmp
665
+ text = get_text(_text_start)
666
+ end
667
+ unless _tmp
668
+ self.pos = _save
669
+ break
670
+ end
671
+ @result = begin;
672
+ SymbolEntry.new(:instance, text)
673
+ ; end
674
+ _tmp = true
675
+ unless _tmp
676
+ self.pos = _save
677
+ end
678
+ break
679
+ end # end sequence
680
+
681
+ return _tmp
682
+ end
683
+
684
+ # classvar_identifier = "@@" local_identifier:id { SymbolEntry.new(:classvar, id) }
685
+ def _classvar_identifier
686
+
687
+ _save = self.pos
688
+ while true # sequence
689
+ _tmp = match_string("@@")
690
+ unless _tmp
691
+ self.pos = _save
692
+ break
693
+ end
694
+ _tmp = apply(:_local_identifier)
695
+ id = @result
696
+ unless _tmp
697
+ self.pos = _save
698
+ break
699
+ end
700
+ @result = begin;
701
+ SymbolEntry.new(:classvar, id)
702
+ ; end
703
+ _tmp = true
704
+ unless _tmp
705
+ self.pos = _save
706
+ end
707
+ break
708
+ end # end sequence
709
+
710
+ return _tmp
711
+ end
712
+
713
+ # identifier = (global_identifier | instance_identifier | classvar_identifier | local_identifier)
714
+ def _identifier
715
+
716
+ _save = self.pos
717
+ while true # choice
718
+ _tmp = apply(:_global_identifier)
719
+ break if _tmp
720
+ self.pos = _save
721
+ _tmp = apply(:_instance_identifier)
722
+ break if _tmp
723
+ self.pos = _save
724
+ _tmp = apply(:_classvar_identifier)
725
+ break if _tmp
726
+ self.pos = _save
727
+ _tmp = apply(:_local_identifier)
728
+ break if _tmp
729
+ self.pos = _save
730
+ break
731
+ end # end choice
732
+
733
+ return _tmp
734
+ end
735
+
736
+ # id_separator = < ("::" | ".") > { text }
737
+ def _id_separator
738
+
739
+ _save = self.pos
740
+ while true # sequence
741
+ _text_start = self.pos
742
+
743
+ _save1 = self.pos
744
+ while true # choice
745
+ _tmp = match_string("::")
746
+ break if _tmp
747
+ self.pos = _save1
748
+ _tmp = match_string(".")
749
+ break if _tmp
750
+ self.pos = _save1
751
+ break
752
+ end # end choice
753
+
754
+ if _tmp
755
+ text = get_text(_text_start)
756
+ end
757
+ unless _tmp
758
+ self.pos = _save
759
+ break
760
+ end
761
+ @result = begin; text ; end
762
+ _tmp = true
763
+ unless _tmp
764
+ self.pos = _save
765
+ end
766
+ break
767
+ end # end sequence
768
+
769
+ return _tmp
770
+ end
771
+
772
+ # internal_class_module_chain = (< local_internal_identifier:parent id_separator:sep internal_class_module_chain:child > { SymbolEntry.new(parent.type, text, [parent, child, sep]) } | local_identifier)
773
+ def _internal_class_module_chain
774
+
775
+ _save = self.pos
776
+ while true # choice
777
+
778
+ _save1 = self.pos
779
+ while true # sequence
780
+ _text_start = self.pos
781
+
782
+ _save2 = self.pos
783
+ while true # sequence
784
+ _tmp = apply(:_local_internal_identifier)
785
+ parent = @result
786
+ unless _tmp
787
+ self.pos = _save2
788
+ break
789
+ end
790
+ _tmp = apply(:_id_separator)
791
+ sep = @result
792
+ unless _tmp
793
+ self.pos = _save2
794
+ break
795
+ end
796
+ _tmp = apply(:_internal_class_module_chain)
797
+ child = @result
798
+ unless _tmp
799
+ self.pos = _save2
800
+ end
801
+ break
802
+ end # end sequence
803
+
804
+ if _tmp
805
+ text = get_text(_text_start)
806
+ end
807
+ unless _tmp
808
+ self.pos = _save1
809
+ break
810
+ end
811
+ @result = begin;
812
+ SymbolEntry.new(parent.type, text, [parent, child, sep])
813
+ ; end
814
+ _tmp = true
815
+ unless _tmp
816
+ self.pos = _save1
817
+ end
818
+ break
819
+ end # end sequence
820
+
821
+ break if _tmp
822
+ self.pos = _save
823
+ _tmp = apply(:_local_identifier)
824
+ break if _tmp
825
+ self.pos = _save
826
+ break
827
+ end # end choice
828
+
829
+ return _tmp
830
+ end
831
+
832
+ # class_module_chain = (< identifier:parent id_separator:sep internal_class_module_chain:child > { SymbolEntry.new(parent.type, text, [parent, child, sep]) } | identifier)
833
+ def _class_module_chain
834
+
835
+ _save = self.pos
836
+ while true # choice
837
+
838
+ _save1 = self.pos
839
+ while true # sequence
840
+ _text_start = self.pos
841
+
842
+ _save2 = self.pos
843
+ while true # sequence
844
+ _tmp = apply(:_identifier)
845
+ parent = @result
846
+ unless _tmp
847
+ self.pos = _save2
848
+ break
849
+ end
850
+ _tmp = apply(:_id_separator)
851
+ sep = @result
852
+ unless _tmp
853
+ self.pos = _save2
854
+ break
855
+ end
856
+ _tmp = apply(:_internal_class_module_chain)
857
+ child = @result
858
+ unless _tmp
859
+ self.pos = _save2
860
+ end
861
+ break
862
+ end # end sequence
863
+
864
+ if _tmp
865
+ text = get_text(_text_start)
866
+ end
867
+ unless _tmp
868
+ self.pos = _save1
869
+ break
870
+ end
871
+ @result = begin;
872
+ SymbolEntry.new(parent.type, text, [parent, child, sep])
873
+ ; end
874
+ _tmp = true
875
+ unless _tmp
876
+ self.pos = _save1
877
+ end
878
+ break
879
+ end # end sequence
880
+
881
+ break if _tmp
882
+ self.pos = _save
883
+ _tmp = apply(:_identifier)
884
+ break if _tmp
885
+ self.pos = _save
886
+ break
887
+ end # end choice
888
+
889
+ return _tmp
890
+ end
891
+
892
+ # sp = /[ \t]/
893
+ def _sp
894
+ _tmp = scan(/\A(?-mix:[ \t])/)
895
+ return _tmp
896
+ end
897
+
898
+ # - = sp+
899
+ def __hyphen_
900
+ _save = self.pos
901
+ _tmp = apply(:_sp)
902
+ if _tmp
903
+ while true
904
+ _tmp = apply(:_sp)
905
+ break unless _tmp
906
+ end
907
+ _tmp = true
908
+ else
909
+ self.pos = _save
910
+ end
911
+ return _tmp
912
+ end
913
+
914
+ # dbl_escapes = ("\\\"" { '"' } | "\\n" { "\n" } | "\\t" { "\t" } | "\\\\" { "\\" })
915
+ def _dbl_escapes
916
+
917
+ _save = self.pos
918
+ while true # choice
919
+
920
+ _save1 = self.pos
921
+ while true # sequence
922
+ _tmp = match_string("\\\"")
923
+ unless _tmp
924
+ self.pos = _save1
925
+ break
926
+ end
927
+ @result = begin; '"' ; end
928
+ _tmp = true
929
+ unless _tmp
930
+ self.pos = _save1
931
+ end
932
+ break
933
+ end # end sequence
934
+
935
+ break if _tmp
936
+ self.pos = _save
937
+
938
+ _save2 = self.pos
939
+ while true # sequence
940
+ _tmp = match_string("\\n")
941
+ unless _tmp
942
+ self.pos = _save2
943
+ break
944
+ end
945
+ @result = begin; "\n" ; end
946
+ _tmp = true
947
+ unless _tmp
948
+ self.pos = _save2
949
+ end
950
+ break
951
+ end # end sequence
952
+
953
+ break if _tmp
954
+ self.pos = _save
955
+
956
+ _save3 = self.pos
957
+ while true # sequence
958
+ _tmp = match_string("\\t")
959
+ unless _tmp
960
+ self.pos = _save3
961
+ break
962
+ end
963
+ @result = begin; "\t" ; end
964
+ _tmp = true
965
+ unless _tmp
966
+ self.pos = _save3
967
+ end
968
+ break
969
+ end # end sequence
970
+
971
+ break if _tmp
972
+ self.pos = _save
973
+
974
+ _save4 = self.pos
975
+ while true # sequence
976
+ _tmp = match_string("\\\\")
977
+ unless _tmp
978
+ self.pos = _save4
979
+ break
980
+ end
981
+ @result = begin; "\\" ; end
982
+ _tmp = true
983
+ unless _tmp
984
+ self.pos = _save4
985
+ end
986
+ break
987
+ end # end sequence
988
+
989
+ break if _tmp
990
+ self.pos = _save
991
+ break
992
+ end # end choice
993
+
994
+ return _tmp
995
+ end
996
+
997
+ # escapes = ("\\\"" { '"' } | "\\n" { "\n" } | "\\t" { "\t" } | "\\ " { " " } | "\\:" { ":" } | "\\\\" { "\\" })
998
+ def _escapes
999
+
1000
+ _save = self.pos
1001
+ while true # choice
1002
+
1003
+ _save1 = self.pos
1004
+ while true # sequence
1005
+ _tmp = match_string("\\\"")
1006
+ unless _tmp
1007
+ self.pos = _save1
1008
+ break
1009
+ end
1010
+ @result = begin; '"' ; end
1011
+ _tmp = true
1012
+ unless _tmp
1013
+ self.pos = _save1
1014
+ end
1015
+ break
1016
+ end # end sequence
1017
+
1018
+ break if _tmp
1019
+ self.pos = _save
1020
+
1021
+ _save2 = self.pos
1022
+ while true # sequence
1023
+ _tmp = match_string("\\n")
1024
+ unless _tmp
1025
+ self.pos = _save2
1026
+ break
1027
+ end
1028
+ @result = begin; "\n" ; end
1029
+ _tmp = true
1030
+ unless _tmp
1031
+ self.pos = _save2
1032
+ end
1033
+ break
1034
+ end # end sequence
1035
+
1036
+ break if _tmp
1037
+ self.pos = _save
1038
+
1039
+ _save3 = self.pos
1040
+ while true # sequence
1041
+ _tmp = match_string("\\t")
1042
+ unless _tmp
1043
+ self.pos = _save3
1044
+ break
1045
+ end
1046
+ @result = begin; "\t" ; end
1047
+ _tmp = true
1048
+ unless _tmp
1049
+ self.pos = _save3
1050
+ end
1051
+ break
1052
+ end # end sequence
1053
+
1054
+ break if _tmp
1055
+ self.pos = _save
1056
+
1057
+ _save4 = self.pos
1058
+ while true # sequence
1059
+ _tmp = match_string("\\ ")
1060
+ unless _tmp
1061
+ self.pos = _save4
1062
+ break
1063
+ end
1064
+ @result = begin; " " ; end
1065
+ _tmp = true
1066
+ unless _tmp
1067
+ self.pos = _save4
1068
+ end
1069
+ break
1070
+ end # end sequence
1071
+
1072
+ break if _tmp
1073
+ self.pos = _save
1074
+
1075
+ _save5 = self.pos
1076
+ while true # sequence
1077
+ _tmp = match_string("\\:")
1078
+ unless _tmp
1079
+ self.pos = _save5
1080
+ break
1081
+ end
1082
+ @result = begin; ":" ; end
1083
+ _tmp = true
1084
+ unless _tmp
1085
+ self.pos = _save5
1086
+ end
1087
+ break
1088
+ end # end sequence
1089
+
1090
+ break if _tmp
1091
+ self.pos = _save
1092
+
1093
+ _save6 = self.pos
1094
+ while true # sequence
1095
+ _tmp = match_string("\\\\")
1096
+ unless _tmp
1097
+ self.pos = _save6
1098
+ break
1099
+ end
1100
+ @result = begin; "\\" ; end
1101
+ _tmp = true
1102
+ unless _tmp
1103
+ self.pos = _save6
1104
+ end
1105
+ break
1106
+ end # end sequence
1107
+
1108
+ break if _tmp
1109
+ self.pos = _save
1110
+ break
1111
+ end # end choice
1112
+
1113
+ return _tmp
1114
+ end
1115
+
1116
+ # dbl_seq = < /[^\\"]+/ > { text }
1117
+ def _dbl_seq
1118
+
1119
+ _save = self.pos
1120
+ while true # sequence
1121
+ _text_start = self.pos
1122
+ _tmp = scan(/\A(?-mix:[^\\"]+)/)
1123
+ if _tmp
1124
+ text = get_text(_text_start)
1125
+ end
1126
+ unless _tmp
1127
+ self.pos = _save
1128
+ break
1129
+ end
1130
+ @result = begin; text ; end
1131
+ _tmp = true
1132
+ unless _tmp
1133
+ self.pos = _save
1134
+ end
1135
+ break
1136
+ end # end sequence
1137
+
1138
+ return _tmp
1139
+ end
1140
+
1141
+ # dbl_not_quote = (dbl_escapes | dbl_seq)+:ary { ary }
1142
+ def _dbl_not_quote
1143
+
1144
+ _save = self.pos
1145
+ while true # sequence
1146
+ _save1 = self.pos
1147
+ _ary = []
1148
+
1149
+ _save2 = self.pos
1150
+ while true # choice
1151
+ _tmp = apply(:_dbl_escapes)
1152
+ break if _tmp
1153
+ self.pos = _save2
1154
+ _tmp = apply(:_dbl_seq)
1155
+ break if _tmp
1156
+ self.pos = _save2
1157
+ break
1158
+ end # end choice
1159
+
1160
+ if _tmp
1161
+ _ary << @result
1162
+ while true
1163
+
1164
+ _save3 = self.pos
1165
+ while true # choice
1166
+ _tmp = apply(:_dbl_escapes)
1167
+ break if _tmp
1168
+ self.pos = _save3
1169
+ _tmp = apply(:_dbl_seq)
1170
+ break if _tmp
1171
+ self.pos = _save3
1172
+ break
1173
+ end # end choice
1174
+
1175
+ _ary << @result if _tmp
1176
+ break unless _tmp
1177
+ end
1178
+ _tmp = true
1179
+ @result = _ary
1180
+ else
1181
+ self.pos = _save1
1182
+ end
1183
+ ary = @result
1184
+ unless _tmp
1185
+ self.pos = _save
1186
+ break
1187
+ end
1188
+ @result = begin; ary ; end
1189
+ _tmp = true
1190
+ unless _tmp
1191
+ self.pos = _save
1192
+ end
1193
+ break
1194
+ end # end sequence
1195
+
1196
+ return _tmp
1197
+ end
1198
+
1199
+ # dbl_string = "\"" dbl_not_quote:ary "\"" { ary.join }
1200
+ def _dbl_string
1201
+
1202
+ _save = self.pos
1203
+ while true # sequence
1204
+ _tmp = match_string("\"")
1205
+ unless _tmp
1206
+ self.pos = _save
1207
+ break
1208
+ end
1209
+ _tmp = apply(:_dbl_not_quote)
1210
+ ary = @result
1211
+ unless _tmp
1212
+ self.pos = _save
1213
+ break
1214
+ end
1215
+ _tmp = match_string("\"")
1216
+ unless _tmp
1217
+ self.pos = _save
1218
+ break
1219
+ end
1220
+ @result = begin; ary.join ; end
1221
+ _tmp = true
1222
+ unless _tmp
1223
+ self.pos = _save
1224
+ end
1225
+ break
1226
+ end # end sequence
1227
+
1228
+ return _tmp
1229
+ end
1230
+
1231
+ # not_space_colon = (escapes | < /[^ \t\n:]/ > { text })
1232
+ def _not_space_colon
1233
+
1234
+ _save = self.pos
1235
+ while true # choice
1236
+ _tmp = apply(:_escapes)
1237
+ break if _tmp
1238
+ self.pos = _save
1239
+
1240
+ _save1 = self.pos
1241
+ while true # sequence
1242
+ _text_start = self.pos
1243
+ _tmp = scan(/\A(?-mix:[^ \t\n:])/)
1244
+ if _tmp
1245
+ text = get_text(_text_start)
1246
+ end
1247
+ unless _tmp
1248
+ self.pos = _save1
1249
+ break
1250
+ end
1251
+ @result = begin; text ; end
1252
+ _tmp = true
1253
+ unless _tmp
1254
+ self.pos = _save1
1255
+ end
1256
+ break
1257
+ end # end sequence
1258
+
1259
+ break if _tmp
1260
+ self.pos = _save
1261
+ break
1262
+ end # end choice
1263
+
1264
+ return _tmp
1265
+ end
1266
+
1267
+ # not_space_colons = not_space_colon+:ary { ary.join }
1268
+ def _not_space_colons
1269
+
1270
+ _save = self.pos
1271
+ while true # sequence
1272
+ _save1 = self.pos
1273
+ _ary = []
1274
+ _tmp = apply(:_not_space_colon)
1275
+ if _tmp
1276
+ _ary << @result
1277
+ while true
1278
+ _tmp = apply(:_not_space_colon)
1279
+ _ary << @result if _tmp
1280
+ break unless _tmp
1281
+ end
1282
+ _tmp = true
1283
+ @result = _ary
1284
+ else
1285
+ self.pos = _save1
1286
+ end
1287
+ ary = @result
1288
+ unless _tmp
1289
+ self.pos = _save
1290
+ break
1291
+ end
1292
+ @result = begin; ary.join ; end
1293
+ _tmp = true
1294
+ unless _tmp
1295
+ self.pos = _save
1296
+ end
1297
+ break
1298
+ end # end sequence
1299
+
1300
+ return _tmp
1301
+ end
1302
+
1303
+ # filename = (dbl_string | not_space_colons)
1304
+ def _filename
1305
+
1306
+ _save = self.pos
1307
+ while true # choice
1308
+ _tmp = apply(:_dbl_string)
1309
+ break if _tmp
1310
+ self.pos = _save
1311
+ _tmp = apply(:_not_space_colons)
1312
+ break if _tmp
1313
+ self.pos = _save
1314
+ break
1315
+ end # end choice
1316
+
1317
+ return _tmp
1318
+ end
1319
+
1320
+ # file_pos_sep = (sp+ | ":")
1321
+ def _file_pos_sep
1322
+
1323
+ _save = self.pos
1324
+ while true # choice
1325
+ _save1 = self.pos
1326
+ _tmp = apply(:_sp)
1327
+ if _tmp
1328
+ while true
1329
+ _tmp = apply(:_sp)
1330
+ break unless _tmp
1331
+ end
1332
+ _tmp = true
1333
+ else
1334
+ self.pos = _save1
1335
+ end
1336
+ break if _tmp
1337
+ self.pos = _save
1338
+ _tmp = match_string(":")
1339
+ break if _tmp
1340
+ self.pos = _save
1341
+ break
1342
+ end # end choice
1343
+
1344
+ return _tmp
1345
+ end
1346
+
1347
+ # integer = < /[0-9]+/ > { text.to_i }
1348
+ def _integer
1349
+
1350
+ _save = self.pos
1351
+ while true # sequence
1352
+ _text_start = self.pos
1353
+ _tmp = scan(/\A(?-mix:[0-9]+)/)
1354
+ if _tmp
1355
+ text = get_text(_text_start)
1356
+ end
1357
+ unless _tmp
1358
+ self.pos = _save
1359
+ break
1360
+ end
1361
+ @result = begin; text.to_i ; end
1362
+ _tmp = true
1363
+ unless _tmp
1364
+ self.pos = _save
1365
+ end
1366
+ break
1367
+ end # end sequence
1368
+
1369
+ return _tmp
1370
+ end
1371
+
1372
+ # line_number = integer
1373
+ def _line_number
1374
+ _tmp = apply(:_integer)
1375
+ return _tmp
1376
+ end
1377
+
1378
+ # vm_offset = "@" integer:int { Position.new(nil, nil, :offset, int) }
1379
+ def _vm_offset
1380
+
1381
+ _save = self.pos
1382
+ while true # sequence
1383
+ _tmp = match_string("@")
1384
+ unless _tmp
1385
+ self.pos = _save
1386
+ break
1387
+ end
1388
+ _tmp = apply(:_integer)
1389
+ int = @result
1390
+ unless _tmp
1391
+ self.pos = _save
1392
+ break
1393
+ end
1394
+ @result = begin;
1395
+ Position.new(nil, nil, :offset, int)
1396
+ ; end
1397
+ _tmp = true
1398
+ unless _tmp
1399
+ self.pos = _save
1400
+ end
1401
+ break
1402
+ end # end sequence
1403
+
1404
+ return _tmp
1405
+ end
1406
+
1407
+ # position = (vm_offset | line_number:l { Position.new(nil, nil, :line, l) })
1408
+ def _position
1409
+
1410
+ _save = self.pos
1411
+ while true # choice
1412
+ _tmp = apply(:_vm_offset)
1413
+ break if _tmp
1414
+ self.pos = _save
1415
+
1416
+ _save1 = self.pos
1417
+ while true # sequence
1418
+ _tmp = apply(:_line_number)
1419
+ l = @result
1420
+ unless _tmp
1421
+ self.pos = _save1
1422
+ break
1423
+ end
1424
+ @result = begin;
1425
+ Position.new(nil, nil, :line, l)
1426
+ ; end
1427
+ _tmp = true
1428
+ unless _tmp
1429
+ self.pos = _save1
1430
+ end
1431
+ break
1432
+ end # end sequence
1433
+
1434
+ break if _tmp
1435
+ self.pos = _save
1436
+ break
1437
+ end # end choice
1438
+
1439
+ return _tmp
1440
+ end
1441
+
1442
+ # file_colon_line = file_no_colon:file &{ File.exist?(file) } ":" position:pos { Position.new(:file, file, pos.position_type, pos.position) }
1443
+ def _file_colon_line
1444
+
1445
+ _save = self.pos
1446
+ while true # sequence
1447
+ _tmp = apply(:_file_no_colon)
1448
+ file = @result
1449
+ unless _tmp
1450
+ self.pos = _save
1451
+ break
1452
+ end
1453
+ _save1 = self.pos
1454
+ _tmp = begin; File.exist?(file) ; end
1455
+ self.pos = _save1
1456
+ unless _tmp
1457
+ self.pos = _save
1458
+ break
1459
+ end
1460
+ _tmp = match_string(":")
1461
+ unless _tmp
1462
+ self.pos = _save
1463
+ break
1464
+ end
1465
+ _tmp = apply(:_position)
1466
+ pos = @result
1467
+ unless _tmp
1468
+ self.pos = _save
1469
+ break
1470
+ end
1471
+ @result = begin;
1472
+ Position.new(:file, file, pos.position_type, pos.position)
1473
+ ; end
1474
+ _tmp = true
1475
+ unless _tmp
1476
+ self.pos = _save
1477
+ end
1478
+ break
1479
+ end # end sequence
1480
+
1481
+ return _tmp
1482
+ end
1483
+
1484
+ # location = (position | < filename >:file &{ @file_exists_proc.call(file) } file_pos_sep position:pos { Position.new(:file, file, pos.position_type, pos.position) } | < filename >:file &{ @file_exists_proc.call(file) } { Position.new(:file, file, nil, nil) } | class_module_chain?:fn file_pos_sep position:pos { Position.new(:fn, fn, pos.position_type, pos.position) } | class_module_chain?:fn { Position.new(:fn, fn, nil, nil) })
1485
+ def _location
1486
+
1487
+ _save = self.pos
1488
+ while true # choice
1489
+ _tmp = apply(:_position)
1490
+ break if _tmp
1491
+ self.pos = _save
1492
+
1493
+ _save1 = self.pos
1494
+ while true # sequence
1495
+ _text_start = self.pos
1496
+ _tmp = apply(:_filename)
1497
+ if _tmp
1498
+ text = get_text(_text_start)
1499
+ end
1500
+ file = @result
1501
+ unless _tmp
1502
+ self.pos = _save1
1503
+ break
1504
+ end
1505
+ _save2 = self.pos
1506
+ _tmp = begin; @file_exists_proc.call(file) ; end
1507
+ self.pos = _save2
1508
+ unless _tmp
1509
+ self.pos = _save1
1510
+ break
1511
+ end
1512
+ _tmp = apply(:_file_pos_sep)
1513
+ unless _tmp
1514
+ self.pos = _save1
1515
+ break
1516
+ end
1517
+ _tmp = apply(:_position)
1518
+ pos = @result
1519
+ unless _tmp
1520
+ self.pos = _save1
1521
+ break
1522
+ end
1523
+ @result = begin;
1524
+ Position.new(:file, file, pos.position_type, pos.position)
1525
+ ; end
1526
+ _tmp = true
1527
+ unless _tmp
1528
+ self.pos = _save1
1529
+ end
1530
+ break
1531
+ end # end sequence
1532
+
1533
+ break if _tmp
1534
+ self.pos = _save
1535
+
1536
+ _save3 = self.pos
1537
+ while true # sequence
1538
+ _text_start = self.pos
1539
+ _tmp = apply(:_filename)
1540
+ if _tmp
1541
+ text = get_text(_text_start)
1542
+ end
1543
+ file = @result
1544
+ unless _tmp
1545
+ self.pos = _save3
1546
+ break
1547
+ end
1548
+ _save4 = self.pos
1549
+ _tmp = begin; @file_exists_proc.call(file) ; end
1550
+ self.pos = _save4
1551
+ unless _tmp
1552
+ self.pos = _save3
1553
+ break
1554
+ end
1555
+ @result = begin;
1556
+ Position.new(:file, file, nil, nil)
1557
+ ; end
1558
+ _tmp = true
1559
+ unless _tmp
1560
+ self.pos = _save3
1561
+ end
1562
+ break
1563
+ end # end sequence
1564
+
1565
+ break if _tmp
1566
+ self.pos = _save
1567
+
1568
+ _save5 = self.pos
1569
+ while true # sequence
1570
+ _save6 = self.pos
1571
+ _tmp = apply(:_class_module_chain)
1572
+ @result = nil unless _tmp
1573
+ unless _tmp
1574
+ _tmp = true
1575
+ self.pos = _save6
1576
+ end
1577
+ fn = @result
1578
+ unless _tmp
1579
+ self.pos = _save5
1580
+ break
1581
+ end
1582
+ _tmp = apply(:_file_pos_sep)
1583
+ unless _tmp
1584
+ self.pos = _save5
1585
+ break
1586
+ end
1587
+ _tmp = apply(:_position)
1588
+ pos = @result
1589
+ unless _tmp
1590
+ self.pos = _save5
1591
+ break
1592
+ end
1593
+ @result = begin;
1594
+ Position.new(:fn, fn, pos.position_type, pos.position)
1595
+ ; end
1596
+ _tmp = true
1597
+ unless _tmp
1598
+ self.pos = _save5
1599
+ end
1600
+ break
1601
+ end # end sequence
1602
+
1603
+ break if _tmp
1604
+ self.pos = _save
1605
+
1606
+ _save7 = self.pos
1607
+ while true # sequence
1608
+ _save8 = self.pos
1609
+ _tmp = apply(:_class_module_chain)
1610
+ @result = nil unless _tmp
1611
+ unless _tmp
1612
+ _tmp = true
1613
+ self.pos = _save8
1614
+ end
1615
+ fn = @result
1616
+ unless _tmp
1617
+ self.pos = _save7
1618
+ break
1619
+ end
1620
+ @result = begin;
1621
+ Position.new(:fn, fn, nil, nil)
1622
+ ; end
1623
+ _tmp = true
1624
+ unless _tmp
1625
+ self.pos = _save7
1626
+ end
1627
+ break
1628
+ end # end sequence
1629
+
1630
+ break if _tmp
1631
+ self.pos = _save
1632
+ break
1633
+ end # end choice
1634
+
1635
+ return _tmp
1636
+ end
1637
+
1638
+ # if_unless = < ("if" | "unless") > { text }
1639
+ def _if_unless
1640
+
1641
+ _save = self.pos
1642
+ while true # sequence
1643
+ _text_start = self.pos
1644
+
1645
+ _save1 = self.pos
1646
+ while true # choice
1647
+ _tmp = match_string("if")
1648
+ break if _tmp
1649
+ self.pos = _save1
1650
+ _tmp = match_string("unless")
1651
+ break if _tmp
1652
+ self.pos = _save1
1653
+ break
1654
+ end # end choice
1655
+
1656
+ if _tmp
1657
+ text = get_text(_text_start)
1658
+ end
1659
+ unless _tmp
1660
+ self.pos = _save
1661
+ break
1662
+ end
1663
+ @result = begin; text ; end
1664
+ _tmp = true
1665
+ unless _tmp
1666
+ self.pos = _save
1667
+ end
1668
+ break
1669
+ end # end sequence
1670
+
1671
+ return _tmp
1672
+ end
1673
+
1674
+ # condition = < /.+/ > { text}
1675
+ def _condition
1676
+
1677
+ _save = self.pos
1678
+ while true # sequence
1679
+ _text_start = self.pos
1680
+ _tmp = scan(/\A(?-mix:.+)/)
1681
+ if _tmp
1682
+ text = get_text(_text_start)
1683
+ end
1684
+ unless _tmp
1685
+ self.pos = _save
1686
+ break
1687
+ end
1688
+ @result = begin; text; end
1689
+ _tmp = true
1690
+ unless _tmp
1691
+ self.pos = _save
1692
+ end
1693
+ break
1694
+ end # end sequence
1695
+
1696
+ return _tmp
1697
+ end
1698
+
1699
+ # breakpoint_stmt_no_condition = location:loc { Breakpoint.new(loc, false, 'true') }
1700
+ def _breakpoint_stmt_no_condition
1701
+
1702
+ _save = self.pos
1703
+ while true # sequence
1704
+ _tmp = apply(:_location)
1705
+ loc = @result
1706
+ unless _tmp
1707
+ self.pos = _save
1708
+ break
1709
+ end
1710
+ @result = begin;
1711
+ Breakpoint.new(loc, false, 'true')
1712
+ ; end
1713
+ _tmp = true
1714
+ unless _tmp
1715
+ self.pos = _save
1716
+ end
1717
+ break
1718
+ end # end sequence
1719
+
1720
+ return _tmp
1721
+ end
1722
+
1723
+ # breakpoint_stmt = (location:loc - if_unless:iu - condition:cond { Breakpoint.new(loc, iu == 'unless', cond) } | breakpoint_stmt_no_condition)
1724
+ def _breakpoint_stmt
1725
+
1726
+ _save = self.pos
1727
+ while true # choice
1728
+
1729
+ _save1 = self.pos
1730
+ while true # sequence
1731
+ _tmp = apply(:_location)
1732
+ loc = @result
1733
+ unless _tmp
1734
+ self.pos = _save1
1735
+ break
1736
+ end
1737
+ _tmp = apply(:__hyphen_)
1738
+ unless _tmp
1739
+ self.pos = _save1
1740
+ break
1741
+ end
1742
+ _tmp = apply(:_if_unless)
1743
+ iu = @result
1744
+ unless _tmp
1745
+ self.pos = _save1
1746
+ break
1747
+ end
1748
+ _tmp = apply(:__hyphen_)
1749
+ unless _tmp
1750
+ self.pos = _save1
1751
+ break
1752
+ end
1753
+ _tmp = apply(:_condition)
1754
+ cond = @result
1755
+ unless _tmp
1756
+ self.pos = _save1
1757
+ break
1758
+ end
1759
+ @result = begin;
1760
+ Breakpoint.new(loc, iu == 'unless', cond)
1761
+ ; end
1762
+ _tmp = true
1763
+ unless _tmp
1764
+ self.pos = _save1
1765
+ end
1766
+ break
1767
+ end # end sequence
1768
+
1769
+ break if _tmp
1770
+ self.pos = _save
1771
+ _tmp = apply(:_breakpoint_stmt_no_condition)
1772
+ break if _tmp
1773
+ self.pos = _save
1774
+ break
1775
+ end # end choice
1776
+
1777
+ return _tmp
1778
+ end
1779
+
1780
+ # list_special_targets = < ("." | "-") > { text }
1781
+ def _list_special_targets
1782
+
1783
+ _save = self.pos
1784
+ while true # sequence
1785
+ _text_start = self.pos
1786
+
1787
+ _save1 = self.pos
1788
+ while true # choice
1789
+ _tmp = match_string(".")
1790
+ break if _tmp
1791
+ self.pos = _save1
1792
+ _tmp = match_string("-")
1793
+ break if _tmp
1794
+ self.pos = _save1
1795
+ break
1796
+ end # end choice
1797
+
1798
+ if _tmp
1799
+ text = get_text(_text_start)
1800
+ end
1801
+ unless _tmp
1802
+ self.pos = _save
1803
+ break
1804
+ end
1805
+ @result = begin; text ; end
1806
+ _tmp = true
1807
+ unless _tmp
1808
+ self.pos = _save
1809
+ end
1810
+ break
1811
+ end # end sequence
1812
+
1813
+ return _tmp
1814
+ end
1815
+
1816
+ # list_stmt = ((list_special_targets | location):loc - integer:int? { List.new(loc, int) } | (list_special_targets | location):loc { List.new(loc, nil) })
1817
+ def _list_stmt
1818
+
1819
+ _save = self.pos
1820
+ while true # choice
1821
+
1822
+ _save1 = self.pos
1823
+ while true # sequence
1824
+
1825
+ _save2 = self.pos
1826
+ while true # choice
1827
+ _tmp = apply(:_list_special_targets)
1828
+ break if _tmp
1829
+ self.pos = _save2
1830
+ _tmp = apply(:_location)
1831
+ break if _tmp
1832
+ self.pos = _save2
1833
+ break
1834
+ end # end choice
1835
+
1836
+ loc = @result
1837
+ unless _tmp
1838
+ self.pos = _save1
1839
+ break
1840
+ end
1841
+ _tmp = apply(:__hyphen_)
1842
+ unless _tmp
1843
+ self.pos = _save1
1844
+ break
1845
+ end
1846
+ _save3 = self.pos
1847
+ _tmp = apply(:_integer)
1848
+ int = @result
1849
+ unless _tmp
1850
+ _tmp = true
1851
+ self.pos = _save3
1852
+ end
1853
+ unless _tmp
1854
+ self.pos = _save1
1855
+ break
1856
+ end
1857
+ @result = begin;
1858
+ List.new(loc, int)
1859
+ ; end
1860
+ _tmp = true
1861
+ unless _tmp
1862
+ self.pos = _save1
1863
+ end
1864
+ break
1865
+ end # end sequence
1866
+
1867
+ break if _tmp
1868
+ self.pos = _save
1869
+
1870
+ _save4 = self.pos
1871
+ while true # sequence
1872
+
1873
+ _save5 = self.pos
1874
+ while true # choice
1875
+ _tmp = apply(:_list_special_targets)
1876
+ break if _tmp
1877
+ self.pos = _save5
1878
+ _tmp = apply(:_location)
1879
+ break if _tmp
1880
+ self.pos = _save5
1881
+ break
1882
+ end # end choice
1883
+
1884
+ loc = @result
1885
+ unless _tmp
1886
+ self.pos = _save4
1887
+ break
1888
+ end
1889
+ @result = begin;
1890
+ List.new(loc, nil)
1891
+ ; end
1892
+ _tmp = true
1893
+ unless _tmp
1894
+ self.pos = _save4
1895
+ end
1896
+ break
1897
+ end # end sequence
1898
+
1899
+ break if _tmp
1900
+ self.pos = _save
1901
+ break
1902
+ end # end choice
1903
+
1904
+ return _tmp
1905
+ end
1906
+ end
1907
+ if __FILE__ == $0
1908
+ # require 'rubygems'; require_relative '../lib/trepanning';
1909
+
1910
+ cp = CmdParse.new('', :debug=>true)
1911
+ %w(A::B @@classvar abc01! @ivar @ivar.meth
1912
+ Object A::B::C A::B::C::D A::B.c A.b.c.d).each do |name|
1913
+ cp.setup_parser(name, true)
1914
+ # debugger if name == '@ivar.meth'
1915
+ res = cp._class_module_chain
1916
+ p res
1917
+ p cp.string
1918
+ p cp.result
1919
+ end
1920
+ %w(A::B:5 A::B:@5 @@classvar abc01!:10 @ivar).each do |name|
1921
+ cp.setup_parser(name, true)
1922
+ res = cp._location
1923
+ p res
1924
+ p cp.string
1925
+ p cp.result
1926
+ end
1927
+ # require 'trepanning';
1928
+ ["#{__FILE__}:10", 'A::B 5',
1929
+ "#{__FILE__} 20"].each do |name|
1930
+ cp.setup_parser(name, {:debug=>true})
1931
+ res = cp._location
1932
+ p res
1933
+ p cp.string
1934
+ p cp.result
1935
+ end
1936
+
1937
+ ['filename', '"this is a filename"',
1938
+ 'this\ is\ another\ filename',
1939
+ 'C\:filename'
1940
+ ].each do |name|
1941
+ puts '-' * 10
1942
+ cp.setup_parser(name, {:debug=>true})
1943
+ res = cp._filename
1944
+ p res
1945
+ puts cp.string
1946
+ puts cp.result
1947
+ end
1948
+ end