Class: Packcr::Context
Instance Attribute Summary
Attributes inherited from Parser
#rules
Instance Method Summary
collapse
Methods inherited from Parser
#action_character_class_0, #action_code_block_0, #action_code_block_1, #action_code_blocks_0, #action_code_blocks_1, #action_directive_include_0, #action_directive_include_1, #action_directive_include_2, #action_directive_include_3, #action_directive_include_4, #action_directive_include_5, #action_directive_include_6, #action_directive_include_7, #action_directive_include_8, #action_directive_string_0, #action_directive_string_1, #action_directive_string_2, #action_expression_0, #action_expression_1, #action_footer_0, #action_identifier_0, #action_lang_code_block_0, #action_lang_code_block_1, #action_plain_code_block_0, #action_pred_0, #action_pred_1, #action_pred_2, #action_primary_0, #action_primary_1, #action_primary_2, #action_primary_3, #action_primary_4, #action_primary_5, #action_primary_6, #action_primary_7, #action_primary_8, #action_primary_9, #action_quantity_0, #action_quantity_1, #action_quantity_2, #action_quantity_3, #action_quotation_double_0, #action_quotation_single_0, #action_rule_0, #action_sequence_0, #action_sequence_1, #action_statement_0, #action_term_0, #action_term_1, #apply_rule, #commit_buffer, #debug, #do_action, #evaluate_rule_character_class, #evaluate_rule_code, #evaluate_rule_code_block, #evaluate_rule_code_blocks, #evaluate_rule_codechar, #evaluate_rule_codes, #evaluate_rule_comment, #evaluate_rule_directive_include, #evaluate_rule_directive_string, #evaluate_rule_expression, #evaluate_rule_footer, #evaluate_rule_identifier, #evaluate_rule_lang_code_block, #evaluate_rule_lf, #evaluate_rule_opt_spaces_or_comments, #evaluate_rule_plain_code_block, #evaluate_rule_pred, #evaluate_rule_primary, #evaluate_rule_quantity, #evaluate_rule_quotation_double, #evaluate_rule_quotation_single, #evaluate_rule_rule, #evaluate_rule_sequence, #evaluate_rule_spaces, #evaluate_rule_statement, #evaluate_rule_term, #make_rulehash, #refill_buffer, #rule, #run
Constructor Details
#initialize(path, lines: false, debug: false, ascii: false, lang: nil) ⇒ Context
Returns a new instance of Context.
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
# File 'lib/packcr/context.rb', line 5
def initialize(path, lines: false, debug: false, ascii: false, lang: nil)
super(debug: debug)
if !path
raise ArgumentError, "bad path: #{path}";
end
@iname = path
@ifile = File.open(path, "rb")
dirname = File.dirname(path)
basename = File.basename(path, ".*")
if !lang
lang = File.extname(basename)[1..-1]&.to_sym
if lang
basename = File.basename(basename, ".*")
else
lang = :c
end
end
if dirname == "."
path = basename
else
path = File.join(dirname, basename)
end
@lang = lang.to_sym
case @lang
when :c
@sname = path + ".c"
@hname = path + ".h"
@hid = File.basename(@hname).upcase.gsub(/[^A-Z0-9]/, "_")
when :rb
@sname = path + ".rb"
@hname = nil
else
raise "unexpected lang: #{@lang}"
end
@lines = !!lines
@ascii = !!ascii
@errnum = 0
@linenum = 0
@charnum = 0
@linepos = 0
@bufpos = 0
@bufcur = 0
@esource = []
@eheader = []
@source = []
@header = []
@lheader = []
@lsource = []
@location = []
@init = []
if block_given?
yield(self)
end
end
|
Instance Method Details
#auxil_def ⇒ Object
91
92
93
94
|
# File 'lib/packcr/context.rb', line 91
def auxil_def
type = auxil_type
"#{type}#{type =~ /\*$/ ? "" : " "}"
end
|
#auxil_type ⇒ Object
79
80
81
|
# File 'lib/packcr/context.rb', line 79
def auxil_type
@auxil_type || "void *"
end
|
#class_name ⇒ Object
87
88
89
|
# File 'lib/packcr/context.rb', line 87
def class_name
prefix.gsub(/(?:_|^|(\W))([a-z])/) { "#{$1}#{$2}".upcase }
end
|
#dump_options ⇒ Object
101
102
103
104
105
106
107
|
# File 'lib/packcr/context.rb', line 101
def dump_options
$stdout.print <<~EOS
value_type: '#{value_type}'
auxil_type: '#{auxil_type}'
prefix: '#{prefix}'
EOS
end
|
#error(line, col, message) ⇒ Object
70
71
72
73
|
# File 'lib/packcr/context.rb', line 70
def error(line, col, message)
warn "#{@iname}:#{line}:#{col}: #{message}"
@errnum += 1
end
|
#generate ⇒ Object
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
# File 'lib/packcr/context.rb', line 142
def generate
if @hname
File.open(@hname, "wt") do |hio|
hstream = ::Packcr::Stream.new(hio, @hname, @lines ? 0 : nil)
hstream.write Packcr.template("context/header.#{@lang}.erb", binding), rewrite_line_directive: true
end
end
File.open(@sname, "wt") do |sio|
sstream = ::Packcr::Stream.new(sio, @sname, @lines ? 0 : nil)
sstream.write Packcr.template("context/source.#{@lang}.erb", binding), rewrite_line_directive: true
end
if !@errnum.zero?
File.unlink(@hname) if @name
File.unlink(@sname)
return false
end
true
end
|
#inspect ⇒ Object
66
67
68
|
# File 'lib/packcr/context.rb', line 66
def inspect
"#<#{self.class}:0x%016x>" % object_id
end
|
#parse ⇒ Object
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
# File 'lib/packcr/context.rb', line 109
def parse
$stdin = @ifile
nil while super
if @location.empty?
@location = nil
end
make_rulehash
@rules.each do |rule|
rule.setup
rule.expr.link_references(self)
end
@rules[1..-1]&.each do |rule|
if rule.ref == 0
error rule.line + 1, rule.col + 1, "Never used rule '#{rule.name}'"
elsif rule.ref < 0 error rule.line + 1, rule.col + 1, "Multiple definition of rule '#{rule.name}'"
end
end
@rules.each do |rule|
rule.verify(self)
end
if @debug
@rules.each(&:debug_dump)
dump_options
end
@errnum.zero?
end
|
#prefix ⇒ Object
83
84
85
|
# File 'lib/packcr/context.rb', line 83
def prefix
@prefix || "pcc"
end
|
#value_def ⇒ Object
96
97
98
99
|
# File 'lib/packcr/context.rb', line 96
def value_def
type = value_type
"#{type}#{type =~ /\*$/ ? "" : " "}"
end
|
#value_type ⇒ Object
75
76
77
|
# File 'lib/packcr/context.rb', line 75
def value_type
@value_type || "int"
end
|