/*
 * Copyright 2014 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef COBALT_CSS_PARSER_GRAMMAR_H_
#define COBALT_CSS_PARSER_GRAMMAR_H_

// A wrapper around grammar_generated.h, the latter should never be included
// directly.
//
// This file confines violations of a C++ style guide caused by Bison to a
// single place. Bison does not generate header guards nor it allows to specify
// a namespace for generated code. This causes three problems:
//
//   - files generated by Bison are not complete and cannot be included in
//     the same way as headers that comply with style guide;
//
//   - files generated by Bison should be included inside our namespace
//     to avoid a polution of a global namespace;
//
//   - as a corollary to the previous problem, header files that contain
//     namespaces cannot be included from grammar (.y) as this will cause double
//     nesting of included classes.

#include "cobalt/css_parser/animation_shorthand_property_parse_structures.h"
#include "cobalt/css_parser/background_shorthand_property_parse_structures.h"
#include "cobalt/css_parser/border_shorthand_property_parse_structures.h"
#include "cobalt/css_parser/font_shorthand_property_parse_structures.h"
#include "cobalt/css_parser/position_parse_structures.h"
#include "cobalt/css_parser/shadow_property_parse_structures.h"
#include "cobalt/css_parser/transition_shorthand_property_parse_structures.h"
#include "cobalt/css_parser/trivial_string_piece.h"
#include "cobalt/css_parser/trivial_type_pairs.h"
#include "cobalt/cssom/color_stop.h"
#include "cobalt/cssom/combinator.h"
#include "cobalt/cssom/complex_selector.h"
#include "cobalt/cssom/compound_selector.h"
#include "cobalt/cssom/css_declared_style_data.h"
#include "cobalt/cssom/css_font_face_rule.h"
#include "cobalt/cssom/css_keyframe_rule.h"
#include "cobalt/cssom/css_keyframes_rule.h"
#include "cobalt/cssom/css_media_rule.h"
#include "cobalt/cssom/css_style_declaration.h"
#include "cobalt/cssom/css_style_rule.h"
#include "cobalt/cssom/css_style_sheet.h"
#include "cobalt/cssom/integer_value.h"
#include "cobalt/cssom/keyword_value.h"
#include "cobalt/cssom/length_value.h"
#include "cobalt/cssom/linear_gradient_value.h"
#include "cobalt/cssom/local_src_value.h"
#include "cobalt/cssom/media_feature.h"
#include "cobalt/cssom/media_feature_keyword_value.h"
#include "cobalt/cssom/media_list.h"
#include "cobalt/cssom/media_query.h"
#include "cobalt/cssom/number_value.h"
#include "cobalt/cssom/percentage_value.h"
#include "cobalt/cssom/property_key_list_value.h"
#include "cobalt/cssom/property_list_value.h"
#include "cobalt/cssom/radial_gradient_value.h"
#include "cobalt/cssom/ratio_value.h"
#include "cobalt/cssom/selector.h"
#include "cobalt/cssom/shadow_value.h"
#include "cobalt/cssom/simple_selector.h"
#include "cobalt/cssom/time_list_value.h"
#include "cobalt/cssom/timing_function_list_value.h"
#include "cobalt/cssom/transform_function.h"
#include "cobalt/cssom/transform_function_list_value.h"
#include "cobalt/cssom/url_src_value.h"

namespace cobalt {
namespace css_parser {

struct MarginOrPaddingShorthand;
class ParserImpl;
struct PropertyDeclaration;

// Override the default source location type from Bison with our own.
struct cobalt_yyltype {
  int first_line;
  int first_column;

  // A pointer to the start of the line the action or token was found on.
  const char* line_start;
};
#define YYLTYPE cobalt::css_parser::cobalt_yyltype
#define YYLTYPE_IS_DECLARED 1
#define YYLTYPE_IS_TRIVIAL 0

#if defined(OS_STARBOARD)
#include "starboard/memory.h"
#define YYFREE SbMemoryFree
#define YYMALLOC SbMemoryAllocate
#endif

// A header generated by Bison must be included inside our namespace
// to avoid global namespace pollution.
#include "cobalt/css_parser/grammar_generated.h"

}  // namespace css_parser
}  // namespace cobalt

#endif  // COBALT_CSS_PARSER_GRAMMAR_H_
