diff options
Diffstat (limited to 'CIAO/CCF/CCF/IDL2/Parser.hpp')
-rw-r--r-- | CIAO/CCF/CCF/IDL2/Parser.hpp | 872 |
1 files changed, 0 insertions, 872 deletions
diff --git a/CIAO/CCF/CCF/IDL2/Parser.hpp b/CIAO/CCF/CCF/IDL2/Parser.hpp deleted file mode 100644 index 2a6e6b92b01..00000000000 --- a/CIAO/CCF/CCF/IDL2/Parser.hpp +++ /dev/null @@ -1,872 +0,0 @@ -// file : CCF/IDL2/Parser.hpp -// author : Boris Kolpackov <boris@dre.vanderbilt.edu> -// cvs-id : $Id$ - -#ifndef CCF_IDL2_PARSER_HPP -#define CCF_IDL2_PARSER_HPP - -#include "CCF/CompilerElements/Context.hpp" -#include "CCF/CompilerElements/Diagnostic.hpp" -#include "CCF/CompilerElements/FileSystem.hpp" - -#include "CCF/IDL2/SemanticAction.hpp" -#include "CCF/IDL2/LexicalAnalyzer.hpp" - -#include "CCF/IDL2/Parsing/Elements.hpp" -#include "CCF/IDL2/Parsing/Action.hpp" -#include "CCF/IDL2/Parsing/Recovery.hpp" - -// #$%^ing MS. -// -#ifdef CONST -#undef CONST -#undef FACTORY -#undef IN -#undef OUT -#endif - - -namespace CCF -{ - namespace IDL2 - { - using Parsing::ActionExecutor; - using Parsing::NoArgAction; - using Parsing::OneArgAction; - using Parsing::TwoArgAction; - - class Parser - { - public: - virtual - ~Parser (); - - protected: - Diagnostic::Stream& dout_; - LexicalAnalyzer const& lexer_; - SemanticAction::Factory& actions_; - - protected: - typedef - Parsing::Iterator - Iterator; - - // - // Primitives - // - - typedef - Parsing::EndOfStreamParser - EndOfStreamParser; - - typedef - Parsing::KeywordParser - KeywordParser; - - typedef - Parsing::PunctuationParser - PunctuationParser; - - typedef - Parsing::OperatorParser - OperatorParser; - - typedef - Parsing::IdentifierParser - IdentifierParser; - - typedef - Parsing::SimpleIdentifierParser - SimpleIdentifierParser; - - - typedef - Parsing::RecoveryDescriptor - RecoveryDescriptor; - - typedef - Parsing::Assertion - Assertion; - - typedef - Parsing::RecoveryStatus - RecoveryStatus; - - typedef - Parsing::Guard - Guard; - - //@@ names are not thought out weel for error handling - - struct ErrorHandler - { - ErrorHandler (CompilerElements::Context& context, - Diagnostic::Stream& dout) - : dout_ (dout), - context_ (context) - { - } - - RecoveryStatus - operator() (Parsing::Scanner const& s, Parsing::Error e) const - { - Iterator i = e.where; - - switch (e.descriptor->diagnostic_) - { - case Parsing::DiagnosticType::BEFORE: - { - Diagnostic::Error rec ( - context_.get<fs::path> ("file-path").native_file_string (), - (*i)->line ()); - - rec << "before \'" << (*i)->lexeme () << "\': " - << e.descriptor->description_; - - dout_ << rec; - break; - } - case Parsing::DiagnosticType::AFTER: - { - i--; - - Diagnostic::Error rec ( - context_.get<fs::path> ("file-path").native_file_string (), - (*i)->line ()); - - rec << "after \'" << (*i)->lexeme () << "\': " - << e.descriptor->description_; - - dout_ << rec; - break; - } - case Parsing::DiagnosticType::NONE: - { - } - } - - if (e.descriptor->action_one_.get ()) - e.descriptor->action_one_->execute (); - - if (e.descriptor->action_two_.get ()) - e.descriptor->action_two_->execute (); - - switch (e.descriptor->recovery_) - { - case Parsing::RecoveryMethod::STANDARD: - { - unsigned long balance = 0; - - for (Iterator t = e.where; t != s.last; t++) - { - //std::cerr << "error recovery: skipping " << (*t)->lexeme () - // << std::endl; - - if ((*t)->lexeme () == "{") balance++; - else if ((*t)->lexeme () == "}") - { - if (balance > 0) balance--; - else - { - t++; - if ((*t)->lexeme () == ";") t++; - - int length = t - s.first; - s.first += length; - return RecoveryStatus (RecoveryStatus::accept, length); - } - } - - if (balance == 0 && (*t)->lexeme () == ";") - { - int length = t - s.first + 1; - s.first += length; - return RecoveryStatus (RecoveryStatus::accept, length); - } - } - - switch (e.descriptor->diagnostic_) - { - case Parsing::DiagnosticType::BEFORE: - { - Diagnostic::Error rec ( - context_.get<fs::path> ("file-path").native_file_string (), - (*i)->line ()); - - rec << "before \'" << (*i)->lexeme () << "\': " - << "unable to recover from previous error: bailing out"; - - dout_ << rec; - break; - } - case Parsing::DiagnosticType::AFTER: - { - Diagnostic::Error rec ( - context_.get<fs::path> ("file-path").native_file_string (), - (*i)->line ()); - - rec << "after \'" << (*i)->lexeme () << "\': " - << "unable to recover from previous error: bailing out"; - - dout_ << rec; - break; - } - case Parsing::DiagnosticType::NONE: - { - } - } - - e.descriptor->recovery_ = Parsing::RecoveryMethod::BAIL_OUT; - e.descriptor->diagnostic_ = Parsing::DiagnosticType::NONE; - - e.descriptor->action_one_.reset (); - e.descriptor->action_two_.reset (); - - // return RecoveryStatus (RecoveryStatus::rethrow); - throw e; - } - case Parsing::RecoveryMethod::NONE: - default: - { - int length = e.where - s.first; - s.first += length; - return RecoveryStatus (RecoveryStatus::accept, length); - } - case Parsing::RecoveryMethod::BAIL_OUT: - { - e.descriptor->recovery_ = Parsing::RecoveryMethod::BAIL_OUT; - e.descriptor->diagnostic_ = Parsing::DiagnosticType::NONE; - - e.descriptor->action_one_.reset (); - e.descriptor->action_two_.reset (); - - // return RecoveryStatus (RecoveryStatus::rethrow); - throw e; - } - } - } - - Diagnostic::Stream& dout_; - CompilerElements::Context& context_; - }; - - struct RootErrorHandler - { - RecoveryStatus - operator() (Parsing::Scanner const&, Parsing::Error&) const - { - return RecoveryStatus (RecoveryStatus::fail); - } - }; - - struct handler - { - template<typename Object> - handler (Object& obj, - void (Object::*action_one)()) - : action_one_ (Parsing::call_thunk (obj, action_one)), - action_two_ (0) - { - } - - template<typename Object> - handler (Object& obj, - void (Object::*action_one)(), - void (Object::*action_two)()) - : action_one_ (Parsing::call_thunk (obj, action_one)), - action_two_ (Parsing::call_thunk (obj, action_two)) - { - } - - handler (handler const& h) - : action_one_ (h.action_one_.get () ? h.action_one_->clone () : 0), - action_two_ (h.action_two_.get () ? h.action_two_->clone () : 0) - { - } - - RecoveryStatus - operator() (Parsing::Scanner const&, Parsing::Error e) const - { - /* - assert ( - e.descriptor->diagnostic_ == Parsing::DiagnosticType::NONE && - e.descriptor->recovery_ == Parsing::RecoveryMethod::BAIL_OUT - ); - */ - - if (action_one_.get ()) action_one_->execute (); - if (action_two_.get ()) action_two_->execute (); - - // return RecoveryStatus (RecoveryStatus::rethrow); - throw e; - } - - std::auto_ptr<Parsing::Thunk> action_one_; - std::auto_ptr<Parsing::Thunk> action_two_; - }; - - Guard guard; - Guard hood; - Assertion assertion; - ErrorHandler error_handler; - RootErrorHandler root_error_handler; - - // End of stream parser. - // - EndOfStreamParser EOS; - - // Keyword parsers (alphabetic order). - // - KeywordParser ABSTRACT; - KeywordParser ATTRIBUTE; - KeywordParser BINCLUDE; - KeywordParser CASE; - KeywordParser CONST; - KeywordParser CUSTOM; - KeywordParser DEFAULT; - KeywordParser ENUM; - KeywordParser EXCEPTION; - KeywordParser FACTORY; - KeywordParser GETRAISES; - KeywordParser IN; - KeywordParser INOUT; - KeywordParser INTERFACE; - KeywordParser QINCLUDE; - KeywordParser LOCAL; - KeywordParser MODULE; - KeywordParser NATIVE; - KeywordParser ONEWAY; - KeywordParser OUT; - KeywordParser PRIVATE; - KeywordParser PUBLIC; - KeywordParser RAISES; - KeywordParser READONLY; - KeywordParser SEQUENCE; - KeywordParser SETRAISES; - KeywordParser STRING; - KeywordParser STRUCT; - KeywordParser SUPPORTS; - KeywordParser SWITCH; - KeywordParser TRUNCATABLE; - KeywordParser TYPEDEF; - KeywordParser TYPEID; - KeywordParser TYPEPREFIX; - KeywordParser UNION; - KeywordParser VALUETYPE; - KeywordParser WSTRING; - - // Punctuation parsers (alphabetic group order). - // - PunctuationParser COLON; - PunctuationParser COMMA; - PunctuationParser LCBRACE; - PunctuationParser RCBRACE; - PunctuationParser LSBRACE; - PunctuationParser RSBRACE; - PunctuationParser LPAREN; - PunctuationParser RPAREN; - PunctuationParser LT; - PunctuationParser GT; - PunctuationParser SEMI; - - OperatorParser ADD; - OperatorParser AND; - OperatorParser COM; - OperatorParser DIV; - OperatorParser EQ; - OperatorParser LSH; - OperatorParser MUL; - OperatorParser OR; - OperatorParser REM; - OperatorParser SUB; - OperatorParser RSH; - OperatorParser XOR; - - - IdentifierParser identifier; - SimpleIdentifierParser simple_identifier; - - Parsing::BooleanLiteralParser boolean_literal; - Parsing::CharacterLiteralParser character_literal; - Parsing::IntegerLiteralParser integer_literal; - Parsing::StringLiteralParser string_literal; - - // - // Language - // - typedef - Parsing::Rule - Rule; - - Rule language; - Rule import; - Rule declaration; - Rule extension; - - Rule include_decl; - - Rule type_decl; - - Rule module_decl; - - Rule const_decl; - Rule const_expr; - - Rule enum_decl; - Rule enumerator_decl; - - Rule boolean_const_expr; - Rule character_const_expr; - Rule numeric_const_expr; - - Rule numeric_or_expr; - Rule numeric_xor_expr; - Rule numeric_and_expr; - Rule numeric_shift_expr; - Rule numeric_add_expr; - Rule numeric_mul_expr; - Rule numeric_unary_expr; - Rule numeric_primary_expr; - - Rule string_const_expr; - - Rule abstract_type_decl; - Rule local_type_decl; - - Rule abstract_interface_decl; - Rule local_interface_decl; - Rule unconstrained_interface_decl; - Rule interface_inheritance_spec; - Rule interface_body; - - Rule attribute_decl; - Rule attribute_ro_decl_trailer; - Rule attribute_rw_decl_trailer; - Rule attribute_ro_raises_spec; - Rule attribute_rw_raises_spec; - Rule attribute_get_raises_list; - Rule attribute_set_raises_list; - - Rule exception_decl; - Rule exception_body; - - Rule direction_specifier; - - Rule member_decl; - - Rule native_decl; - - Rule operation_decl; - Rule operation_decl_trailer; - Rule operation_parameter_list; - Rule operation_parameter; - Rule operation_raises_list; - - Rule struct_decl; - Rule struct_body; - - Rule typedef_decl; - Rule typedef_declarator; - Rule typedef_type_spec; - - Rule type_id_decl; - Rule type_prefix_decl; - - Rule union_decl; - Rule union_def_trailer; - Rule union_body; - Rule union_case_label; - - Rule abstract_value_type_decl; - Rule concrete_value_type_decl; - Rule value_type_inheritance_spec; - Rule value_type_supports_spec; - Rule value_type_body; - - Rule value_type_factory_decl; - Rule value_type_factory_parameter_list; - Rule value_type_factory_parameter; - Rule value_type_factory_raises_list; - - Rule value_type_member_decl; - public: - Parser (CompilerElements::Context& context, - Diagnostic::Stream& dout, - LexicalAnalyzer const& l, - SemanticAction::Factory& f); - - virtual Rule const& - start() const - { - return language; - } - - protected: - - // - // Semantic actions - // - typedef - NoArgAction<SemanticAction::Scope> - ScopeAction; - - - // Attribute - // - // - NoArgAction<SemanticAction::Attribute> - act_attribute_begin_ro, act_attribute_begin_rw; - - OneArgAction<IdentifierPtr, SemanticAction::Attribute> - act_attribute_type; - - OneArgAction<SimpleIdentifierPtr, SemanticAction::Attribute> - act_attribute_name; - - OneArgAction<IdentifierPtr, SemanticAction::Attribute> - act_attribute_get_raises; - - OneArgAction<IdentifierPtr, SemanticAction::Attribute> - act_attribute_set_raises; - - NoArgAction<SemanticAction::Attribute> - act_attribute_end; - - // Const - // - TwoArgAction<IdentifierPtr, SimpleIdentifierPtr, SemanticAction::Const> - act_const_begin; - - NoArgAction<SemanticAction::Const> - act_const_expr; - - - // Enum - // - // - OneArgAction<SimpleIdentifierPtr, SemanticAction::Enum> - act_enum_begin, act_enum_enumerator; - - NoArgAction<SemanticAction::Enum> - act_enum_end; - - // Expression - // - NoArgAction<SemanticAction::NumericExpression> - act_const_expr_flush; - - OneArgAction<IdentifierPtr, SemanticAction::NumericExpression> - act_numeric_expression_const; - - OneArgAction<IntegerLiteralPtr, SemanticAction::NumericExpression> - act_numeric_expression_integer_literal; - - OneArgAction<OperatorPtr, SemanticAction::NumericExpression> - act_numeric_expression_pre; - - NoArgAction<SemanticAction::NumericExpression> - act_numeric_expression_pos, - act_numeric_expression_neg, - act_numeric_expression_com, - act_numeric_expression_mul, - act_numeric_expression_div, - act_numeric_expression_rem, - act_numeric_expression_add, - act_numeric_expression_sub, - act_numeric_expression_rsh, - act_numeric_expression_lsh, - act_numeric_expression_and, - act_numeric_expression_xor, - act_numeric_expression_or; - - - // Exception - // - // - OneArgAction<SimpleIdentifierPtr, SemanticAction::Exception> - act_exception_begin; - - ScopeAction - act_exception_open_scope; - - ScopeAction - act_exception_close_scope; - - NoArgAction<SemanticAction::Exception> - act_exception_end; - - - // Include - // - // - OneArgAction<StringLiteralPtr, SemanticAction::Include> - act_include_quote, act_include_bracket; - - NoArgAction<SemanticAction::Include> - act_include_end; - - // Interface - // - // - OneArgAction<SimpleIdentifierPtr, SemanticAction::Interface> - act_interface_begin_abstract_def, - act_interface_begin_abstract_fwd, - act_interface_begin_local_def, - act_interface_begin_local_fwd, - act_interface_begin_unconstrained_def, - act_interface_begin_unconstrained_fwd; - - OneArgAction<IdentifierPtr, SemanticAction::Interface> - act_interface_inherits; - - ScopeAction - act_interface_open_scope; - - ScopeAction - act_interface_close_scope; - - NoArgAction<SemanticAction::Interface> - act_interface_end; - - - // Member - // - // - OneArgAction<IdentifierPtr, SemanticAction::Member> - act_member_type; - - OneArgAction<SimpleIdentifierPtr, SemanticAction::Member> - act_member_name; - - NoArgAction<SemanticAction::Member> - act_member_end; - - - // Module - // - // - OneArgAction<SimpleIdentifierPtr, SemanticAction::Module> - act_module_begin; - - ScopeAction - act_module_open_scope; - - ScopeAction - act_module_close_scope; - - NoArgAction<SemanticAction::Module> - act_module_end; - - // Native - // - // - OneArgAction<SimpleIdentifierPtr, SemanticAction::Native> - act_native_name; - - NoArgAction<SemanticAction::Native> - act_native_end; - - - // Operation - // - // - NoArgAction<SemanticAction::Operation> - act_operation_one_way, act_operation_two_way; - - OneArgAction<IdentifierPtr, SemanticAction::Operation> - act_operation_type; - - OneArgAction<SimpleIdentifierPtr, SemanticAction::Operation> - act_operation_name; - - void - act_operation_parameter_core (Iterator begin, Iterator) const - { - SemanticAction::Operation::Direction::Value d; - - if((*begin)->lexeme () == "in") - { - d = SemanticAction::Operation::Direction::in; - } - else if((*begin)->lexeme () == "out") - { - d = SemanticAction::Operation::Direction::out; - } - else - { - d = SemanticAction::Operation::Direction::inout; - } - - begin++; - - actions_.operation ().parameter ( - d, - ReferenceCounting::strict_cast<Identifier>(*begin), - ReferenceCounting::strict_cast<SimpleIdentifier>(*(begin + 1))); - } - - ActionExecutor<Parser> - act_operation_parameter; - - OneArgAction<IdentifierPtr, SemanticAction::Operation> - act_operation_raises; - - - // Struct - // - // - OneArgAction<SimpleIdentifierPtr, SemanticAction::Struct> - act_struct_begin_def; - - OneArgAction<SimpleIdentifierPtr, SemanticAction::Struct> - act_struct_begin_fwd; - - ScopeAction - act_struct_open_scope; - - ScopeAction - act_struct_close_scope; - - NoArgAction<SemanticAction::Struct> - act_struct_end; - - - // Typedef - // - // - OneArgAction<KeywordPtr, SemanticAction::Typedef> - act_typedef_pre; - - OneArgAction<IdentifierPtr, SemanticAction::Typedef> - act_typedef_begin; - - OneArgAction<IdentifierPtr, SemanticAction::Typedef> - act_typedef_begin_unbounded_seq; - - OneArgAction<IdentifierPtr, SemanticAction::Typedef> - act_typedef_begin_bounded_seq; - - NoArgAction<SemanticAction::Typedef> - act_typedef_begin_bounded_string; - - NoArgAction<SemanticAction::Typedef> - act_typedef_begin_bounded_wstring; - - NoArgAction<SemanticAction::Typedef> - act_typedef_begin_array; - - NoArgAction<SemanticAction::Typedef> - act_typedef_bound; - - OneArgAction<SimpleIdentifierPtr, SemanticAction::Typedef> - act_typedef_declarator; - - NoArgAction<SemanticAction::Typedef> - act_typedef_end; - - - // TypeId - // - // - TwoArgAction<IdentifierPtr, - StringLiteralPtr, - SemanticAction::TypeId> - act_type_id_begin; - - NoArgAction<SemanticAction::TypeId> - act_type_id_end; - - - // TypePrefix - // - // - TwoArgAction<IdentifierPtr, - StringLiteralPtr, - SemanticAction::TypePrefix> - act_type_prefix_begin; - - NoArgAction<SemanticAction::TypePrefix> - act_type_prefix_end; - - // Union - // - // - OneArgAction<SimpleIdentifierPtr, SemanticAction::Union> - act_union_begin_def, act_union_begin_fwd; - - OneArgAction<IdentifierPtr, SemanticAction::Union> - act_union_type; - - ScopeAction - act_union_open_scope; - - OneArgAction<IdentifierPtr, SemanticAction::Union> - act_union_member_type; - - OneArgAction<SimpleIdentifierPtr, SemanticAction::Union> - act_union_member_name; - - ScopeAction - act_union_close_scope; - - NoArgAction<SemanticAction::Union> - act_union_end; - - - // ValueType - // - OneArgAction<SimpleIdentifierPtr, SemanticAction::ValueType> - act_value_type_begin_abstract_def, - act_value_type_begin_abstract_fwd, - act_value_type_begin_concrete_def, - act_value_type_begin_concrete_fwd; - - OneArgAction<IdentifierPtr, SemanticAction::ValueType> - act_value_type_inherits, act_value_type_supports; - - ScopeAction - act_value_type_open_scope; - - ScopeAction - act_value_type_close_scope; - - NoArgAction<SemanticAction::ValueType> - act_value_type_end; - - - // ValueTypeFactory - // - OneArgAction<SimpleIdentifierPtr, SemanticAction::ValueTypeFactory> - act_value_type_factory_name; - - TwoArgAction<IdentifierPtr, - SimpleIdentifierPtr, - SemanticAction::ValueTypeFactory> - act_value_type_factory_parameter; - - OneArgAction<IdentifierPtr, SemanticAction::ValueTypeFactory> - act_value_type_factory_raises; - - - // ValueTypeMember - // - NoArgAction<SemanticAction::ValueTypeMember> - act_value_type_member_begin_private; - - NoArgAction<SemanticAction::ValueTypeMember> - act_value_type_member_begin_public; - - OneArgAction<IdentifierPtr, SemanticAction::ValueTypeMember> - act_value_type_member_type; - - OneArgAction<SimpleIdentifierPtr, SemanticAction::ValueTypeMember> - act_value_type_member_name; - - NoArgAction<SemanticAction::ValueTypeMember> - act_value_type_member_end; - - }; - } -} - -#endif // CCF_IDL2_PARSER_HPP |