Method: Q#_nt_statement

Defined in:
lib/q/parser.rb

#_nt_statementObject



150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
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
# File 'lib/q/parser.rb', line 150

def _nt_statement
  start_index = index
  if node_cache[:statement].has_key?(index)
    cached = node_cache[:statement][index]
    if cached
      node_cache[:statement][index] = cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
      @index = cached.interval.end
    end
    return cached
  end

  i0, s0 = index, []
  r1 = _nt_expression
  s0 << r1
  if r1
    s2, i2 = [], index
    loop do
      r3 = _nt_ws
      if r3
        s2 << r3
      else
        break
      end
    end
    r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
    s0 << r2
    if r2
      if (match_len = has_terminal?(';', false, index))
        r4 = true
        @index += match_len
      else
        terminal_parse_failure(';')
        r4 = nil
      end
      s0 << r4
    end
  end
  if s0.last
    r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
    r0.extend(Statement0)
    r0.extend(Statement1)
  else
    @index = i0
    r0 = nil
  end

  node_cache[:statement][start_index] = r0

  r0
end