Class: NanDoc::Filters::CustomTag::TagParser::Seq

Inherits:
Object
  • Object
show all
Includes:
ParserSymbol
Defined in:
lib/nandoc/filters/tag-parser.rb

Overview

concatentation production

Instance Method Summary collapse

Methods included from ParserSymbol

#secret_grammar

Constructor Details

#initialize(grammar, arr) ⇒ Seq

Returns a new instance of Seq.



157
158
159
160
161
162
# File 'lib/nandoc/filters/tag-parser.rb', line 157

def initialize grammar, arr
  secret_grammar grammar
  @arr = arr
  @parsers = Array.new(arr.size)
  @done = false
end

Instance Method Details

#get_parser_at(offset) ⇒ Object



163
164
165
166
167
168
169
170
171
172
# File 'lib/nandoc/filters/tag-parser.rb', line 163

def get_parser_at offset
  @parsers[offset] ||= begin
    def_thing = @arr[offset]
    sym = nil
    if def_thing
      sym = grammar.get_symbol(def_thing)
    end
    sym
  end
end

#parse(scn, sex, fails) ⇒ Object



173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
# File 'lib/nandoc/filters/tag-parser.rb', line 173

def parse scn, sex, fails
  my_ret = nil
  current = 0
  last = @arr.size - 1
  sym = get_parser_at(current)
  while sym
    puts "sequence at #{current} about to parse #{scn.rest.inspect}"
    ch_ret = sym.parse(scn, sex, fails)
    if ch_ret.kind_of?(ParserSymbol)
      sym = ch_ret
    elsif ch_ret == false
      sym = false
      my_ret = false
      break
    elsif ch_ret == true
      current += 1
      sym = get_parser_at(current)
    else
      fail("don't know what to do with this: #{ch_ret.inspect}")
    end
  end
  if my_ret.nil?
    if current <= last
      fail("what happened?")
    else
      my_ret = true
    end
  end
  my_ret
end