def parse
pre_index = @scanner.token_index
p_token,p_token_value = nil
c_token,c_token_value = @scanner.get_token
parenth = 0
while (c_token != nil)
@scanner.token_index += 1
n_token, n_token_value = @scanner.get_token
unless n_token == " "
case c_token
when "bad_token"
@token_errors << c_token_value
when "and"
unless (n_token =~ /not|fstatement|statement|\(/) || (scanner.token_index == scanner.arguments.size) && !(n_token == nil)
@parse_errors << [pre_index, scanner.token_index]
end
if p_token == nil
@parse_errors << [pre_index - c_token.size, scanner.token_index]
elsif (p_token == "and" || p_token == "or")
@parse_errors << [pre_index - 1 - p_token.size, pre_index - 1]
end
when "or"
unless (n_token =~ /not|fstatement|statement|\(/) || (scanner.token_index == scanner.arguments.size) && !(n_token == nil)
@parse_errors << [pre_index, scanner.token_index]
end
if p_token == nil
@parse_errors << [pre_index - c_token.size, scanner.token_index]
elsif (p_token == "and" || p_token == "or")
@parse_errors << [pre_index - 1 - p_token.size, pre_index - 1]
end
when "not"
unless n_token =~ /fstatement|statement|\(|not/ && !(n_token == nil)
@parse_errors << [pre_index, scanner.token_index]
end
when "statement","fstatement"
unless n_token =~ /and|or|\)/
unless scanner.token_index == scanner.arguments.size
@parse_errors << [pre_index, scanner.token_index]
end
end
when ")"
unless (n_token =~ /|and|or|not|\(/)
unless(scanner.token_index == scanner.arguments.size)
@parse_errors << [pre_index, scanner.token_index]
end
end
unless @paren_errors.empty?
@paren_errors.pop
else
@paren_errors.push((n_token.nil?) ? scanner.token_index - 1: scanner.token_index - n_token_value.size)
end
when "("
unless n_token =~ /fstatement|statement|not|\(/
@parse_errors << [pre_index, scanner.token_index]
end
@paren_errors.push((n_token.nil?) ? scanner.token_index - 1: scanner.token_index - n_token_value.size)
else
@parse_errors << [pre_index, scanner.token_index]
end
unless n_token == " " ||c_token == "bad_token"
@execution_stack << {c_token => c_token_value}
end
p_token, p_token_value = c_token, c_token_value
c_token, c_token_value = n_token, n_token_value
end
pre_index = @scanner.token_index
end
end