Class: Packcr::Node::StringNode
- Inherits:
-
Packcr::Node
show all
- Defined in:
- lib/packcr/node/string_node.rb,
lib/packcr/generated/node/string_node.rb
Instance Attribute Summary collapse
Instance Method Summary
collapse
-
#debug_dump(indent = 0) ⇒ Object
-
#generate_code(gen, onfail, indent, bare, oncut: nil) ⇒ Object
-
#get_many_code(gen, onfail, indent, bare, oncut, n) ⇒ Object
-
#get_one_code(gen, onfail, indent, bare, oncut, n) ⇒ Object
-
#initialize(value = nil) ⇒ StringNode
constructor
A new instance of StringNode.
-
#reachability ⇒ Object
-
#to_h ⇒ Object
#alt, #link_references, #nodes, #reversible?, #seq, #sequence?, #setup, #setup_rule, #verify_captures, #verify_variables
Constructor Details
#initialize(value = nil) ⇒ StringNode
Returns a new instance of StringNode.
6
7
8
|
# File 'lib/packcr/node/string_node.rb', line 6
def initialize(value = nil)
self.value = value
end
|
Instance Attribute Details
#value ⇒ Object
Returns the value of attribute value.
4
5
6
|
# File 'lib/packcr/node/string_node.rb', line 4
def value
@value
end
|
Instance Method Details
#debug_dump(indent = 0) ⇒ Object
14
15
16
17
18
|
# File 'lib/packcr/node/string_node.rb', line 14
def debug_dump(indent = 0)
$stdout.print "#{" " * indent}String(value:'"
Packcr.dump_escaped_string(value)
$stdout.print "')\n"
end
|
#generate_code(gen, onfail, indent, bare, oncut: nil) ⇒ Object
20
21
22
23
24
25
26
27
28
29
|
# File 'lib/packcr/node/string_node.rb', line 20
def generate_code(gen, onfail, indent, bare, oncut: nil)
n = value&.length || 0
return unless n > 0
if n > 1
gen.write Packcr.format_code(get_many_code(gen, onfail, indent, bare, oncut, n), indent: indent)
else
gen.write Packcr.format_code(get_one_code(gen, onfail, indent, bare, oncut, n), indent: indent)
end
end
|
#get_many_code(gen, onfail, indent, bare, oncut, n) ⇒ Object
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
# File 'lib/packcr/generated/node/string_node.rb', line 4
def get_many_code(gen, onfail, indent, bare, oncut, n)
case gen.lang
when :c
erbout = +""
erbout << "if (\n packcr_refill_buffer(ctx, #{n}) < #{n} ||\n".freeze
(n - 1).times do |i|
erbout << " (ctx->buffer.buf + ctx->position_offset)[#{i}] != '#{Packcr.escape_character(value[i])}' ||\n".freeze
end
erbout << " (ctx->buffer.buf + ctx->position_offset)[#{n - 1}] != '#{Packcr.escape_character(value[n - 1])}'\n) goto L#{format("%04d", onfail)};\n".freeze
if gen.location
erbout << "packcr_location_forward(&ctx->position_offset_loc, ctx->buffer.buf + ctx->position_offset, #{n});\n".freeze
end
erbout << "ctx->position_offset += #{n};\n".freeze
erbout
when :rb
erbout = +""
erbout << "if (\n refill_buffer(#{n}) < #{n} ||\n @buffer[@position_offset, #{n}] != #{value[0, n].dump}\n)\n throw(#{onfail})\nend\n".freeze
if gen.location
erbout << "@position_offset_loc = @position_offset_loc.forward(@buffer, @position_offset, #{n})\n".freeze
end
erbout << "@position_offset += #{n}\n".freeze
erbout
end
end
|
#get_one_code(gen, onfail, indent, bare, oncut, n) ⇒ Object
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
# File 'lib/packcr/generated/node/string_node.rb', line 34
def get_one_code(gen, onfail, indent, bare, oncut, n)
case gen.lang
when :c
erbout = +""
erbout << "if (\n packcr_refill_buffer(ctx, 1) < 1 ||\n ctx->buffer.buf[ctx->position_offset] != '#{Packcr.escape_character(value[0])}'\n) goto L#{format("%04d", onfail)};\n".freeze
if gen.location
erbout << " packcr_location_forward(&ctx->position_offset_loc, ctx->buffer.buf + ctx->position_offset, 1);\n".freeze
end
erbout << "ctx->position_offset++;\n".freeze
erbout
when :rb
erbout = +""
erbout << "if (\n refill_buffer(1) < 1 ||\n @buffer[@position_offset] != \"#{Packcr.escape_character(value[0])}\"\n)\n throw(#{onfail})\nend\n".freeze
if gen.location
erbout << "@position_offset_loc = @position_offset_loc.forward(@buffer, @position_offset, 1)\n".freeze
end
erbout << "@position_offset += 1\n".freeze
erbout
end
end
|
#to_h ⇒ Object
40
41
42
43
44
45
|
# File 'lib/packcr/node/string_node.rb', line 40
def to_h
{
type: :string,
value: value,
}
end
|