# File lib/mcollective/matcher/parser.rb, line 45
      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