translation_unit_parser.h

来自「Boost provides free peer-reviewed portab」· C头文件 代码 · 共 1,346 行 · 第 1/4 页

H
1,346
字号
            HANNIBAL_REGISTER_RULE(cv_qualifier_seq);            cv_qualifier_seq                =   cv_qualifier >> !cv_qualifier_seq                ;            HANNIBAL_REGISTER_RULE(cv_qualifier);            cv_qualifier                =   ch_p(T_CONST)                 |   ch_p(T_VOLATILE)                ;            HANNIBAL_REGISTER_RULE(enum_specifier);            enum_specifier                 =   enum_keyword >> !ch_p(T_IDENTIFIER)                     >> ch_p(T_LEFTBRACE) >> !enumerator_list >> ch_p(T_RIGHTBRACE)                ;            HANNIBAL_REGISTER_RULE(enum_keyword);            enum_keyword                =   ch_p(T_ENUM)                ;            HANNIBAL_REGISTER_RULE(enumerator_list);            enumerator_list                =   enumerator_definition % ch_p(T_COMMA)                     >> !ch_p(T_COMMA)                     // TODO find out if this last COMMA_T is an MS-"extension"?                    // it seems not to be in the grammar but MSVC 7.0 accepts it.                ;            HANNIBAL_REGISTER_RULE(enumerator_definition);            enumerator_definition                = enumerator >> !(ch_p(T_ASSIGN) >> constant_expression)                ;            HANNIBAL_REGISTER_RULE(enumerator);            enumerator                =   ch_p(T_IDENTIFIER)                ;            HANNIBAL_REGISTER_RULE(simple_type_specifier);            simple_type_specifier                =   !ch_p(T_COLON_COLON) >> !nested_name_specifier                     >>  ch_p(T_TEMPLATE) >> template_id                |   +simple_type_name                |  !ch_p(T_COLON_COLON) >> !nested_name_specifier >> type_name                ;            HANNIBAL_REGISTER_RULE(class_head);            class_head // DH changed the order because otherwise it would always parse the (!IDENTIFIER) part.                =  !access_specifier >> *odd_language_extension                     >>  class_key >> *odd_language_extension                     >>  (                               !nested_name_specifier >> template_id                        |   nested_name_specifier >> ch_p(T_IDENTIFIER)                        |   !ch_p(T_IDENTIFIER)                        )                    >> !base_clause                ;            HANNIBAL_REGISTER_RULE(type_name);            type_name                =   class_name                |   enum_name                |   typedef_name                ;            HANNIBAL_REGISTER_RULE(elaborated_type_specifier);            elaborated_type_specifier                =   class_key >> *odd_language_extension                     >>  !ch_p(T_COLON_COLON)                     >>  !nested_name_specifier                     >>  (                             !ch_p(T_TEMPLATE) >> template_id                         |   ch_p(T_IDENTIFIER)                        )                |   ch_p(T_ENUM) >> !ch_p(T_COLON_COLON)                    >> !nested_name_specifier                     >>  ch_p(T_IDENTIFIER)                |   ch_p(T_TYPENAME)                     >> !ch_p(T_COLON_COLON)                     >>  nested_name_specifier                     >>  (                            !ch_p(T_TEMPLATE) >> template_id                         |   ch_p(T_IDENTIFIER)                        )                ;            HANNIBAL_REGISTER_RULE(template_argument_list);            template_argument_list                 =   template_argument % ch_p(T_COMMA)                ;            HANNIBAL_REGISTER_RULE(template_argument);            template_argument                =   longest_d                    [                        type_id                    |   ta_assignment_expression                    |   template_name                    ]                ;            HANNIBAL_REGISTER_RULE(class_key);            class_key                =   class_keywords                ;            HANNIBAL_REGISTER_RULE(class_keywords);            class_keywords                 =   ch_p(T_CLASS)                |   ch_p(T_STRUCT)                |   ch_p(T_UNION)                ;            HANNIBAL_REGISTER_RULE(nested_name_specifier);            nested_name_specifier                =   class_or_namespace_name >> ch_p(T_COLON_COLON)                     >>  ch_p(T_TEMPLATE) >> nested_name_specifier                |   class_or_namespace_name >> ch_p(T_COLON_COLON)                     >> !nested_name_specifier                ;            HANNIBAL_REGISTER_RULE(class_or_namespace_name);            class_or_namespace_name                =   class_name                 |   namespace_name                ;            HANNIBAL_REGISTER_RULE(class_name);            class_name                 =   template_id                |   ch_p(T_IDENTIFIER)                ;            HANNIBAL_REGISTER_RULE(enum_name);            enum_name                =   ch_p(T_IDENTIFIER)                ;            HANNIBAL_REGISTER_RULE(typedef_name);            typedef_name                =   ch_p(T_IDENTIFIER)                ;            HANNIBAL_REGISTER_RULE(namespace_name);            namespace_name    // TODO                =   ch_p(T_IDENTIFIER)                ;            HANNIBAL_REGISTER_RULE(template_id);            template_id                 =   template_name                     >> ch_p(T_LESS) >> template_argument_list >> ch_p(T_GREATER)                ;            //            //  This is kind of a HACK. We want to prevent the decl_specifier_seq             //  from eating the whole declaration, including the ch_p(T_IDENTIFIER).             //  Therefore in the sequence, we only allow one 'unknown' word             //  (the type_specifier), the rest of the decl_specifier sequence             //  must consist of known keywords or constructs (the             //  no_type_decl_specifier).            //  This means that a declaration like:            //     MYDLL_EXPORT int f();             //  will not be accepted unless the MYDLL_EXPORT is properly             //  expanded by the preprocessor first.            //                 //  This should not cause any problems normally, it just means that             //  this rule is not very robust in the case where not all symbols             //  are known.            //            HANNIBAL_REGISTER_RULE(decl_specifier_seq);            decl_specifier_seq                =  *no_type_decl_specifier >> type_specifier >> *no_type_decl_specifier                ;            //  The following rule is more according to the standard grammar            //  decl_specifier_seq // adapted            //     =   decl_specifier >> decl_specifier_seq            //    |   (decl_specifier - (declarator_id >> parameters_or_array_spec ))             //     ;            HANNIBAL_REGISTER_RULE( storage_class_specifier);            storage_class_specifier                =   ch_p(T_AUTO)                |   ch_p(T_REGISTER)                |   ch_p(T_STATIC)                |   ch_p(T_EXTERN)                |   ch_p(T_MUTABLE)                ;            HANNIBAL_REGISTER_RULE( function_specifier);            function_specifier                =   ch_p(T_INLINE)                |   ch_p(T_VIRTUAL)                |   ch_p(T_EXPLICIT)                ;            HANNIBAL_REGISTER_RULE(class_specifier);            class_specifier                =   class_head                     >> ch_p(T_LEFTBRACE) >> !member_specification >> ch_p(T_RIGHTBRACE)                ;            HANNIBAL_REGISTER_RULE(member_specification);            member_specification                =  +(   access_specifier >> ch_p(T_COLON)                    |   member_declaration HANNIBAL_TRACE_ACTION("member declaration")                    )                ;      //    member_specification      //     = access_specifier >> COLON_T >> !member_specification      //     | member_declaration >> !member_specification      //     ;            HANNIBAL_REGISTER_RULE(member_declaration);            member_declaration                =   using_declaration                |   template_declaration                |  !decl_specifier_seq >> !member_declarator_list                     >> ch_p(T_SEMICOLON)                |   function_definition >>                    !ch_p(T_SEMICOLON)                |   qualified_id                     >> ch_p(T_SEMICOLON)                ;            HANNIBAL_REGISTER_RULE(member_declarator_list);            member_declarator_list                =   member_declarator % ch_p(T_COMMA)                ;            HANNIBAL_REGISTER_RULE(member_declarator);            member_declarator                =  !ch_p(T_IDENTIFIER) >> ch_p(T_COLON) >> constant_expression                |   declarator >> !(pure_specifier | constant_initializer)                ;            HANNIBAL_REGISTER_RULE(pure_specifier);            pure_specifier                =   ch_p(T_ASSIGN) >> ch_p(T_INTLIT)                ;            HANNIBAL_REGISTER_RULE(constant_initializer);            constant_initializer                =   ch_p(T_ASSIGN) >> constant_expression                ;            HANNIBAL_REGISTER_RULE(access_specifier);            access_specifier                 =   ch_p(T_PUBLIC)                |   ch_p(T_PROTECTED)                |   ch_p(T_PRIVATE)                ;            HANNIBAL_REGISTER_RULE(base_clause);            base_clause                =   ch_p(T_COLON) >> base_specifier_list                ;            HANNIBAL_REGISTER_RULE(base_specifier_list);            base_specifier_list                =   base_specifier % ch_p(T_COMMA)                ;            HANNIBAL_REGISTER_RULE(base_specifier);            base_specifier                =   ch_p(T_VIRTUAL) >> !access_specifier >> !ch_p(T_COLON_COLON)                     >> !nested_name_specifier >> class_name                |   access_specifier >> !ch_p(T_VIRTUAL) >> !ch_p(T_COLON_COLON)                    >> !nested_name_specifier >> class_name                |  !ch_p(T_COLON_COLON) >> !nested_name_specifier >> class_name                ;            HANNIBAL_REGISTER_RULE(extension_type_decorator);            extension_type_decorator                =   ch_p(T_MSEXT_CDECL)                 |   ch_p(T_MSEXT_DECLSPEC)                |   ch_p(T_MSEXT_BASED)                |   ch_p(T_MSEXT_FASTCALL)                 |   ch_p(T_MSEXT_INLINE)                ;            HANNIBAL_REGISTER_RULE(simple_type_name);            simple_type_name                =   ch_p(T_CHAR)                |   ch_p(T_WCHART)                |   ch_p(T_BOOL)                |   ch_p(T_SHORT)                |   ch_p(T_INT)                |   ch_p(T_LONG)                 |   ch_p(T_UNSIGNED)                |   ch_p(T_SIGNED)                |   ch_p(T_FLOAT)                |   ch_p(T_DOUBLE)                |   ch_p(T_VOID)                |   ch_p(T_MSEXT_INT64)                |   ch_p(T_MSEXT_INT8)                |   ch_p(T_MSEXT_INT16)                |   ch_p(T_MSEXT_INT32)                ;        }        rule_type const& start() const { return translation_unit; }        //  Helper function wrapping pattern_p        static inline boost::wave::util::pattern_and< boost::wave::token_id>          pp (boost::wave::token_id id)        {            using namespace boost::wave;            return util::pattern_p(id, MainTokenMask);        }    };  #if HANNIBAL_DUMP_PARSE_TREE != 0private:    template<typename Rule>    void declare_rule(Rule const& rule, std::string const& rule_name) const    {        if (rule_map_ptr)            (*rule_map_ptr)[rule.id()] = rule_name;    }    rule_map_type *rule_map_ptr;#endif };#undef HANNIBAL_REGISTER_RULE#undef HANNIBAL_TRACE_TRANSLATION_UNIT_GRAMMAR#endif // HANNIBAL_TRANSLATION_UNIT_GRAMMAR_H_INCLUDED

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?