Class: Preprocessor::Parser
Overview
Constant Summary
Constants included
from CTokenizer
CTokenizer::EOF_TOKEN
Instance Attribute Summary
#source
Instance Method Summary
collapse
Methods included from Resolve
#args_given?, #resolve, #resolving?
Methods included from CTokenizer
check_token, #collect, #each, #error, error, line_count, #parse_error, #to_a, #token_error, #warning, whitespace?
#file, #line, #match?, #post_match, #scan
Constructor Details
#initialize(source, file = nil, line = 1, &upon_include) ⇒ Parser
Returns a new instance of Parser.
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
|
# File 'lib/dbc/preprocessor.rb', line 126
def initialize(source, file=nil, line=1, &upon_include)
@upon_include = upon_include
if source.class <= String
source = CTokenizer::Lexer.new(source, file, line)
end
@cond_comp = [true]
@source = Tokens.new(source)
@macro_tokens = CTokenizer::Lexer.new('', file, line)
@defines = {}
@resolving = {}
@parser = StatementParser.new(@defines)
end
|
Instance Method Details
#add_tokens(tokens) ⇒ Object
142
143
144
145
146
|
# File 'lib/dbc/preprocessor.rb', line 142
def add_tokens(tokens)
post_m = @macro_tokens.post_match
tokens << post_m if post_m
@macro_tokens = CTokenizer::Lexer.new(tokens, @source.file, @source.line)
end
|
#base? ⇒ Boolean
161
162
163
|
# File 'lib/dbc/preprocessor.rb', line 161
def base?
@source.base?
end
|
#define(macro, params = nil, tokens = nil) ⇒ Object
152
153
154
155
|
# File 'lib/dbc/preprocessor.rb', line 152
def define(macro, params=nil, tokens=nil)
self.error("cannot use 'defined' as a macro name") if macro == 'defined'
@defines[macro] = Define.new(params, tokens)
end
|
#defined?(macro) ⇒ Boolean
148
149
150
|
# File 'lib/dbc/preprocessor.rb', line 148
def defined?(macro)
@defines.include?(macro)
end
|
#empty? ⇒ Boolean
165
166
167
|
# File 'lib/dbc/preprocessor.rb', line 165
def empty?
@source.empty? and @macro_tokens.empty?
end
|
#shift ⇒ Object
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
|
# File 'lib/dbc/preprocessor.rb', line 169
def shift
if @macro_tokens.empty?
t = nil
loop do
start_line = @source.start_line
t = @source.shift
if t[1] == '#'
self.token_error('#') unless start_line or not @cond_comp.last
t = self.parse_statement
end
break if @cond_comp.last or !t[0]
end else
t = @macro_tokens.shift
end resolve(t)
end
|
#undef(macro) ⇒ Object
157
158
159
|
# File 'lib/dbc/preprocessor.rb', line 157
def undef(macro)
@defines.delete(macro)
end
|