rb8-trepanning 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +52 -0
  274. metadata +391 -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