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.
- data/.gitignore +3 -0
- data/CHANGES +34 -0
- data/ChangeLog +875 -0
- data/README.textile +59 -0
- data/Rakefile +215 -0
- data/app/.gitignore +1 -0
- data/app/cmd_parse.kpeg +241 -0
- data/app/cmd_parse.rb +212 -0
- data/app/cmd_parser.rb +1948 -0
- data/app/complete.rb +79 -0
- data/app/default.rb +90 -0
- data/app/display.rb +148 -0
- data/app/eventbuffer.rb +147 -0
- data/app/frame.rb +166 -0
- data/app/irb.rb +114 -0
- data/app/options.rb +200 -0
- data/app/run.rb +74 -0
- data/app/util.rb +65 -0
- data/bin/.gitignore +1 -0
- data/bin/trepan8 +115 -0
- data/data/.gitignore +1 -0
- data/data/irbrc +41 -0
- data/interface/.gitignore +1 -0
- data/interface/base_intf.rb +109 -0
- data/interface/client.rb +82 -0
- data/interface/comcodes.rb +20 -0
- data/interface/script.rb +110 -0
- data/interface/server.rb +147 -0
- data/interface/user.rb +165 -0
- data/io/base_io.rb +148 -0
- data/io/input.rb +158 -0
- data/io/null_output.rb +46 -0
- data/io/string_array.rb +156 -0
- data/io/tcpclient.rb +129 -0
- data/io/tcpfns.rb +33 -0
- data/io/tcpserver.rb +141 -0
- data/lib/debugger.rb +8 -0
- data/lib/trepanning.rb +283 -0
- data/processor/.gitignore +1 -0
- data/processor/command-ruby-debug/breakpoints.rb +155 -0
- data/processor/command-ruby-debug/catchpoint.rb +55 -0
- data/processor/command-ruby-debug/condition.rb +49 -0
- data/processor/command-ruby-debug/control.rb +31 -0
- data/processor/command-ruby-debug/display.rb +120 -0
- data/processor/command-ruby-debug/enable.rb +202 -0
- data/processor/command-ruby-debug/frame.rb +199 -0
- data/processor/command-ruby-debug/help.rb +63 -0
- data/processor/command-ruby-debug/info.rb +359 -0
- data/processor/command-ruby-debug/method.rb +84 -0
- data/processor/command-ruby-debug/reload.rb +40 -0
- data/processor/command-ruby-debug/save.rb +90 -0
- data/processor/command-ruby-debug/set.rb +237 -0
- data/processor/command-ruby-debug/show.rb +251 -0
- data/processor/command-ruby-debug/source.rb +36 -0
- data/processor/command-ruby-debug/threads.rb +189 -0
- data/processor/command-ruby-debug/trace.rb +57 -0
- data/processor/command-ruby-debug/variables.rb +199 -0
- data/processor/command.rb +270 -0
- data/processor/command/.gitignore +1 -0
- data/processor/command/alias.rb +54 -0
- data/processor/command/backtrace.rb +123 -0
- data/processor/command/base/cmd.rb +177 -0
- data/processor/command/base/subcmd.rb +230 -0
- data/processor/command/base/submgr.rb +188 -0
- data/processor/command/base/subsubcmd.rb +128 -0
- data/processor/command/base/subsubmgr.rb +199 -0
- data/processor/command/break.rb +114 -0
- data/processor/command/catch.rb +71 -0
- data/processor/command/complete.rb +39 -0
- data/processor/command/continue.rb +57 -0
- data/processor/command/directory.rb +50 -0
- data/processor/command/disable.rb +85 -0
- data/processor/command/display.rb +78 -0
- data/processor/command/down.rb +54 -0
- data/processor/command/edit.rb +79 -0
- data/processor/command/enable.rb +48 -0
- data/processor/command/eval.rb +90 -0
- data/processor/command/exit.rb +66 -0
- data/processor/command/finish.rb +59 -0
- data/processor/command/frame.rb +97 -0
- data/processor/command/help.rb +230 -0
- data/processor/command/help/.gitignore +1 -0
- data/processor/command/help/README +10 -0
- data/processor/command/help/command.txt +58 -0
- data/processor/command/help/examples.txt +16 -0
- data/processor/command/help/filename.txt +40 -0
- data/processor/command/help/location.txt +37 -0
- data/processor/command/help/suffixes.txt +17 -0
- data/processor/command/info.rb +28 -0
- data/processor/command/info_subcmd/.gitignore +1 -0
- data/processor/command/info_subcmd/args.rb +39 -0
- data/processor/command/info_subcmd/breakpoints.rb +80 -0
- data/processor/command/info_subcmd/catch.rb +36 -0
- data/processor/command/info_subcmd/files.rb +39 -0
- data/processor/command/info_subcmd/globals.rb +64 -0
- data/processor/command/info_subcmd/line.rb +30 -0
- data/processor/command/info_subcmd/locals.rb +69 -0
- data/processor/command/info_subcmd/macro.rb +62 -0
- data/processor/command/info_subcmd/program.rb +51 -0
- data/processor/command/info_subcmd/ruby.rb +57 -0
- data/processor/command/info_subcmd/source.rb +74 -0
- data/processor/command/info_subcmd/stack.rb +25 -0
- data/processor/command/info_subcmd/threads.rb +75 -0
- data/processor/command/kill.rb +78 -0
- data/processor/command/list.rb +117 -0
- data/processor/command/macro.rb +68 -0
- data/processor/command/next.rb +79 -0
- data/processor/command/parsetree.rb +56 -0
- data/processor/command/pp.rb +40 -0
- data/processor/command/pr.rb +37 -0
- data/processor/command/ps.rb +40 -0
- data/processor/command/restart.rb +86 -0
- data/processor/command/save.rb +58 -0
- data/processor/command/set.rb +47 -0
- data/processor/command/set_subcmd/.gitignore +1 -0
- data/processor/command/set_subcmd/abbrev.rb +25 -0
- data/processor/command/set_subcmd/auto.rb +27 -0
- data/processor/command/set_subcmd/auto_subcmd/.gitignore +1 -0
- data/processor/command/set_subcmd/auto_subcmd/eval.rb +53 -0
- data/processor/command/set_subcmd/auto_subcmd/irb.rb +33 -0
- data/processor/command/set_subcmd/auto_subcmd/list.rb +33 -0
- data/processor/command/set_subcmd/basename.rb +25 -0
- data/processor/command/set_subcmd/callstyle.rb +46 -0
- data/processor/command/set_subcmd/confirm.rb +24 -0
- data/processor/command/set_subcmd/debug.rb +47 -0
- data/processor/command/set_subcmd/different.rb +61 -0
- data/processor/command/set_subcmd/highlight.rb +43 -0
- data/processor/command/set_subcmd/max.rb +26 -0
- data/processor/command/set_subcmd/max_subcmd/list.rb +49 -0
- data/processor/command/set_subcmd/max_subcmd/stack.rb +50 -0
- data/processor/command/set_subcmd/max_subcmd/string.rb +76 -0
- data/processor/command/set_subcmd/max_subcmd/width.rb +49 -0
- data/processor/command/set_subcmd/reload.rb +42 -0
- data/processor/command/set_subcmd/timer.rb +58 -0
- data/processor/command/set_subcmd/trace.rb +37 -0
- data/processor/command/set_subcmd/trace_subcmd/buffer.rb +42 -0
- data/processor/command/set_subcmd/trace_subcmd/print.rb +41 -0
- data/processor/command/shell.rb +139 -0
- data/processor/command/show.rb +39 -0
- data/processor/command/show_subcmd/.gitignore +1 -0
- data/processor/command/show_subcmd/abbrev.rb +20 -0
- data/processor/command/show_subcmd/alias.rb +46 -0
- data/processor/command/show_subcmd/args.rb +34 -0
- data/processor/command/show_subcmd/auto.rb +28 -0
- data/processor/command/show_subcmd/auto_subcmd/eval.rb +27 -0
- data/processor/command/show_subcmd/auto_subcmd/irb.rb +23 -0
- data/processor/command/show_subcmd/auto_subcmd/list.rb +22 -0
- data/processor/command/show_subcmd/basename.rb +20 -0
- data/processor/command/show_subcmd/callstyle.rb +22 -0
- data/processor/command/show_subcmd/confirm.rb +18 -0
- data/processor/command/show_subcmd/debug.rb +26 -0
- data/processor/command/show_subcmd/debug_subcmd/dbgr.rb +21 -0
- data/processor/command/show_subcmd/debug_subcmd/skip.rb +22 -0
- data/processor/command/show_subcmd/debug_subcmd/step.rb +22 -0
- data/processor/command/show_subcmd/different.rb +26 -0
- data/processor/command/show_subcmd/directories.rb +22 -0
- data/processor/command/show_subcmd/highlight.rb +24 -0
- data/processor/command/show_subcmd/max.rb +27 -0
- data/processor/command/show_subcmd/max_subcmd/list.rb +38 -0
- data/processor/command/show_subcmd/max_subcmd/stack.rb +36 -0
- data/processor/command/show_subcmd/max_subcmd/string.rb +42 -0
- data/processor/command/show_subcmd/max_subcmd/width.rb +37 -0
- data/processor/command/show_subcmd/reload.rb +18 -0
- data/processor/command/show_subcmd/timer.rb +18 -0
- data/processor/command/show_subcmd/trace.rb +29 -0
- data/processor/command/show_subcmd/trace_subcmd/buffer.rb +65 -0
- data/processor/command/show_subcmd/trace_subcmd/print.rb +23 -0
- data/processor/command/show_subcmd/version.rb +23 -0
- data/processor/command/source.rb +134 -0
- data/processor/command/step.rb +81 -0
- data/processor/command/tbreak.rb +19 -0
- data/processor/command/unalias.rb +44 -0
- data/processor/command/undisplay.rb +59 -0
- data/processor/command/up.rb +72 -0
- data/processor/default.rb +56 -0
- data/processor/display.rb +17 -0
- data/processor/eval.rb +113 -0
- data/processor/eventbuf.rb +105 -0
- data/processor/frame.rb +172 -0
- data/processor/help.rb +92 -0
- data/processor/helper.rb +76 -0
- data/processor/hook.rb +134 -0
- data/processor/load_cmds.rb +258 -0
- data/processor/location.rb +174 -0
- data/processor/main.rb +455 -0
- data/processor/mock.rb +136 -0
- data/processor/msg.rb +61 -0
- data/processor/processor.rb +674 -0
- data/processor/running.rb +168 -0
- data/processor/stepping.rb +18 -0
- data/processor/subcmd.rb +161 -0
- data/processor/validate.rb +355 -0
- data/processor/virtual.rb +34 -0
- data/test/data/.gitignore +1 -0
- data/test/data/break_bad.cmd +19 -0
- data/test/data/break_bad.right +29 -0
- data/test/data/break_loop_bug.cmd +5 -0
- data/test/data/break_loop_bug.right +15 -0
- data/test/data/dollar-0.right +2 -0
- data/test/data/dollar-0a.right +2 -0
- data/test/data/dollar-0b.right +2 -0
- data/test/data/edit.cmd +14 -0
- data/test/data/edit.right +24 -0
- data/test/data/file-with-space.cmd +6 -0
- data/test/data/file-with-space.right +4 -0
- data/test/data/printvar.cmd +17 -0
- data/test/data/printvar.right +31 -0
- data/test/data/raise.cmd +11 -0
- data/test/data/raise.right +19 -0
- data/test/data/source.cmd +5 -0
- data/test/data/source.right +18 -0
- data/test/data/stepping-1.9.right +50 -0
- data/test/data/stepping.cmd +21 -0
- data/test/data/stepping.right +48 -0
- data/test/data/trepan8-save.1 +6 -0
- data/test/example/bp_loop_issue.rb +3 -0
- data/test/example/break-bug.rb +7 -0
- data/test/example/brkpt-class-bug.rb +8 -0
- data/test/example/classes.rb +11 -0
- data/test/example/dollar-0.rb +5 -0
- data/test/example/except-bug1.rb +4 -0
- data/test/example/except-bug2.rb +7 -0
- data/test/example/file with space.rb +1 -0
- data/test/example/gcd.rb +18 -0
- data/test/example/info-var-bug.rb +47 -0
- data/test/example/info-var-bug2.rb +2 -0
- data/test/example/null.rb +1 -0
- data/test/example/pm-bug.rb +3 -0
- data/test/example/pm.rb +11 -0
- data/test/example/raise.rb +3 -0
- data/test/integration/.gitignore +4 -0
- data/test/integration/config.yaml +8 -0
- data/test/integration/helper.rb +154 -0
- data/test/integration/test-break_bad.rb +26 -0
- data/test/integration/test-dollar-0.rb +31 -0
- data/test/integration/test-edit.rb +17 -0
- data/test/integration/test-file-with-space.rb +26 -0
- data/test/integration/test-printvar.rb +17 -0
- data/test/integration/test-raise.rb +21 -0
- data/test/integration/test-source.rb +16 -0
- data/test/integration/test-stepping.rb +24 -0
- data/test/unit/.gitignore +1 -0
- data/test/unit/cmd-helper.rb +52 -0
- data/test/unit/mock-helper.rb +12 -0
- data/test/unit/test-app-cmd_parse.rb +97 -0
- data/test/unit/test-app-cmd_parser.rb +23 -0
- data/test/unit/test-app-complete.rb +39 -0
- data/test/unit/test-app-frame.rb +32 -0
- data/test/unit/test-app-options.rb +92 -0
- data/test/unit/test-app-run.rb +14 -0
- data/test/unit/test-app-util.rb +44 -0
- data/test/unit/test-base-cmd.rb +45 -0
- data/test/unit/test-base-subcmd.rb +57 -0
- data/test/unit/test-base-submgr.rb +23 -0
- data/test/unit/test-base-subsubcmd.rb +17 -0
- data/test/unit/test-cmd-alias.rb +48 -0
- data/test/unit/test-cmd-exit.rb +27 -0
- data/test/unit/test-cmd-help.rb +104 -0
- data/test/unit/test-cmd-kill.rb +46 -0
- data/test/unit/test-cmd-source.rb +34 -0
- data/test/unit/test-completion.rb +42 -0
- data/test/unit/test-intf-user.rb +46 -0
- data/test/unit/test-io-input.rb +27 -0
- data/test/unit/test-io-tcp.rb +33 -0
- data/test/unit/test-io-tcpclient.rb +54 -0
- data/test/unit/test-io-tcpfns.rb +17 -0
- data/test/unit/test-io-tcpserver.rb +50 -0
- data/test/unit/test-proc-eval.rb +36 -0
- data/test/unit/test-proc-hook.rb +30 -0
- data/test/unit/test-proc-load_cmds.rb +50 -0
- data/test/unit/test-proc-location.rb +79 -0
- data/test/unit/test-subcmd-help.rb +44 -0
- data/trepan8.gemspec +52 -0
- 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
|