LCOV - code coverage report
Current view: top level - libreoffice/idlc/source - parser.y (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 869 1304 66.6 %
Date: 2012-12-27 Functions: 4 6 66.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * This file is part of the LibreOffice project.
       3             :  *
       4             :  * This Source Code Form is subject to the terms of the Mozilla Public
       5             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       6             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       7             :  *
       8             :  * This file incorporates work covered by the following license notice:
       9             :  *
      10             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      11             :  *   contributor license agreements. See the NOTICE file distributed
      12             :  *   with this work for additional information regarding copyright
      13             :  *   ownership. The ASF licenses this file to you under the Apache
      14             :  *   License, Version 2.0 (the "License"); you may not use this file
      15             :  *   except in compliance with the License. You may obtain a copy of
      16             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      17             :  */
      18             : 
      19             : /*
      20             :  * parser.yy - BISON grammar for IDLC 1.0
      21             :  */
      22             : 
      23             : %{
      24             : #include <string.h>
      25             : 
      26             : #ifndef _IDLC_IDLC_HXX_
      27             : #include <idlc/idlc.hxx>
      28             : #endif
      29             : #ifndef _IDLC_ERRORHANDLER_HXX_
      30             : #include <idlc/errorhandler.hxx>
      31             : #endif
      32             : #ifndef _IDLC_FEHELPER_HXX_
      33             : #include <idlc/fehelper.hxx>
      34             : #endif
      35             : #ifndef _IDLC_EXPRESSION_HXX_
      36             : #include <idlc/astexpression.hxx>
      37             : #endif
      38             : #ifndef _IDLC_ASTCONSTANTS_HXX_
      39             : #include <idlc/astconstants.hxx>
      40             : #endif
      41             : #ifndef _IDLC_ASTCONSTANT_HXX_
      42             : #include <idlc/astconstant.hxx>
      43             : #endif
      44             : #ifndef _IDLC_ASTARRAY_HXX_
      45             : #include <idlc/astarray.hxx>
      46             : #endif
      47             : #ifndef _IDLC_ASTBASETYPE_HXX_
      48             : #include <idlc/astbasetype.hxx>
      49             : #endif
      50             : #ifndef _IDLC_ASTTYPEDEF_HXX_
      51             : #include <idlc/asttypedef.hxx>
      52             : #endif
      53             : #ifndef _IDLC_ASTEXCEPTION_HXX_
      54             : #include <idlc/astexception.hxx>
      55             : #endif
      56             : #ifndef _IDLC_ASTMEMBER_HXX_
      57             : #include <idlc/astmember.hxx>
      58             : #endif
      59             : #ifndef _IDLC_ASTENUM_HXX_
      60             : #include <idlc/astenum.hxx>
      61             : #endif
      62             : #ifndef _IDLC_ASTSEQUENCE_HXX_
      63             : #include <idlc/astsequence.hxx>
      64             : #endif
      65             : #ifndef _IDLC_ASTATTRIBUTE_HXX_
      66             : #include <idlc/astattribute.hxx>
      67             : #endif
      68             : #ifndef _IDLC_ASTOPERATION_HXX_
      69             : #include <idlc/astoperation.hxx>
      70             : #endif
      71             : #ifndef _IDLC_ASTPARAMETER_HXX_
      72             : #include <idlc/astparameter.hxx>
      73             : #endif
      74             : #ifndef _IDLC_ASTINTERFACEMEMBER_HXX_
      75             : #include <idlc/astinterfacemember.hxx>
      76             : #endif
      77             : #ifndef _IDLC_ASTSERVICEMEMBER_HXX_
      78             : #include <idlc/astservicemember.hxx>
      79             : #endif
      80             : #ifndef _IDLC_ASTOBSERVES_HXX_
      81             : #include <idlc/astobserves.hxx>
      82             : #endif
      83             : #ifndef _IDLC_ASTNEEDS_HXX_
      84             : #include <idlc/astneeds.hxx>
      85             : #endif
      86             : #ifndef _IDLC_ASTUNION_HXX_
      87             : #include <idlc/astunion.hxx>
      88             : #endif
      89             : #include "idlc/aststructinstance.hxx"
      90             : 
      91             : #include "attributeexceptions.hxx"
      92             : 
      93             : #include "rtl/strbuf.hxx"
      94             : 
      95             : #include <algorithm>
      96             : #include <vector>
      97             : 
      98             : 
      99             : #define YYDEBUG 1
     100             : #if !(defined MACOSX && defined PPC)
     101             : #define YYERROR_VERBOSE 1
     102             : #endif
     103             : 
     104             : using ::rtl::OUString;
     105             : using ::rtl::OString;
     106             : using ::rtl::OStringToOUString;
     107             : using ::rtl::OStringBuffer;
     108             : 
     109             : extern int yylex(void);
     110             : void yyerror(char const *);
     111             : 
     112     1307806 : void checkIdentifier(::rtl::OString* id)
     113             : {
     114             :     static short check = 0;
     115     1307806 :     if (check == 0) {
     116         138 :         if (idlc()->getOptions()->isValid("-cid"))
     117           0 :             check = 1;
     118             :         else
     119         138 :             check = 2;
     120             :     }
     121             : 
     122     1307806 :     if ( id->indexOf('_') >= 0 )
     123       37385 :         if ( (id->pData->buffer[0] >= 97 && id->pData->buffer[0] <= 122)
     124       18582 :              || id->pData->buffer[0] == '_') {
     125         368 :             if (check == 1) {
     126           0 :                 ::rtl::OStringBuffer msg(25 + id->getLength());
     127           0 :                 msg.append("mismatched identifier '");
     128           0 :                 msg.append(*id);
     129           0 :                 msg.append("'");
     130             :                 idlc()->error()->syntaxError(idlc()->getParseState(),
     131           0 :                                          idlc()->getLineNumber(),
     132           0 :                                          msg.getStr());
     133             :             }
     134             :             else
     135         368 :                 idlc()->error()->warning0(WIDL_WRONG_NAMING_CONV, id->getStr());
     136             :         }
     137     1307806 : }
     138             : 
     139           0 : void reportDoubleMemberDeclarations(
     140             :     AstInterface::DoubleMemberDeclarations const & doubleMembers)
     141             : {
     142           0 :     for (AstInterface::DoubleMemberDeclarations::const_iterator i(
     143           0 :              doubleMembers.begin());
     144           0 :          i != doubleMembers.end(); ++i)
     145             :     {
     146           0 :         idlc()->error()->error2(EIDL_DOUBLE_MEMBER, i->first, i->second);
     147             :     }
     148           0 : }
     149             : 
     150        2094 : void addInheritedInterface(
     151             :     AstInterface * ifc, rtl::OString const & name, bool optional,
     152             :     rtl::OUString const & documentation)
     153             : {
     154        2094 :     AstDeclaration * decl = ifc->lookupByName(name);
     155        2094 :     AstDeclaration const * resolved = resolveTypedefs(decl);
     156        2094 :     if (resolved != 0 && resolved->getNodeType() == NT_interface) {
     157        2094 :         if (idlc()->error()->checkPublished(decl)) {
     158        2094 :             if (!static_cast< AstInterface const * >(resolved)->isDefined()) {
     159             :                 idlc()->error()->inheritanceError(
     160           0 :                     NT_interface, &ifc->getScopedName(), decl);
     161             :             } else {
     162             :                 AstInterface::DoubleDeclarations doubleDecls(
     163             :                     ifc->checkInheritedInterfaceClashes(
     164             :                         static_cast< AstInterface const * >(resolved),
     165        2094 :                         optional));
     166        4188 :                 if (doubleDecls.interfaces.empty()
     167        2094 :                     && doubleDecls.members.empty())
     168             :                 {
     169             :                     ifc->addInheritedInterface(
     170             :                         static_cast< AstType * >(decl), optional,
     171        2094 :                         documentation);
     172             :                 } else {
     173           0 :                     for (AstInterface::DoubleInterfaceDeclarations::iterator i(
     174           0 :                              doubleDecls.interfaces.begin());
     175           0 :                          i != doubleDecls.interfaces.end(); ++i)
     176             :                     {
     177             :                         idlc()->error()->error1(
     178           0 :                             EIDL_DOUBLE_INHERITANCE, *i);
     179             :                     }
     180           0 :                     reportDoubleMemberDeclarations(doubleDecls.members);
     181        2094 :                 }
     182             :             }
     183             :         }
     184             :     } else {
     185             :         idlc()->error()->lookupError(
     186           0 :             EIDL_INTERFACEMEMBER_LOOKUP, name, scopeAsDecl(ifc));
     187             :     }
     188        2094 : }
     189             : 
     190       77296 : AstDeclaration const * createNamedType(
     191             :     rtl::OString const * scopedName, DeclList const * typeArgs)
     192             : {
     193             :     AstDeclaration * decl = idlc()->scopes()->topNonNull()->lookupByName(
     194       77296 :         *scopedName);
     195       77296 :     AstDeclaration const * resolved = resolveTypedefs(decl);
     196       77296 :     if (decl == 0) {
     197           0 :         idlc()->error()->lookupError(*scopedName);
     198       77296 :     } else if (!idlc()->error()->checkPublished(decl)) {
     199           0 :         decl = 0;
     200       77296 :     } else if (resolved->getNodeType() == NT_struct) {
     201       20790 :         if (static_cast< AstStruct const * >(resolved)->getTypeParameterCount()
     202             :             != (typeArgs == 0 ? 0 : typeArgs->size()))
     203             :         {
     204           0 :             idlc()->error()->error0(EIDL_WRONG_NUMBER_OF_TYPE_ARGUMENTS);
     205           0 :             decl = 0;
     206       20790 :         } else if (typeArgs != 0) {
     207         162 :             AstScope * global = idlc()->scopes()->bottom();
     208             :             AstDeclaration * inst = new AstStructInstance(
     209         162 :                 static_cast< AstType * >(decl), typeArgs, global);
     210         162 :             decl = global->addDeclaration(inst);
     211         162 :             if (decl != inst) {
     212          64 :                 delete inst;
     213             :             }
     214             :         }
     215       56506 :     } else if (decl->isType()) {
     216       56506 :         if (typeArgs != 0) {
     217           0 :             idlc()->error()->error0(EIDL_WRONG_NUMBER_OF_TYPE_ARGUMENTS);
     218           0 :             decl = 0;
     219             :         }
     220             :     } else {
     221           0 :         idlc()->error()->noTypeError(decl);
     222           0 :         decl = 0;
     223             :     }
     224       77296 :     delete scopedName;
     225       77296 :     delete typeArgs;
     226       77296 :     return decl;
     227             : }
     228             : 
     229        8221 : bool includes(AstDeclaration const * type1, AstDeclaration const * type2) {
     230             :     OSL_ASSERT(type2 != 0);
     231        8221 :     if (type1 != 0) {
     232        8221 :         if (type1->getNodeType() == NT_instantiated_struct) {
     233             :             AstStructInstance const * inst
     234           6 :                 = static_cast< AstStructInstance const * >(type1);
     235           6 :             if (inst->getTypeTemplate() == type2) {
     236           0 :                 return true;
     237             :             }
     238          42 :             for (DeclList::const_iterator i(inst->getTypeArgumentsBegin());
     239          28 :                  i != inst->getTypeArgumentsEnd(); ++i)
     240             :             {
     241           8 :                 if (includes(*i, type2)) {
     242           0 :                     return true;
     243             :                 }
     244             :             }
     245        8215 :         } else if (type1 == type2) {
     246           0 :             return true;
     247             :         }
     248             :     }
     249        8221 :     return false;
     250             : }
     251             : 
     252             : // Suppress any warnings from generated code:
     253             : #if defined __SUNPRO_CC
     254             : #pragma disable_warn
     255             : #elif defined _MSC_VER
     256             : #pragma warning(push, 1)
     257             : #pragma warning(disable: 4273 4701 4702 4706)
     258             : #endif
     259             : %}
     260             : /*
     261             :  * Declare the type of values in the grammar
     262             :  */
     263             : %union {
     264             :         ExprType                                etval;     /* Expression type */
     265             :         AstDeclaration*         dclval;    /* Declaration */
     266             :     AstDeclaration const * cdclval;
     267             :     DeclList * dclsval;
     268             :         AstExpression*          exval;          /* expression value */
     269             :         ExprList*                               exlval; /* expression list value */
     270             :         FeDeclarator*                   fdval;          /* declarator value */
     271             :         FeDeclList*                     dlval;          /* declarator list value */
     272             :         FeInheritanceHeader*    ihval;          /* inheritance header value */
     273             :         ::rtl::OString*         sval;           /* OString value */
     274             :     std::vector< rtl::OString > * svals;
     275             :         sal_Char*                       strval; /* sal_Char* value */
     276             :         bool                            bval;           /* sal_Boolean* value */
     277             :         sal_Int64                               ival;           /* sal_Int64 value */
     278             :     sal_uInt64 uval; /* sal_uInt64 value */
     279             :         sal_uInt32                      ulval;          /* sal_uInt32 value */
     280             :         double                                  dval;           /* double value */
     281             :         float                                   fval;           /* float value */
     282             :         StringList*                     slval;          /* StringList value     */
     283             :         LabelList*                      llval;          /* LabelList value      */
     284             :         AstUnionLabel*          lbval;          /* union label value */
     285             :         AstMember*                      mval;           /* member value */
     286             :     AttributeExceptions::Part attexcpval;
     287             :     AttributeExceptions attexcval;
     288             : }
     289             : 
     290             : /*
     291             :  * Token types: These are returned by the lexer
     292             :  */
     293             : 
     294             : %token <sval>             IDL_IDENTIFIER
     295             : %token                  IDL_ATTRIBUTE
     296             : %token                          IDL_BOUND
     297             : %token                  IDL_CASE
     298             : %token                  IDL_CONST
     299             : %token                  IDL_CONSTANTS
     300             : %token                          IDL_CONSTRAINED
     301             : %token                  IDL_DEFAULT
     302             : %token                  IDL_ENUM
     303             : %token                  IDL_EXCEPTION
     304             : %token                  IDL_INTERFACE
     305             : %token                  IDL_MAYBEAMBIGUOUS
     306             : %token                  IDL_MAYBEDEFAULT
     307             : %token                  IDL_MAYBEVOID
     308             : %token                  IDL_MODULE
     309             : %token                  IDL_NEEDS
     310             : %token                  IDL_OBSERVES
     311             : %token                  IDL_OPTIONAL
     312             : %token                  IDL_PROPERTY
     313             : %token                  IDL_RAISES
     314             : %token                  IDL_READONLY
     315             : %token                  IDL_REMOVEABLE
     316             : %token                  IDL_SERVICE
     317             : %token                  IDL_SEQUENCE
     318             : %token                  IDL_SINGLETON
     319             : %token                  IDL_STRUCT
     320             : %token                  IDL_SWITCH
     321             : %token                  IDL_TYPEDEF
     322             : %token                          IDL_TRANSIENT
     323             : %token                  IDL_UNION
     324             : 
     325             : %token                  IDL_ANY
     326             : %token                  IDL_CHAR
     327             : %token                  IDL_BOOLEAN
     328             : %token                  IDL_BYTE
     329             : %token                  IDL_DOUBLE
     330             : %token                  IDL_FLOAT
     331             : %token                  IDL_HYPER
     332             : %token                  IDL_LONG
     333             : %token                  IDL_SHORT
     334             : %token                  IDL_VOID
     335             : %token                  IDL_STRING
     336             : %token                  IDL_TYPE
     337             : %token                  IDL_UNSIGNED
     338             : 
     339             : %token                  IDL_TRUE
     340             : %token                  IDL_FALSE
     341             : 
     342             : %token                  IDL_IN
     343             : %token                  IDL_OUT
     344             : %token                  IDL_INOUT
     345             : 
     346             : %token IDL_GET
     347             : %token IDL_SET
     348             : 
     349             : %token IDL_PUBLISHED
     350             : 
     351             : %token IDL_ELLIPSIS
     352             : 
     353             : %token <strval>   IDL_LEFTSHIFT
     354             : %token <strval>   IDL_RIGHTSHIFT
     355             : %token <strval>   IDL_SCOPESEPARATOR
     356             : 
     357             : %token <ival>             IDL_INTEGER_LITERAL
     358             : %token <uval> IDL_INTEGER_ULITERAL
     359             : %token <dval>             IDL_FLOATING_PT_LITERAL
     360             : 
     361             : /*
     362             :  * These are production names:
     363             :  */
     364             : %type <dclval>    type_dcl const_dcl
     365             : %type <dclval>    array_declarator
     366             : %type <dclval>  exception_name
     367             : %type <cdclval> array_type constructed_type_spec enum_type op_type_spec
     368             : %type <cdclval> sequence_type_spec simple_type_spec struct_type switch_type_spec
     369             : %type <cdclval> template_type_spec type_spec union_type
     370             : %type <cdclval> fundamental_type type_arg type_or_parameter
     371             : %type <dclsval> opt_raises raises exception_list
     372             : %type <attexcpval> opt_attribute_get_raises attribute_get_raises
     373             : %type <attexcpval> opt_attribute_set_raises attribute_set_raises
     374             : %type <dclsval> opt_type_args type_args
     375             : 
     376             : %type <sval>    identifier
     377             : %type <sval>      interface_decl 
     378             : %type <sval>      scoped_name inheritance_spec
     379             : %type <slval>     scoped_names at_least_one_scoped_name
     380             : 
     381             : %type <etval>     const_type integer_type char_type boolean_type
     382             : %type <etval>     floating_pt_type any_type signed_int string_type
     383             : %type <etval>     unsigned_int base_type_spec byte_type type_type 
     384             : 
     385             : %type <exval>     expression const_expr or_expr xor_expr and_expr
     386             : %type <exval>     add_expr mult_expr unary_expr primary_expr shift_expr
     387             : %type <exval>     literal positive_int_expr array_dim
     388             : 
     389             : %type <exlval>    at_least_one_array_dim array_dims
     390             : 
     391             : %type <fdval>     declarator simple_declarator complex_declarator
     392             : %type <dlval>     declarators at_least_one_declarator
     393             : 
     394             : %type <ihval>     exception_header structure_header interfaceheader
     395             : 
     396             : %type <ulval>     flag_header opt_attrflags opt_attrflag
     397             : %type <ulval>     direction service_interface_header service_service_header
     398             : 
     399             : %type <llval>     case_labels at_least_one_case_label
     400             : %type <lbval>     case_label
     401             : %type <mval>      element_spec
     402             : 
     403             : %type <bval>    optional_inherited_interface opt_rest opt_service_body
     404             : 
     405             : %type <attexcval> opt_attribute_block attribute_block_rest opt_attribute_raises
     406             : 
     407             : %type <svals> opt_type_params type_params
     408             : 
     409             : %%
     410             : /*
     411             :  * Grammar start here
     412             :  */
     413             : start : definitions;
     414             : 
     415             : definitions : 
     416             :         definition definitions
     417             :         | /* EMPTY */
     418             :         ;
     419             : 
     420             : definition : 
     421             :     opt_published publishable_definition
     422             :         | module_dcl
     423             :         {
     424      242530 :                 idlc()->setParseState(PS_ModuleDeclSeen);
     425             :         }
     426      242530 :         ';'
     427             :         {
     428      242530 :                 idlc()->setParseState(PS_NoState);
     429             :         }
     430      242530 :         | error ';' 
     431             :         {
     432           0 :                 yyerror("definitions");
     433           0 :                 yyerrok;
     434             :         }
     435           0 :         ;
     436             : 
     437             : opt_published:
     438       61358 :     IDL_PUBLISHED { idlc()->setPublished(true); }
     439       61358 :     | /* empty */ { idlc()->setPublished(false); }
     440        8261 :     ;
     441             : 
     442             : publishable_definition:
     443             :         type_dcl 
     444             :         {
     445       16724 :                 idlc()->setParseState(PS_TypeDeclSeen);
     446             :         }
     447       16724 :         ';'
     448             :         {
     449       16724 :                 idlc()->setParseState(PS_NoState);
     450             :         }
     451       16724 :         | const_dcl
     452             :         {
     453           0 :                 idlc()->setParseState(PS_ConstantDeclSeen);
     454             :         }
     455           0 :         ';'
     456             :         {
     457           0 :                 idlc()->setParseState(PS_NoState);
     458             :         }
     459           0 :         | exception_dcl
     460             :         {
     461       12903 :                 idlc()->setParseState(PS_ExceptionDeclSeen);
     462             :         }
     463       12903 :         ';'
     464             :         {
     465       12903 :                 idlc()->setParseState(PS_NoState);
     466             :         }
     467       12903 :         | interface
     468             :         {
     469       35160 :                 idlc()->setParseState(PS_InterfaceDeclSeen);
     470             :         }
     471       35160 :         ';'
     472             :         {
     473       35160 :                 idlc()->setParseState(PS_NoState);
     474             :         }
     475       35160 :         | service_dcl
     476             :         {
     477        3199 :                 idlc()->setParseState(PS_ServiceDeclSeen);
     478             :         }
     479        3199 :         ';'
     480             :         {
     481        3199 :                 idlc()->setParseState(PS_NoState);
     482             :         }
     483        3199 :         | singleton_dcl
     484             :         {
     485         164 :                 idlc()->setParseState(PS_SingletonDeclSeen);
     486             :         }
     487         164 :         ';'
     488             :         {
     489         164 :                 idlc()->setParseState(PS_NoState);
     490             :         }
     491         164 :         | constants_dcl
     492             :         {
     493        1469 :                 idlc()->setParseState(PS_ConstantsDeclSeen);
     494             :         }
     495        1469 :         ';'
     496             :         {
     497        1469 :                 idlc()->setParseState(PS_NoState);
     498             :         }
     499        1469 :     ;
     500             : 
     501             : module_dcl :
     502             :         IDL_MODULE
     503             :         {
     504      242530 :                 idlc()->setParseState(PS_ModuleSeen);
     505      242530 :         idlc()->setPublished(false);
     506             :         }
     507      242530 :         identifier
     508             :         {
     509      242530 :         idlc()->setParseState(PS_ModuleIDSeen);
     510      242530 :         checkIdentifier($3);
     511             : 
     512      242530 :         AstScope*               pScope = idlc()->scopes()->topNonNull();
     513      242530 :         AstModule*              pModule = NULL;
     514      242530 :         AstDeclaration* pExists = NULL;
     515             : 
     516      242530 :         if ( pScope )
     517             :         {
     518      242530 :                 pModule = new AstModule(*$3, pScope);
     519      242530 :                         if( (pExists = pScope->lookupForAdd(pModule)) )
     520             :                         {
     521      209036 :                                 pExists->setInMainfile(idlc()->isInMainFile());
     522      209036 :                                 pExists->setFileName(pModule->getFileName());
     523      209036 :                 if (pExists->isPredefined())
     524             :                 {
     525         487 :                     pExists->setPredefined(false);
     526         974 :                     if (pExists->getDocumentation().getLength() == 0 &&
     527         487 :                         pModule->getDocumentation().getLength() > 0)
     528             :                     {
     529           0 :                         pExists->setDocumentation(pModule->getDocumentation());
     530             :                     }
     531             :                 }
     532      209036 :                                 delete(pModule);
     533      209036 :                                 pModule = (AstModule*)pExists;
     534             :                         } else
     535             :                         {
     536       33494 :                                 pScope->addDeclaration(pModule);
     537             :                         }
     538      242530 :                         idlc()->scopes()->push(pModule);
     539             :         }
     540      242530 :         delete $3;
     541             :     }
     542      242530 :     '{'
     543             :     {
     544      242530 :         idlc()->setParseState(PS_ModuleSqSeen);
     545             :     }
     546      242530 :         definitions
     547             :         {
     548      242530 :                 idlc()->setParseState(PS_ModuleBodySeen);
     549             :         }
     550      242530 :         '}'
     551             :         {
     552      242530 :                 idlc()->setParseState(PS_ModuleQsSeen);
     553             :                 /*
     554             :                  * Finished with this module - pop it from the scope stack
     555             :                  */
     556      242530 :                 idlc()->scopes()->pop();
     557             :         }
     558      242530 :         ;
     559             : 
     560             : interface :
     561             :         interface_dcl
     562             :         | forward_dcl
     563             :         ; 
     564             : 
     565             : interface_decl :
     566             :         IDL_INTERFACE
     567             :         {
     568       35160 :                 idlc()->setParseState(PS_InterfaceSeen);
     569             :         }
     570       35160 :         identifier
     571             :         {
     572       35160 :                 idlc()->setParseState(PS_InterfaceIDSeen);
     573       35160 :        checkIdentifier($3);
     574       35160 :                 $$ = $3;
     575             :         }
     576       35160 :         ;
     577             : 
     578             : forward_dcl :
     579             :         interface_decl
     580             :         {
     581        9009 :                 idlc()->setParseState(PS_ForwardDeclSeen);
     582             : 
     583        9009 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
     584        9009 :                 AstInterface*   pForward = NULL;
     585        9009 :                 AstDeclaration* pDecl = NULL;
     586             : 
     587             :         /*
     588             :                  * Make a new forward interface node and add it to its enclosing scope
     589             :                  */
     590        9009 :                 if ( pScope && $1 ) 
     591             :                 {
     592        9009 :                         pForward = new AstInterface(*$1, NULL, pScope);
     593             :                         
     594        9009 :                         pDecl = pScope->lookupByName(pForward->getScopedName());
     595        9009 :                         if ( pDecl ) 
     596             :                         {
     597        1954 :                                 if ( (pDecl != pForward) && 
     598         977 :                                          (pDecl->getNodeType() == NT_interface) )
     599             :                                 {
     600         977 :                                         delete pForward;
     601             :                                 } else
     602             :                                 {
     603           0 :                                         idlc()->error()->error2(EIDL_REDEF_SCOPE, scopeAsDecl(pScope), pDecl);
     604             :                                 }
     605             :                         } else
     606             :                         {
     607             :                                 /*
     608             :                                  * Add the interface to its definition scope
     609             :                                  */
     610        8032 :                                 pScope->addDeclaration(pForward);
     611             :                         }
     612             :                 }
     613        9009 :                 delete $1;
     614             :         }
     615        9009 :         ;
     616             : 
     617             : interface_dcl :
     618             :         interfaceheader
     619             :         {
     620       26151 :                 idlc()->setParseState(PS_InterfaceHeadSeen);
     621             : 
     622       26151 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
     623       26151 :                 AstInterface*   pInterface = NULL;
     624       26151 :                 AstInterface*   pForward = NULL;
     625       26151 :                 AstDeclaration* pDecl = NULL;
     626             : 
     627             :         /*
     628             :                  * Make a new interface node and add it to its enclosing scope
     629             :                  */
     630       26151 :                 if ( pScope && $1 ) 
     631             :                 {
     632             :                         pInterface = new AstInterface(
     633       26151 :                 *$1->getName(),
     634       26151 :                 static_cast< AstInterface * >($1->getInherits()), pScope);
     635       52302 :                         if ( pInterface &&
     636       26151 :                                 (pDecl = pScope->lookupByName(pInterface->getScopedName())) ) 
     637             :                         {
     638             :                                 /*
     639             :                                  * See if we're defining a forward declared interface.
     640             :                                  */
     641         976 :                                 if (pDecl->getNodeType() == NT_interface) 
     642             :                                 {
     643         976 :                                         pForward = (AstInterface*)pDecl;
     644         976 :                                         if ( !pForward->isDefined() ) 
     645             :                                         {
     646             :                                                 /*
     647             :                                                  * Check if redefining in same scope
     648             :                                                  */
     649         880 :                                                 if ( pForward->getScope() != pScope ) 
     650             :                                                 {
     651           0 :                                                         if ( pForward->getScopedName() != pInterface->getScopedName() )
     652             :                                                         {
     653             :                                                                 idlc()->error()->error3(EIDL_SCOPE_CONFLICT,
     654           0 :                                                                                  pInterface, pForward, scopeAsDecl(pScope));
     655             :                                                         }
     656             :                                                 }
     657         972 :                         else if ( !pInterface->isPublished()
     658          92 :                                   && pForward->isPublished() )
     659             :                         {
     660           0 :                             idlc()->error()->error0(EIDL_PUBLISHED_FORWARD);
     661             :                         }
     662             :                                                 /*
     663             :                                                  * All OK, set full definition
     664             :                                                  */
     665             :                                                 else 
     666             :                                                 {
     667         880 :                             pForward->forwardDefined(*pInterface);
     668         880 :                                                         delete pInterface;
     669         880 :                                                         pInterface = pForward;
     670             :                                                 }
     671             :                                         } else {
     672             :                         // special handling for XInterface because it is predefined
     673         192 :                         if ( pForward->isPredefined() &&
     674          96 :                              pForward->getScopedName() == "com::sun::star::uno::XInterface")
     675             :                         {
     676             :                             /* replace the predefined XInterface */
     677          96 :                             *pForward = *pInterface;
     678          96 :                             delete pInterface;
     679          96 :                             pInterface = pForward;
     680             :                         }
     681             :                         
     682             :                     }
     683             :                                 }
     684             :                         } else
     685             :                         {
     686             :                                 /*
     687             :                                  * Add the interface to its definition scope
     688             :                                  */
     689       25175 :                                 pScope->addDeclaration(pInterface);
     690             :                         }
     691             :                 }
     692             :                 /*
     693             :                  * Push it on the scope stack
     694             :                  */
     695       26151 :                 idlc()->scopes()->push(pInterface);
     696       26151 :                 delete($1);
     697             :         }
     698       26151 :         '{'
     699             :         {
     700       26151 :                 idlc()->setParseState(PS_InterfaceSqSeen);
     701             :         }
     702       26151 :         exports
     703             :         {
     704             :         AstInterface * ifc = static_cast< AstInterface * >(
     705       26151 :             idlc()->scopes()->topNonNull());
     706       30079 :         if (!ifc->hasMandatoryInheritedInterfaces()
     707        3928 :             && ifc->getScopedName() != "com::sun::star::uno::XInterface")
     708             :         {
     709             :             addInheritedInterface(
     710             :                 ifc, rtl::OString("::com::sun::star::uno::XInterface"), false,
     711         468 :                 rtl::OUString());
     712             :         }
     713       26151 :         ifc->setDefined();
     714       26151 :                 idlc()->setParseState(PS_InterfaceBodySeen);
     715             :         }
     716       26151 :         '}'
     717             :         {
     718       26151 :                 idlc()->setParseState(PS_InterfaceQsSeen);
     719             :                 /*
     720             :                  * Done with this interface - pop it off the scopes stack
     721             :                  */
     722       26151 :                 idlc()->scopes()->pop();
     723             :         }
     724       26151 :         | error '}' 
     725             :         {
     726           0 :                 yyerror("interface definition");
     727           0 :                 yyerrok;
     728             :         }
     729           0 :         ;
     730             : 
     731             : interfaceheader :
     732             :         interface_decl inheritance_spec
     733             :         {
     734       26151 :                 idlc()->setParseState(PS_InheritSpecSeen);
     735             : 
     736       26151 :                 $$ = new FeInheritanceHeader(NT_interface, $1, $2, 0);
     737       26151 :                 delete $2;
     738             :         }
     739       26151 :         ;   
     740             : 
     741             : inheritance_spec :
     742             :         ':'
     743             :         {
     744       34440 :                 idlc()->setParseState(PS_InheritColonSeen);
     745             :         }
     746       34440 :         scoped_name
     747             :         {
     748       34440 :         $$ = $3;
     749             :         }
     750       34440 :         | /* EMPTY */
     751             :         {
     752       16019 :                 $$ = NULL;
     753             :         }
     754       16019 :         ;
     755             : 
     756             : exports :
     757             :         exports export
     758             :         | /* EMPTY */
     759             :         ;
     760             : 
     761             : export :
     762             :     attribute
     763             :         {
     764        4492 :                 idlc()->setParseState(PS_AttributeDeclSeen);
     765             :         }
     766        4492 :         ';'
     767             :         {
     768        4492 :                 idlc()->setParseState(PS_NoState);
     769             :         }
     770        4492 :         | operation
     771             :         {
     772      102790 :                 idlc()->setParseState(PS_OperationDeclSeen);
     773             :         }
     774      102790 :         ';'
     775             :         {
     776      102790 :                 idlc()->setParseState(PS_NoState);
     777             :         }
     778      102790 :     | interface_inheritance_decl
     779             :     {
     780        1626 :                 idlc()->setParseState(PS_InterfaceInheritanceDeclSeen);
     781             :     }
     782        1626 :     ';'
     783             :         {
     784        1626 :                 idlc()->setParseState(PS_NoState);
     785             :         }
     786        1626 :     ;
     787             : 
     788             : attribute :
     789             :         flag_header
     790             :         simple_type_spec
     791             :         {
     792        4492 :                 idlc()->setParseState(PS_AttrTypeSeen);
     793             :         }
     794        4492 :     simple_declarator
     795             :         {
     796        4492 :                 idlc()->setParseState(PS_AttrCompleted);
     797        4492 :         if (($1 & ~(AF_BOUND | AF_READONLY)) != AF_ATTRIBUTE) {
     798           0 :             idlc()->error()->flagError(EIDL_BAD_ATTRIBUTE_FLAGS, $1);
     799             :         }
     800             :         AstInterface * scope = static_cast< AstInterface * >(
     801        4492 :             idlc()->scopes()->top());
     802             :         AstAttribute * attr = new AstAttribute(
     803        4492 :             $1, $4->compose($2), $4->getName(), scope);
     804        4492 :         delete $4;
     805             :         AstInterface::DoubleMemberDeclarations doubleMembers(
     806        4492 :             scope->checkMemberClashes(attr));
     807        4492 :         if (doubleMembers.empty()) {
     808        4492 :             scope->addMember(attr);
     809             :         } else {
     810           0 :             reportDoubleMemberDeclarations(doubleMembers);
     811             :         }
     812        4492 :         idlc()->scopes()->push(attr);
     813             :     }
     814        4492 :     opt_attribute_block
     815             :     {
     816        4492 :         static_cast< AstAttribute * >(idlc()->scopes()->top())->setExceptions(
     817             :             $6.get.documentation, $6.get.exceptions, $6.set.documentation,
     818        8984 :             $6.set.exceptions);
     819        4492 :         delete $6.get.documentation;
     820        4492 :         delete $6.get.exceptions;
     821        4492 :         delete $6.set.documentation;
     822        4492 :         delete $6.set.exceptions;
     823        4492 :         idlc()->scopes()->pop();
     824             :     }
     825        4492 :         ;
     826             : 
     827             : flag_header :
     828             :         '[' opt_attrflags ']'
     829             :         {
     830       23661 :                 idlc()->setParseState(PS_FlagHeaderSeen);
     831       23661 :                 $$ = $2;
     832             :         }
     833       23661 :         ;
     834             : 
     835             : opt_attrflags :
     836             :         opt_attrflags ',' opt_attrflag 
     837             :         {
     838       12251 :                 if ( ($1 & $3) == $3 )
     839           0 :                         idlc()->error()->flagError(EIDL_DEFINED_ATTRIBUTEFLAG, $3);
     840             :  
     841       12251 :                 $$ = $1 | $3;
     842             :         }
     843       12251 :         | opt_attrflag
     844             :         {
     845       23661 :                 $$ = $1;
     846             :         }
     847       23661 :         ;
     848             : 
     849             : opt_attrflag :
     850             :         IDL_ATTRIBUTE
     851             :         {
     852        4492 :                 idlc()->setParseState(PS_AttrSeen);
     853        4492 :                 $$ = AF_ATTRIBUTE;
     854             :         }
     855        4492 :         | IDL_PROPERTY
     856             :         {
     857       17531 :                 idlc()->setParseState(PS_PropertySeen);
     858       17531 :                 $$ = AF_PROPERTY;
     859             :         }
     860       17531 :         | IDL_READONLY
     861             :         {
     862        1960 :                 idlc()->setParseState(PS_ReadOnlySeen);
     863        1960 :                 $$ = AF_READONLY;
     864             :         }
     865        1960 :         | IDL_OPTIONAL
     866             :         {
     867       10000 :                 idlc()->setParseState(PS_OptionalSeen);
     868       10000 :                 $$ = AF_OPTIONAL;
     869             :         }
     870       10000 :         | IDL_MAYBEVOID
     871             :         {
     872         394 :                 idlc()->setParseState(PS_MayBeVoidSeen);
     873         394 :                 $$ = AF_MAYBEVOID;
     874             :         }
     875         394 :         | IDL_BOUND
     876             :         {
     877        1516 :                 idlc()->setParseState(PS_BoundSeen);
     878        1516 :                 $$ = AF_BOUND;
     879             :         }
     880        1516 :         | IDL_CONSTRAINED
     881             :         {
     882           0 :                 idlc()->setParseState(PS_ConstrainedSeen);
     883           0 :                 $$ = AF_CONSTRAINED;
     884             :         }
     885           0 :         | IDL_TRANSIENT
     886             :         {
     887          16 :                 idlc()->setParseState(PS_TransientSeen);
     888          16 :                 $$ = AF_TRANSIENT;
     889             :         }
     890          16 :         | IDL_MAYBEAMBIGUOUS
     891             :         {
     892           0 :                 idlc()->setParseState(PS_MayBeAmbigiousSeen);
     893           0 :                 $$ = AF_MAYBEAMBIGUOUS;
     894             :         }
     895           0 :         | IDL_MAYBEDEFAULT
     896             :         {
     897           3 :                 idlc()->setParseState(PS_MayBeDefaultSeen);
     898           3 :                 $$ = AF_MAYBEDEFAULT;
     899             :         }
     900           3 :         | IDL_REMOVEABLE
     901             :         {
     902           0 :                 idlc()->setParseState(PS_RemoveableSeen);
     903           0 :                 $$ = AF_REMOVEABLE;
     904             :         }
     905           0 :         | error ']' 
     906             :         {
     907           0 :        yyerror("unknown property|attribute flag");
     908           0 :                 yyerrok;
     909             :         }
     910           0 :         ;
     911             : 
     912             : opt_attribute_block:
     913        1389 :     '{' attribute_block_rest { $$ = $2; }
     914        1389 :     | /* empty */
     915             :     {
     916        3103 :         $$.get.documentation = 0;
     917        3103 :         $$.get.exceptions = 0;
     918        3103 :         $$.set.documentation = 0;
     919        3103 :         $$.set.exceptions = 0;
     920             :     }
     921        3103 :     ;
     922             : 
     923             : attribute_block_rest:
     924             :     opt_attribute_raises '}'
     925             :     | error '}'
     926             :     {
     927           0 :         yyerror("bad attribute raises block");
     928           0 :         yyerrok;
     929           0 :         $$.get.documentation = 0;
     930           0 :         $$.get.exceptions = 0;
     931           0 :         $$.set.documentation = 0;
     932           0 :         $$.set.exceptions = 0;
     933             :     }
     934           0 :     ;
     935             : 
     936             : opt_attribute_raises:
     937             :     attribute_get_raises
     938             :     opt_attribute_set_raises
     939             :     {
     940          36 :         $$.get = $1;
     941          36 :         $$.set = $2;
     942             :     }
     943          36 :     | attribute_set_raises
     944             :     opt_attribute_get_raises
     945             :     {
     946        1353 :         $$.get = $2;
     947        1353 :         $$.set = $1;
     948             :     }
     949        1353 :     | /* empty */
     950             :     {
     951           0 :         $$.get.documentation = 0;
     952           0 :         $$.get.exceptions = 0;
     953           0 :         $$.set.documentation = 0;
     954           0 :         $$.set.exceptions = 0;
     955             :     }
     956           0 :     ;
     957             : 
     958             : opt_attribute_get_raises:
     959             :     attribute_get_raises
     960         215 :     | /* empty */ { $$.documentation = 0; $$.exceptions = 0; }
     961         215 :     ;
     962             : 
     963             : attribute_get_raises:
     964             :     IDL_GET raises ';'
     965             :     {
     966             :         $$.documentation = new rtl::OUString(
     967             :             rtl::OStringToOUString(
     968        1174 :                 idlc()->getDocumentation(), RTL_TEXTENCODING_UTF8));
     969        1174 :         $$.exceptions = $2;
     970             :     }
     971        1174 :     ;
     972             : 
     973             : opt_attribute_set_raises:
     974             :     attribute_set_raises
     975          34 :     | /* empty */ { $$.documentation = 0; $$.exceptions = 0; }
     976          34 :     ;
     977             : 
     978             : attribute_set_raises:
     979             :     IDL_SET
     980             :     {
     981        2710 :         if (static_cast< AstAttribute * >(idlc()->scopes()->top())->
     982        1355 :             isReadonly())
     983             :         {
     984           0 :             idlc()->error()->error0(EIDL_READONLY_ATTRIBUTE_SET_EXCEPTIONS);
     985             :         }
     986             :     }
     987        1355 :     raises ';'
     988             :     {
     989             :         $$.documentation = new rtl::OUString(
     990             :             rtl::OStringToOUString(
     991        1355 :                 idlc()->getDocumentation(), RTL_TEXTENCODING_UTF8));
     992        1355 :         $$.exceptions = $3;
     993             :     }
     994        1355 :     ;
     995             : 
     996             : operation :
     997             :         op_type_spec
     998             :         {
     999      102790 :                 idlc()->setParseState(PS_OpTypeSeen);
    1000             :         }
    1001      102790 :         identifier
    1002             :         {
    1003      102790 :                 idlc()->setParseState(PS_OpIDSeen);
    1004      102790 :        checkIdentifier($3);
    1005             : 
    1006             :                 AstInterface * pScope = static_cast< AstInterface * >(
    1007      102790 :             idlc()->scopes()->top());
    1008      102790 :                 AstOperation*   pOp = NULL;
    1009             : 
    1010             :                 /*
    1011             :                  * Create a node representing an operation on an interface
    1012             :                  * and add it to its enclosing scope
    1013             :                  */
    1014      102790 :                 if ( pScope && $1 )
    1015             :                 {
    1016      102790 :                         AstType *pType = (AstType*)$1;
    1017      102790 :                         if ( !pType || (pType->getNodeType() == NT_exception) )
    1018             :                         {
    1019             :                                 // type ERROR 
    1020             :                         } else 
    1021             :                         {
    1022      102790 :                                 pOp = new AstOperation(pType, *$3, pScope);
    1023             : 
    1024             :                 AstInterface::DoubleMemberDeclarations doubleMembers(
    1025      102790 :                     pScope->checkMemberClashes(pOp));
    1026      102790 :                 if (doubleMembers.empty()) {
    1027      102790 :                     pScope->addMember(pOp);
    1028             :                 } else {
    1029           0 :                     reportDoubleMemberDeclarations(doubleMembers);
    1030      102790 :                 }
    1031             :                         }
    1032             :                 }
    1033      102790 :                 delete $3;
    1034             :                 /*
    1035             :                  * Push the operation scope onto the scopes stack
    1036             :                  */
    1037      102790 :                 idlc()->scopes()->push(pOp);
    1038             :         }
    1039      102790 :         '('
    1040             :         {
    1041      102790 :                 idlc()->setParseState(PS_OpSqSeen);
    1042             :         }
    1043      102790 :         parameters
    1044             :         {
    1045      102790 :                 idlc()->setParseState(PS_OpParsCompleted);
    1046             :         }
    1047      102790 :         ')'
    1048             :         {
    1049      102790 :                 idlc()->setParseState(PS_OpQsSeen);
    1050             :         }
    1051      102790 :         opt_raises
    1052             :         {
    1053      102790 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
    1054      102790 :                 AstOperation*   pOp = NULL;
    1055             :                 /*
    1056             :                  * Add exceptions and context to the operation
    1057             :                  */
    1058      102790 :                 if ( pScope && pScope->getScopeNodeType() == NT_operation)
    1059             :                 {
    1060      102790 :                         pOp = (AstOperation*)pScope;
    1061             : 
    1062      102790 :                         if ( pOp )
    1063      102790 :                                 pOp->setExceptions($11);
    1064             :                 }
    1065      102790 :         delete $11;
    1066             :                 /*
    1067             :                  * Done with this operation. Pop its scope from the scopes stack
    1068             :                  */
    1069      102790 :                 idlc()->scopes()->pop();
    1070             :         }
    1071      102790 :         ;
    1072             : 
    1073             : op_type_spec :
    1074             :         simple_type_spec
    1075             :         | IDL_VOID
    1076             :         {
    1077       43522 :                 $$ = idlc()->scopes()->bottom()->lookupPrimitiveType(ET_void);
    1078             :         }
    1079       43522 :         ;
    1080             : 
    1081             : parameters :
    1082             :         parameter
    1083             :         | parameters
    1084             :         ','
    1085             :         {
    1086       23996 :                 idlc()->setParseState(PS_OpParCommaSeen);
    1087             :         }
    1088       23996 :         parameter
    1089             :         | /* EMPTY */
    1090             :         | error ',' 
    1091             :         {
    1092           0 :                 yyerror("parameter definition");
    1093           0 :                 yyerrok;
    1094             :         }
    1095           0 :         ;
    1096             : 
    1097             : parameter :
    1098             :         '['
    1099             :         direction
    1100             :         ']'
    1101             :         {
    1102       81441 :                 idlc()->setParseState(PS_OpParDirSeen);
    1103             :         }
    1104       81441 :         simple_type_spec
    1105             :         {
    1106       81441 :                 idlc()->setParseState(PS_OpParTypeSeen);
    1107             :         }
    1108       81441 :     opt_rest
    1109             :         declarator
    1110             :         {
    1111       81441 :                 idlc()->setParseState(PS_OpParDeclSeen);
    1112             : 
    1113             :         AstOperation * pScope = static_cast< AstOperation * >(
    1114       81441 :             idlc()->scopes()->top());
    1115       81441 :                 AstParameter*   pParam = NULL;
    1116             : 
    1117             :                 /*
    1118             :                  * Create a node representing an argument to an operation
    1119             :                  * Add it to the enclosing scope (the operation scope)
    1120             :                  */
    1121       81441 :                 if ( pScope && $5 && $8 )
    1122             :                 {
    1123       81441 :             AstType const * pType = $8->compose($5);
    1124       81441 :                         if ( pType )
    1125             :                         {
    1126       81441 :                 if (pScope->isConstructor() && $2 != DIR_IN) {
    1127           0 :                     idlc()->error()->error0(EIDL_CONSTRUCTOR_PARAMETER_NOT_IN);
    1128             :                 }
    1129       81441 :                 if (pScope->isVariadic()) {
    1130           0 :                     idlc()->error()->error0(EIDL_REST_PARAMETER_NOT_LAST);
    1131             :                 }
    1132       81441 :                 if ($7) {
    1133           2 :                     AstDeclaration const * type = resolveTypedefs(pType);
    1134           4 :                     if (type->getNodeType() != NT_predefined
    1135             :                         || (static_cast< AstBaseType const * >(type)->
    1136           2 :                             getExprType() != ET_any))
    1137             :                     {
    1138           0 :                         idlc()->error()->error0(EIDL_REST_PARAMETER_NOT_ANY);
    1139             :                     }
    1140           2 :                     if (pScope->isConstructor()) {
    1141           6 :                         if (pScope->getIteratorBegin()
    1142           6 :                             != pScope->getIteratorEnd())
    1143             :                         {
    1144             :                             idlc()->error()->error0(
    1145           0 :                                 EIDL_CONSTRUCTOR_REST_PARAMETER_NOT_FIRST);
    1146             :                         }
    1147             :                     } else {
    1148           0 :                         idlc()->error()->error0(EIDL_METHOD_HAS_REST_PARAMETER);
    1149             :                     }
    1150             :                 }
    1151             : 
    1152             :                                 pParam = new AstParameter(
    1153      244323 :                     static_cast< Direction >($2), $7, pType, $8->getName(),
    1154      244323 :                     pScope);
    1155             :                                                                 
    1156       81441 :                                 if ( !$8->checkType($5) )
    1157             :                                 {
    1158             :                                         // WARNING      
    1159             :                                 }
    1160             : 
    1161       81441 :                                 pScope->addDeclaration(pParam);
    1162             :                         }
    1163             :                 }
    1164             :         }
    1165       81441 :         | error
    1166             :         simple_type_spec
    1167             :         {
    1168           0 :                 idlc()->setParseState(PS_NoState);
    1169           0 :                 yyerrok;
    1170             :         }
    1171           0 :         ;
    1172             : 
    1173             : direction :
    1174             :         IDL_IN
    1175             :         {
    1176       79106 :                 $$ = DIR_IN;
    1177             :         }
    1178       79106 :         | IDL_OUT
    1179             :         {
    1180        2243 :                 $$ = DIR_OUT;
    1181             :         }
    1182        2243 :         | IDL_INOUT
    1183             :         {
    1184          92 :                 $$ = DIR_INOUT;
    1185             :         }
    1186          92 :         ;
    1187             : 
    1188             : opt_rest:
    1189             :     IDL_ELLIPSIS
    1190             :     {
    1191           2 :         $$ = true;
    1192             :     }
    1193           2 :     | /* empty */
    1194             :     {
    1195       81439 :         $$ = false;
    1196             :     }
    1197       81439 :     ;
    1198             : 
    1199             : opt_raises:
    1200             :     raises
    1201             :     | /* empty */
    1202             :     {
    1203       81242 :         $$ = 0;
    1204             :     }
    1205       81242 :     ;
    1206             : 
    1207             : raises:
    1208             :     IDL_RAISES
    1209             :     {
    1210       24334 :         idlc()->setParseState(PS_RaiseSeen);
    1211             :     }
    1212       24334 :     '('
    1213             :     {
    1214       24334 :         idlc()->setParseState(PS_RaiseSqSeen);
    1215             :     }
    1216       24334 :     exception_list
    1217             :     ')'
    1218             :     {
    1219       24334 :         idlc()->setParseState(PS_RaiseQsSeen);
    1220       24334 :         $$ = $5;
    1221             :     }
    1222       24334 :     ;
    1223             : 
    1224             : exception_list:
    1225             :     exception_name
    1226             :     {
    1227       24334 :         $$ = new DeclList;
    1228       24334 :         $$->push_back($1);
    1229             :     }
    1230       24334 :     | exception_list ',' exception_name
    1231             :     {
    1232       18353 :         $1->push_back($3);
    1233       18353 :         $$ = $1;
    1234             :     }
    1235       18353 :     ;
    1236             : 
    1237             : exception_name:
    1238             :     scoped_name
    1239             :     {
    1240             :         // The topmost scope is either an AstOperation (for interface methods
    1241             :         // and service constructors) or an AstAttribute (for interface
    1242             :         // attributes), so look up exception names in the next-to-topmost scope:
    1243             :         AstDeclaration * decl = idlc()->scopes()->nextToTop()->lookupByName(
    1244       42687 :             *$1);
    1245       42687 :         if (decl == 0) {
    1246           0 :             idlc()->error()->lookupError(*$1);
    1247       42687 :         } else if (!idlc()->error()->checkPublished(decl)) {
    1248           0 :             decl = 0;
    1249       42687 :         } else if (decl->getNodeType() != NT_exception) {
    1250           0 :             idlc()->error()->error1(EIDL_ILLEGAL_RAISES, decl);
    1251           0 :             decl = 0;
    1252             :         }
    1253       42687 :         delete $1;
    1254       42687 :         $$ = decl;
    1255             :     }
    1256       42687 :     ;
    1257             : 
    1258             : interface_inheritance_decl:
    1259             :     optional_inherited_interface
    1260             :     IDL_INTERFACE
    1261             :     {
    1262        1626 :         idlc()->setParseState(PS_ServiceIFHeadSeen);
    1263             :     }
    1264        1626 :     scoped_name
    1265             :     {
    1266             :         AstInterface * ifc = static_cast< AstInterface * >(
    1267        1626 :             idlc()->scopes()->top());
    1268        1626 :         if (ifc->usesSingleInheritance()) {
    1269           0 :             idlc()->error()->error0(EIDL_MIXED_INHERITANCE);
    1270             :         } else {
    1271             :             addInheritedInterface(
    1272        1626 :                 ifc, *$4, $1,
    1273             :                 rtl::OStringToOUString(
    1274        3252 :                     idlc()->getDocumentation(), RTL_TEXTENCODING_UTF8));
    1275             :         }
    1276        1626 :         delete $4;
    1277             :     }
    1278        1626 :     ;
    1279             : 
    1280             : optional_inherited_interface:
    1281          20 :     '[' IDL_OPTIONAL ']' { $$ = true; }
    1282          20 :     | /* EMPTY */ { $$ = false; }
    1283        1606 :     ;
    1284             : 
    1285             : constants_exports :
    1286             :         constants_export constants_exports
    1287             :         | /* EMPTY */
    1288             :         ;
    1289             : 
    1290             : constants_export :
    1291             :         const_dcl
    1292             :         {
    1293       13571 :                 idlc()->setParseState(PS_ConstantDeclSeen);
    1294             :         }
    1295       13571 :         ';' {};
    1296       13571 : 
    1297             : const_dcl : 
    1298             :         IDL_CONST
    1299             :         {
    1300       13571 :                 idlc()->setParseState(PS_ConstSeen);
    1301             :         }
    1302       13571 :         const_type
    1303             :         {
    1304       13571 :                 idlc()->setParseState(PS_ConstTypeSeen);
    1305             :         }
    1306       13571 :         identifier
    1307             :         {
    1308       13571 :         idlc()->setParseState(PS_ConstIDSeen);
    1309       13571 :         checkIdentifier($5);
    1310             :         }
    1311       13571 :         '='
    1312             :         {
    1313       13571 :                 idlc()->setParseState(PS_ConstAssignSeen);
    1314             :         }
    1315       13571 :         expression
    1316             :         {
    1317       13571 :                 idlc()->setParseState(PS_ConstExprSeen);
    1318             : 
    1319       13571 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
    1320       13571 :                 AstConstant*    pConstant = NULL;
    1321             : 
    1322       13571 :                 if ( $9 && pScope )
    1323             :                 {
    1324       13571 :                         if ( !$9->coerce($3) )
    1325             :                         {
    1326           0 :                                 idlc()->error()->coercionError($9, $3);
    1327             :                         } else
    1328             :                         {
    1329       13571 :                                 pConstant = new AstConstant($3, $9, *$5, pScope);
    1330       13571 :                                 pScope->addDeclaration(pConstant);
    1331             :                         }
    1332             :                 }
    1333       13571 :                 delete $5;
    1334             :         }
    1335       13571 :         ;
    1336             : 
    1337             : constants_dcl : 
    1338             :         IDL_CONSTANTS
    1339             :         {
    1340        1469 :                 idlc()->setParseState(PS_ConstantsSeen);
    1341             :         }
    1342        1469 :         identifier
    1343             :         {
    1344        1469 :         idlc()->setParseState(PS_ConstantsIDSeen);
    1345        1469 :         checkIdentifier($3);
    1346             :         }
    1347        1469 :         '{'
    1348             :         {
    1349        1469 :                 idlc()->setParseState(PS_ConstantsSqSeen);
    1350             : 
    1351        1469 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
    1352        1469 :                 AstConstants*   pConstants = NULL;
    1353        1469 :                 AstDeclaration* pExists = NULL;
    1354             : 
    1355        1469 :                 if ( pScope )
    1356             :                 {
    1357        1469 :                         pConstants = new AstConstants(*$3, pScope);
    1358        1469 :                         if( (pExists = pScope->lookupForAdd(pConstants)) )
    1359             :                         {
    1360           0 :                                 pExists->setInMainfile(idlc()->isInMainFile());
    1361           0 :                                 delete(pConstants);
    1362           0 :                                 pConstants = (AstConstants*)pExists;
    1363             :                         } else
    1364             :                         {
    1365        1469 :                                 pScope->addDeclaration(pConstants);
    1366             :                         }
    1367        1469 :                         idlc()->scopes()->push(pConstants);
    1368             :                 }
    1369        1469 :                 delete $3;
    1370             :         }
    1371        1469 :         constants_exports
    1372             :         {
    1373        1469 :                 idlc()->setParseState(PS_ConstantsBodySeen);
    1374             :         }
    1375        1469 :         '}'
    1376             :         {
    1377        1469 :                 idlc()->setParseState(PS_ConstantsQsSeen);
    1378             :                 /*
    1379             :                  * Finished with this constants - pop it from the scope stack
    1380             :                  */
    1381        1469 :                 idlc()->scopes()->pop();
    1382             :         }
    1383        1469 :         ;
    1384             : 
    1385             : expression : const_expr ;
    1386             : 
    1387             : const_expr : or_expr ;
    1388             : 
    1389             : or_expr : 
    1390             :         xor_expr
    1391             :         | or_expr '|' xor_expr
    1392             :         {
    1393          16 :                 $$ = new AstExpression(EC_or, $1, $3);
    1394             :         }
    1395          16 :         ;
    1396             : 
    1397             : xor_expr :
    1398             :         and_expr
    1399             :         | xor_expr '^' and_expr
    1400             :         {
    1401           0 :                 $$ = new AstExpression(EC_xor, $1, $3);
    1402             :         }
    1403           0 :         ;
    1404             : 
    1405             : and_expr :
    1406             :         shift_expr
    1407             :         | and_expr '&' shift_expr
    1408             :         {
    1409           0 :                 $$ = new AstExpression(EC_and, $1, $3);
    1410             :         }
    1411           0 :         ;
    1412             : 
    1413             : shift_expr : 
    1414             :         add_expr
    1415             :         | shift_expr IDL_LEFTSHIFT add_expr
    1416             :         {
    1417           0 :                 $$ = new AstExpression(EC_left, $1, $3);
    1418             :         }
    1419           0 :         | shift_expr IDL_RIGHTSHIFT add_expr
    1420             :         {
    1421           0 :                 $$ = new AstExpression(EC_right, $1, $3);
    1422             :         }
    1423           0 :         ;
    1424             : 
    1425             : add_expr : 
    1426             :         mult_expr
    1427             :         | add_expr '+' mult_expr
    1428             :         {
    1429          50 :                 $$ = new AstExpression(EC_add, $1, $3);
    1430             :         }
    1431          50 :         | add_expr '-' mult_expr
    1432             :         {
    1433           0 :                 $$ = new AstExpression(EC_minus, $1, $3);
    1434             :         }
    1435           0 :         ;
    1436             : 
    1437             : mult_expr : 
    1438             :         unary_expr
    1439             :         | mult_expr '*' unary_expr
    1440             :         {
    1441           0 :                 $$ = new AstExpression(EC_mul, $1, $3);
    1442             :         }
    1443           0 :         | mult_expr '/' unary_expr
    1444             :         {
    1445           0 :                 $$ = new AstExpression(EC_div, $1, $3);
    1446             :         }
    1447           0 :         | mult_expr '%' unary_expr
    1448             :         {
    1449           0 :                 $$ = new AstExpression(EC_mod, $1, $3);
    1450             :         }
    1451           0 :         ;
    1452             : 
    1453             : unary_expr : 
    1454             :         primary_expr
    1455             :         | '+' primary_expr
    1456             :         {
    1457           0 :                 $$ = new AstExpression(EC_u_plus, $2, NULL);
    1458             :         }
    1459           0 :         | '-' primary_expr
    1460             :         {
    1461           0 :                 $$ = new AstExpression(EC_u_minus, $2, NULL);
    1462             :         }
    1463           0 :         | '~' primary_expr
    1464             :         {
    1465             :         }
    1466           0 :         ;
    1467             : 
    1468             : primary_expr : 
    1469             :         scoped_name
    1470             :         {
    1471             :                 /*
    1472             :                  * An expression which is a scoped name is not resolved now,
    1473             :                  * but only when it is evaluated (such as when it is assigned
    1474             :                  * as a constant value)
    1475             :                  */
    1476          98 :                 $$ = new AstExpression($1);
    1477             :         }
    1478          98 :         | literal
    1479             :         | '(' const_expr ')'
    1480             :         {
    1481           0 :                 $$ = $2;
    1482             :         }
    1483           0 :         ;
    1484             : 
    1485             : literal : 
    1486             :         IDL_INTEGER_LITERAL
    1487             :         {
    1488       13984 :                 $$ = new AstExpression($1);
    1489             :         }
    1490       13984 :     | IDL_INTEGER_ULITERAL
    1491             :     {
    1492           1 :         $$ = new AstExpression($1);
    1493             :     }
    1494           1 :         | IDL_FLOATING_PT_LITERAL
    1495             :         {
    1496          20 :                 $$ = new AstExpression($1);
    1497             :         }
    1498          20 :         | IDL_TRUE
    1499             :         {
    1500           0 :                 $$ = new AstExpression((sal_Int32)1, ET_boolean);
    1501             :         }
    1502           0 :         | IDL_FALSE
    1503             :         {
    1504           0 :                 $$ = new AstExpression((sal_Int32)0, ET_boolean);
    1505             :         }
    1506           0 :         ;
    1507             : 
    1508             : positive_int_expr :
    1509             :         const_expr
    1510             :         {
    1511           0 :                 $1->evaluate(EK_const);
    1512           0 :                 if ( !$1->coerce(ET_ulong) )
    1513             :                 {
    1514           0 :                         idlc()->error()->coercionError($1, ET_ulong);
    1515           0 :                         delete $1;
    1516           0 :                         $$ = NULL;
    1517             :                 }
    1518             :         }
    1519           0 :         ;
    1520             : 
    1521             : const_type :
    1522             :         integer_type
    1523             :         | char_type
    1524             :         | byte_type
    1525             :         | boolean_type
    1526             :         | floating_pt_type
    1527             :         | scoped_name
    1528             :         {
    1529           0 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
    1530           0 :         AstDeclaration const * type = 0;
    1531             :                 
    1532             :                 /*
    1533             :                  * If the constant's type is a scoped name, it must resolve
    1534             :                  * to a scalar constant type
    1535             :                  */
    1536           0 :                 if ( pScope && (type = pScope->lookupByName(*$1)) ) {
    1537           0 :             if (!idlc()->error()->checkPublished(type))
    1538             :             {
    1539           0 :                 type = 0;
    1540             :             }
    1541             :             else
    1542             :             {
    1543           0 :                 type = resolveTypedefs(type);
    1544           0 :                 if (type->getNodeType() == NT_predefined) 
    1545             :                 {
    1546             :                     $$ = static_cast< AstBaseType const * >(type)->
    1547           0 :                         getExprType();
    1548             :                 } else
    1549           0 :                     $$ = ET_any;
    1550             :             }
    1551             :                 } else
    1552           0 :                         $$ = ET_any;
    1553             :         }
    1554           0 :         ;
    1555             : 
    1556             : exception_header :
    1557             :         IDL_EXCEPTION
    1558             :         {
    1559       12903 :                 idlc()->setParseState(PS_ExceptSeen);
    1560             :         }
    1561       12903 :         identifier
    1562             :         {
    1563       12903 :         idlc()->setParseState(PS_ExceptIDSeen);
    1564       12903 :         checkIdentifier($3);
    1565             :         }
    1566       12903 :         inheritance_spec
    1567             :         {
    1568       12903 :                 idlc()->setParseState(PS_InheritSpecSeen);
    1569             : 
    1570       12903 :                 $$ = new FeInheritanceHeader(NT_exception, $3, $5, 0);
    1571       12903 :                 delete $5;
    1572             :         }
    1573       12903 :         ;
    1574             : 
    1575             : exception_dcl : 
    1576             :         exception_header
    1577             :         {
    1578       12903 :                 idlc()->setParseState(PS_ExceptHeaderSeen);
    1579             : 
    1580       12903 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
    1581       12903 :                 AstException*   pExcept = NULL;
    1582             : 
    1583       12903 :                 if ( pScope )
    1584             :                 {
    1585             :                         AstException* pBase = static_cast< AstException* >(
    1586       12903 :                 $1->getInherits());
    1587       12903 :                         pExcept = new AstException(*$1->getName(), pBase, pScope);   
    1588       12903 :                         pScope->addDeclaration(pExcept);
    1589             :                 }
    1590             :                 /*
    1591             :                  * Push the scope of the exception on the scopes stack
    1592             :                  */
    1593       12903 :                 idlc()->scopes()->push(pExcept);
    1594       12903 :                 delete $1;
    1595             :         }
    1596       12903 :         '{'
    1597             :         {
    1598       12903 :                 idlc()->setParseState(PS_ExceptSqSeen);
    1599             :         }
    1600       12903 :         members
    1601             :         {
    1602       12903 :                 idlc()->setParseState(PS_ExceptBodySeen);
    1603             :         }
    1604       12903 :         '}'
    1605             :         {
    1606       12903 :                 idlc()->setParseState(PS_ExceptQsSeen);
    1607             :                 /* this exception is finished, pop its scope from the stack */ 
    1608       12903 :                 idlc()->scopes()->pop();
    1609             :         }
    1610       12903 :         ;
    1611             : 
    1612             : property :
    1613             :         flag_header
    1614             :         simple_type_spec
    1615             :         {
    1616       17531 :                 idlc()->setParseState(PS_PropertyTypeSeen);
    1617             :         }
    1618       17531 :         at_least_one_declarator
    1619             :         {
    1620       17531 :                 idlc()->setParseState(PS_PropertyCompleted);
    1621             : 
    1622       17531 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
    1623       17531 :                 AstAttribute*   pAttr = NULL;
    1624       17531 :                 FeDeclList*             pList = $4;
    1625       17531 :                 FeDeclarator*   pDecl = NULL;
    1626       17531 :         AstType const * pType = NULL;
    1627             : 
    1628       17531 :                 if ( pScope->getScopeNodeType() == NT_singleton )
    1629             :                 {
    1630           0 :                         idlc()->error()->error0(EIDL_ILLEGAL_ADD);                        
    1631             :                 } else
    1632             :                 {
    1633       17531 :                         if ( ($1 & AF_ATTRIBUTE) == AF_ATTRIBUTE )
    1634           0 :                                 idlc()->error()->flagError(EIDL_WRONGATTRIBUTEKEYWORD, AF_ATTRIBUTE);
    1635             : 
    1636       17531 :                         if ( ($1 & AF_PROPERTY) != AF_PROPERTY )
    1637           0 :                                 idlc()->error()->flagError(EIDL_MISSINGATTRIBUTEKEYWORD, AF_PROPERTY);
    1638             : 
    1639             :                         /*
    1640             :                          * Create nodes representing attributes and add them to the
    1641             :                          * enclosing scope
    1642             :                          */
    1643       17531 :                         if ( pScope && $2 && pList )
    1644             :                         {
    1645       17531 :                                 FeDeclList::iterator iter = pList->begin();
    1646       17531 :                                 FeDeclList::iterator end = pList->end();
    1647             : 
    1648       52593 :                                 while (iter != end)
    1649             :                                 {
    1650       17531 :                                         pDecl = (*iter);
    1651       17531 :                                         if ( !pDecl )
    1652             :                                         {
    1653           0 :                                                 iter++;
    1654           0 :                                                 continue;
    1655             :                                         }
    1656             : 
    1657       17531 :                                         pType = pDecl->compose($2);                          
    1658             : 
    1659       17531 :                                         if ( !pType )
    1660             :                                         {
    1661           0 :                                                 iter++;
    1662           0 :                                                 continue;
    1663             :                                         }
    1664             : 
    1665       17531 :                                         pAttr = new AstAttribute(NT_property, $1, pType, pDecl->getName(), pScope);
    1666             : 
    1667       17531 :                                         pScope->addDeclaration(pAttr);
    1668       17531 :                                         iter++;
    1669       17531 :                                         delete pDecl;
    1670             :                                 }
    1671             :                         }
    1672             :                 }                       
    1673             : 
    1674       17531 :                 if ( pList )
    1675       17531 :                         delete pList;
    1676             :         }
    1677       17531 :         | error ';' 
    1678             :         {
    1679           0 :                 yyerror("property");
    1680           0 :                 yyerrok;
    1681             :         }
    1682           0 :         ;
    1683             : 
    1684             : service_exports :
    1685             :         service_exports service_export
    1686             :         | /* EMPTY */
    1687             :         ;
    1688             : 
    1689             : service_export :
    1690             :         service_interface_header
    1691             :         at_least_one_scoped_name
    1692             :         ';'
    1693             :         {
    1694        5388 :                 idlc()->setParseState(PS_ServiceMemberSeen);
    1695             :                 
    1696        5388 :                 AstScope*                       pScope = idlc()->scopes()->topNonNull();
    1697        5388 :                 AstDeclaration*         pDecl = NULL;
    1698        5388 :                 AstInterfaceMember* pIMember = NULL;
    1699             : 
    1700        5388 :                 if ( pScope->getScopeNodeType() == NT_singleton )
    1701             :                 {
    1702           0 :                         idlc()->error()->error0(EIDL_ILLEGAL_ADD);                        
    1703             :                 } else
    1704             :                 {
    1705             :                         /*
    1706             :                          * Create a node representing a class member.
    1707             :                          * Store it in the enclosing scope
    1708             :                  */
    1709        5388 :                         if ( pScope && $2 )
    1710             :                         {
    1711        5388 :                                 StringList::iterator iter = $2->begin();
    1712        5388 :                                 StringList::iterator end = $2->end();                                                
    1713             : 
    1714       16164 :                                 while ( iter != end )
    1715             :                                 {
    1716        5388 :                                         pDecl = pScope->lookupByName(*iter);
    1717        5388 :                                         if ( pDecl && (pDecl->getNodeType() == NT_interface) )
    1718             :                                         {
    1719             :                         /* we relax the strict published check and allow to add new
    1720             :                          * interfaces if they are optional
    1721             :                          */
    1722        5388 :                         bool bOptional = (($1 & AF_OPTIONAL) == AF_OPTIONAL);
    1723        5388 :                         if ( idlc()->error()->checkPublished(pDecl, bOptional) )
    1724             :                         {
    1725             :                             pIMember = new AstInterfaceMember(
    1726        5388 :                                 $1, (AstInterface*)pDecl, *iter, pScope);
    1727        5388 :                             pScope->addDeclaration(pIMember);
    1728             :                         }
    1729             :                                         } else
    1730             :                                         {
    1731             :                                                 idlc()->error()->
    1732           0 :                                                         lookupError(EIDL_INTERFACEMEMBER_LOOKUP, *iter, scopeAsDecl(pScope));
    1733             :                                         }
    1734        5388 :                                         iter++;
    1735             :                                 }
    1736             :                         }                               
    1737             :                 }
    1738        5388 :                 delete $2;
    1739             :         }
    1740        5388 :         | service_service_header
    1741             :         at_least_one_scoped_name
    1742             :         ';'
    1743             :         {
    1744        1802 :                 idlc()->setParseState(PS_ServiceMemberSeen);
    1745             : 
    1746        1802 :                 AstScope*                 pScope = idlc()->scopes()->topNonNull();
    1747        1802 :                 AstDeclaration*   pDecl = NULL;
    1748        1802 :                 AstServiceMember* pSMember = NULL;
    1749             : 
    1750             :                 /*
    1751             :                  * Create a node representing a class member.
    1752             :                  * Store it in the enclosing scope
    1753             :          */
    1754        1802 :                 if ( pScope && $2 )
    1755             :                 {
    1756        1802 :                         StringList::iterator iter = $2->begin();
    1757        1802 :                         StringList::iterator end = $2->end();                                                
    1758             : 
    1759        5406 :                         while ( iter != end )
    1760             :                         {
    1761        1802 :                                 pDecl = pScope->lookupByName(*iter);
    1762        1802 :                                 if ( pDecl && (pDecl->getNodeType() == NT_service) )
    1763             :                                 {
    1764        1802 :                                         if ( pScope->getScopeNodeType() == NT_singleton && pScope->nMembers() > 0 )
    1765           0 :                                                 idlc()->error()->error0(EIDL_ILLEGAL_ADD);                                                                                
    1766        1802 :                     else if ( idlc()->error()->checkPublished(pDecl) )
    1767             :                     {
    1768             :                         pSMember = new AstServiceMember(
    1769        1802 :                             $1, (AstService*)pDecl, *iter, pScope);
    1770        1802 :                         pScope->addDeclaration(pSMember);
    1771             :                     }
    1772             :                                 } else
    1773             :                                 {
    1774             :                                         idlc()->error()->
    1775           0 :                                                 lookupError(EIDL_SERVICEMEMBER_LOOKUP, *iter, scopeAsDecl(pScope));
    1776             :                                 }
    1777        1802 :                                 iter++;
    1778             :                         }
    1779             :                 }                               
    1780        1802 :                 delete $2;
    1781             :         }
    1782        1802 :         | IDL_OBSERVES
    1783             :         at_least_one_scoped_name
    1784             :         ';'
    1785             :         {
    1786           0 :                 idlc()->setParseState(PS_ServiceMemberSeen);
    1787             : 
    1788           0 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
    1789           0 :                 AstDeclaration* pDecl = NULL;
    1790           0 :                 AstObserves*    pObserves = NULL;
    1791             : 
    1792           0 :                 if ( pScope->getScopeNodeType() == NT_singleton )
    1793             :                 {
    1794           0 :                         idlc()->error()->error0(EIDL_ILLEGAL_ADD);                        
    1795             :                 } else
    1796             :                 {
    1797             :                         /*
    1798             :                          * Create a node representing a class member.
    1799             :                          * Store it in the enclosing scope
    1800             :                  */
    1801           0 :                         if ( pScope && $2 )
    1802             :                         {
    1803           0 :                                 StringList::iterator iter = $2->begin();
    1804           0 :                                 StringList::iterator end = $2->end();                                                
    1805             : 
    1806           0 :                                 while ( iter != end )
    1807             :                                 {
    1808           0 :                                         pDecl = pScope->lookupByName(*iter);
    1809           0 :                                         if ( pDecl && (pDecl->getNodeType() == NT_interface) )
    1810             :                                         {
    1811           0 :                                                 pObserves = new AstObserves((AstInterface*)pDecl, *iter, pScope);
    1812           0 :                                                 pScope->addDeclaration(pObserves);
    1813             :                                         } else
    1814             :                                         {
    1815             :                                                 idlc()->error()->
    1816           0 :                                                         lookupError(EIDL_INTERFACEMEMBER_LOOKUP, *iter, scopeAsDecl(pScope));
    1817             :                                         }
    1818           0 :                                         iter++;
    1819             :                                 }
    1820             :                         }                               
    1821             :                 }
    1822           0 :                 delete $2;
    1823             :         }
    1824           0 :         | IDL_NEEDS
    1825             :         at_least_one_scoped_name
    1826             :         ';'
    1827             :         {
    1828           0 :                 idlc()->setParseState(PS_ServiceMemberSeen);
    1829             : 
    1830           0 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
    1831           0 :                 AstDeclaration* pDecl = NULL;
    1832           0 :                 AstNeeds*               pNeeds = NULL;
    1833             : 
    1834           0 :                 if ( pScope->getScopeNodeType() == NT_singleton )
    1835             :                 {
    1836           0 :                         idlc()->error()->error0(EIDL_ILLEGAL_ADD);                        
    1837             :                 } else
    1838             :                 {
    1839             :                         /*
    1840             :                          * Create a node representing a class member.
    1841             :                          * Store it in the enclosing scope
    1842             :                  */
    1843           0 :                         if ( pScope && $2 )
    1844             :                         {
    1845           0 :                                 StringList::iterator iter = $2->begin();
    1846           0 :                                 StringList::iterator end = $2->end();                                                
    1847             : 
    1848           0 :                                 while ( iter != end )
    1849             :                                 {
    1850           0 :                                         pDecl = pScope->lookupByName(*iter);
    1851           0 :                                         if ( pDecl && (pDecl->getNodeType() == NT_service) )
    1852             :                                         {
    1853           0 :                                                 pNeeds = new AstNeeds((AstService*)pDecl, *iter, pScope);
    1854           0 :                                                 pScope->addDeclaration(pNeeds);
    1855             :                                         } else
    1856             :                                         {
    1857             :                                                 idlc()->error()->
    1858           0 :                                                         lookupError(EIDL_SERVICEMEMBER_LOOKUP, *iter, scopeAsDecl(pScope));
    1859             :                                         }
    1860           0 :                                         iter++;
    1861             :                                 }
    1862             :                         }                               
    1863             :                 }
    1864           0 :                 delete $2;
    1865             :         }
    1866           0 :         | property
    1867             :         ';'
    1868             :         {
    1869       17531 :                 idlc()->setParseState(PS_PropertyDeclSeen);
    1870             :         }
    1871       17531 :         ;
    1872             : 
    1873             : service_interface_header :
    1874             :         IDL_INTERFACE
    1875             :         {
    1876        4134 :                 idlc()->setParseState(PS_ServiceIFHeadSeen);
    1877        4134 :                 $$ = AF_INVALID;
    1878             :         }
    1879        4134 :         | flag_header
    1880             :         IDL_INTERFACE
    1881             :         {
    1882        1254 :                 idlc()->setParseState(PS_ServiceIFHeadSeen);
    1883        1254 :                 if ( (AF_OPTIONAL != $1) && ( AF_INVALID != $1) )
    1884           0 :                         idlc()->error()->flagError(EIDL_OPTIONALEXPECTED, $1);
    1885        1254 :                 $$ = $1;
    1886             :         }
    1887        1254 :         ;
    1888             : 
    1889             : service_service_header :
    1890             :         IDL_SERVICE
    1891             :         {
    1892        1418 :                 idlc()->setParseState(PS_ServiceSHeadSeen);
    1893        1418 :                 $$ = AF_INVALID;
    1894             :         }
    1895        1418 :         | flag_header
    1896             :         IDL_SERVICE
    1897             :         {
    1898         384 :                 idlc()->setParseState(PS_ServiceSHeadSeen);
    1899         384 :                 if ( (AF_OPTIONAL != $1) && ( AF_INVALID != $1) )
    1900           0 :                         idlc()->error()->flagError(EIDL_OPTIONALEXPECTED, $1);
    1901         384 :                 $$ = $1;
    1902             :         }
    1903         384 :         ;
    1904             : 
    1905             : service_dcl : 
    1906             :         IDL_SERVICE
    1907             :         {
    1908        3199 :                 idlc()->setParseState(PS_ServiceSeen);
    1909             :         }
    1910        3199 :         identifier
    1911             :         {
    1912        3199 :         idlc()->setParseState(PS_ServiceIDSeen);
    1913        3199 :         checkIdentifier($3);
    1914             : 
    1915        3199 :         AstScope*       pScope = idlc()->scopes()->topNonNull();
    1916        3199 :         AstService*     pService = NULL;
    1917             : 
    1918             :         /*
    1919             :          * Make a new service and add it to the enclosing scope
    1920             :          */
    1921        3199 :         if (pScope != NULL)
    1922             :         {
    1923        3199 :             pService = new AstService(*$3, pScope);
    1924        3199 :             pScope->addDeclaration(pService);
    1925             :         }
    1926        3199 :         delete $3;
    1927             :         /*
    1928             :          * Push it on the stack
    1929             :          */
    1930        3199 :         idlc()->scopes()->push(pService);
    1931             :         }
    1932        3199 :     service_dfn
    1933             :         {
    1934             :                 /* this service is finished, pop its scope from the stack */ 
    1935        3199 :                 idlc()->scopes()->pop();
    1936             :         }
    1937        3199 :         ;
    1938             : 
    1939             : service_dfn:
    1940             :     service_interface_dfn
    1941             :     | service_obsolete_dfn
    1942             :     ;
    1943             : 
    1944             : service_interface_dfn:
    1945             :     ':' scoped_name
    1946             :     {
    1947         383 :         AstScope * scope = idlc()->scopes()->nextToTop();
    1948             :             // skip the scope pushed by service_dcl
    1949         383 :         AstDeclaration * decl = scope->lookupByName(*$2);
    1950         383 :         if (decl != 0 && resolveTypedefs(decl)->getNodeType() == NT_interface) {
    1951         383 :             if (idlc()->error()->checkPublished(decl)) {
    1952         383 :                 idlc()->scopes()->top()->addDeclaration(decl);
    1953             :             }
    1954             :         } else {
    1955             :             idlc()->error()->lookupError(
    1956           0 :                 EIDL_INTERFACEMEMBER_LOOKUP, *$2, scopeAsDecl(scope));
    1957             :         }
    1958         383 :         delete $2;
    1959             :     }
    1960         383 :     opt_service_body
    1961             :     {
    1962         383 :         AstService * s = static_cast< AstService * >(idlc()->scopes()->top());
    1963         383 :         if (s != 0) {
    1964         383 :             s->setDefaultConstructor(!$4);
    1965             :         }
    1966             :     }
    1967         383 :     ;
    1968             : 
    1969             : opt_service_body:
    1970         236 :     service_body { $$ = true; }
    1971         236 :     | /* empty */ { $$ = false; }
    1972         147 :     ;
    1973             : 
    1974             : service_body:
    1975             :     '{'
    1976             :     constructors
    1977             :     '}'
    1978             :     ;
    1979             : 
    1980             : constructors:
    1981             :     constructors constructor
    1982             :     | /* empty */
    1983             :     ;
    1984             : 
    1985             : constructor:
    1986             :     identifier
    1987             :     {
    1988         257 :         checkIdentifier($1);
    1989         257 :         AstScope * scope = idlc()->scopes()->top();
    1990         257 :         AstOperation * ctor = new AstOperation(0, *$1, scope);
    1991         257 :         delete $1;
    1992         257 :         scope->addDeclaration(ctor);
    1993         257 :                 idlc()->scopes()->push(ctor);
    1994             :     }
    1995         257 :     '('
    1996             :     parameters
    1997             :     ')'
    1998             :     opt_raises
    1999             :     {
    2000         257 :         static_cast< AstOperation * >(idlc()->scopes()->top())->setExceptions(
    2001         514 :             $6);
    2002         257 :         delete $6;
    2003         257 :         idlc()->scopes()->pop();
    2004         514 :         if (static_cast< AstService * >(idlc()->scopes()->top())->
    2005         257 :             checkLastConstructor())
    2006             :         {
    2007           0 :             idlc()->error()->error0(EIDL_SIMILAR_CONSTRUCTORS);
    2008             :         }
    2009             :     }
    2010         257 :     ';'
    2011             :     ;
    2012             : 
    2013             : singleton_dcl : 
    2014             :         IDL_SINGLETON
    2015             :         {
    2016         164 :                 idlc()->setParseState(PS_SingletonSeen);
    2017             :         }
    2018         164 :         identifier
    2019             :         {
    2020         164 :         idlc()->setParseState(PS_SingletonIDSeen);
    2021         164 :         checkIdentifier($3);
    2022             : 
    2023         164 :                 AstScope*       pScope = idlc()->scopes()->topNonNull();
    2024         164 :                 AstService*     pService = NULL;
    2025             :                 
    2026             :                 /*
    2027             :                  * Make a new service and add it to the enclosing scope
    2028             :                  */
    2029         164 :                 if (pScope != NULL) 
    2030             :                 {
    2031         164 :                         pService = new AstService(NT_singleton, *$3, pScope);
    2032         164 :                         pScope->addDeclaration(pService);
    2033             :                 }
    2034         164 :                 delete $3;
    2035             :                 /*
    2036             :                  * Push it on the stack
    2037             :                  */
    2038         164 :                 idlc()->scopes()->push(pService);
    2039             :         }
    2040         164 :     singleton_dfn
    2041             :         {
    2042             :                 /* this singelton is finished, pop its scope from the stack */ 
    2043         164 :                 idlc()->scopes()->pop();
    2044             :         }
    2045         164 :         ;
    2046             : 
    2047             : singleton_dfn:
    2048             :     singleton_interface_dfn
    2049             :     | service_obsolete_dfn
    2050             :     ;
    2051             : 
    2052             : singleton_interface_dfn:
    2053             :     ':' scoped_name
    2054             :     {
    2055         159 :         AstScope * scope = idlc()->scopes()->nextToTop();
    2056             :             // skip the scope (needlessly) pushed by singleton_dcl
    2057         159 :         AstDeclaration * decl = scope->lookupByName(*$2);
    2058         159 :         if (decl != 0 && resolveTypedefs(decl)->getNodeType() == NT_interface) {
    2059         159 :             if (idlc()->error()->checkPublished(decl)) {
    2060         159 :                 idlc()->scopes()->top()->addDeclaration(decl);
    2061             :             }
    2062             :         } else {
    2063             :             idlc()->error()->lookupError(
    2064           0 :                 EIDL_INTERFACEMEMBER_LOOKUP, *$2, scopeAsDecl(scope));
    2065             :         }
    2066         159 :         delete $2;
    2067             :     }
    2068         159 :     ;
    2069             : 
    2070             : service_obsolete_dfn:
    2071             :     '{'
    2072             :     {
    2073             :         idlc()->setParseState(
    2074        2821 :             idlc()->scopes()->top()->getScopeNodeType() == NT_service
    2075        2821 :             ? PS_ServiceSqSeen : PS_SingletonSqSeen);
    2076             :     }
    2077        2821 :     service_exports
    2078             :     {
    2079             :         idlc()->setParseState(
    2080        2821 :             idlc()->scopes()->top()->getScopeNodeType() == NT_service
    2081        2821 :             ? PS_ServiceBodySeen : PS_SingletonBodySeen);
    2082             :     }
    2083        2821 :     '}'
    2084             :     {
    2085             :         idlc()->setParseState(
    2086        2821 :             idlc()->scopes()->top()->getScopeNodeType() == NT_service
    2087        2821 :             ? PS_ServiceQsSeen : PS_SingletonQsSeen);
    2088             :     }
    2089        2821 :     ;
    2090             : 
    2091             : type_dcl :
    2092             :         IDL_TYPEDEF
    2093             :         {
    2094         722 :                 idlc()->setParseState(PS_TypedefSeen);
    2095             :         }
    2096         722 :         type_declarator {}
    2097         722 :         | struct_type {}
    2098       11405 :         | union_type {}
    2099           0 :         | enum_type {}
    2100        4597 :         ;
    2101             : 
    2102             : type_declarator :
    2103             :         type_spec
    2104             :         {
    2105         722 :                 idlc()->setParseState(PS_TypeSpecSeen);
    2106         722 :         if ($1 != 0 && $1->getNodeType() == NT_instantiated_struct) {
    2107           0 :             idlc()->error()->error0(EIDL_INSTANTIATED_STRUCT_TYPE_TYPEDEF);
    2108             :         }
    2109             :         }
    2110         722 :         at_least_one_declarator
    2111             :         {
    2112         722 :                 idlc()->setParseState(PS_DeclaratorsSeen);
    2113             : 
    2114         722 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
    2115         722 :                 AstTypeDef*     pTypeDef = NULL;
    2116         722 :                 FeDeclList*             pList = $3;
    2117         722 :                 FeDeclarator*   pDecl = NULL;
    2118         722 :         AstType const * pType = NULL;
    2119             : 
    2120             :                 /*
    2121             :                  * Create nodes representing typedefs and add them to the
    2122             :                  * enclosing scope
    2123             :                  */
    2124         722 :                 if ( pScope && $1 && pList )
    2125             :                 {
    2126         722 :                         FeDeclList::iterator iter = pList->begin();
    2127         722 :                         FeDeclList::iterator end = pList->end();
    2128             : 
    2129        2166 :                         while (iter != end)
    2130             :                         {
    2131         722 :                                 pDecl = (*iter);
    2132         722 :                                 if ( !pDecl )
    2133             :                                 {
    2134           0 :                                         iter++;
    2135           0 :                                         continue;
    2136             :                                 }
    2137             : 
    2138         722 :                                 pType = pDecl->compose($1);
    2139             : 
    2140         722 :                                 if ( !pType )
    2141             :                                 {
    2142           0 :                                         iter++;
    2143           0 :                                         continue;
    2144             :                                 }
    2145             : 
    2146         722 :                                 pTypeDef = new AstTypeDef(pType, pDecl->getName(), pScope);
    2147             : 
    2148         722 :                                 pScope->addDeclaration(pTypeDef);
    2149         722 :                                 iter++;
    2150         722 :                                 delete pDecl;
    2151             :                         }
    2152         722 :                         delete pList;
    2153             :                 }
    2154             :         }
    2155         722 :         ;
    2156             : 
    2157             : at_least_one_declarator :
    2158             :         declarator declarators
    2159             :         {
    2160       72034 :                 if ( $2 )
    2161             :                 {
    2162           0 :                         $2->push_back($1);
    2163           0 :                         $$ = $2;
    2164             :                 } else
    2165             :                 {
    2166       72034 :                         FeDeclList* pList = new FeDeclList();
    2167       72034 :                         pList->push_back($1);
    2168       72034 :                         $$ = pList;
    2169             :                 }
    2170             :         }
    2171       72034 :         ;
    2172             : 
    2173             : declarators : 
    2174             :         declarators
    2175             :         ','
    2176             :         {
    2177           0 :                 idlc()->setParseState(PS_DeclsCommaSeen);
    2178             :         } 
    2179           0 :         declarator
    2180             :         {
    2181           0 :                 idlc()->setParseState(PS_DeclsDeclSeen);
    2182           0 :                 if ( $1 )
    2183             :                 {
    2184           0 :                         $1->push_back($4);
    2185           0 :                         $$ = $1;
    2186             :                 } else
    2187             :                 {
    2188           0 :                         FeDeclList* pList = new FeDeclList();
    2189           0 :                         pList->push_back($4);
    2190           0 :                         $$ = pList;
    2191             :                 }
    2192             :         }
    2193           0 :         | /* EMPTY */
    2194             :         {
    2195       72034 :                 $$ = NULL;
    2196             :         }
    2197       72034 :         ;
    2198             : 
    2199             : declarator : 
    2200             :         simple_declarator
    2201             :         | complex_declarator
    2202             :         ;
    2203             : 
    2204             : simple_declarator :
    2205             :         identifier
    2206             :         {
    2207             :         // For historic reasons, the struct com.sun.star.uno.Uik contains
    2208             :         // members with illegal names (of the form "m_DataN"); avoid useless
    2209             :         // warnings about them:
    2210      157967 :         AstScope * scope = idlc()->scopes()->top();
    2211      202755 :         if (scope == 0 || scope->getScopeNodeType() != NT_struct
    2212       44788 :             || (scopeAsDecl(scope)->getScopedName()
    2213       44788 :                 != "com::sun::star::uno::Uik"))
    2214             :         {
    2215      150962 :             checkIdentifier($1);
    2216             :         }
    2217             : 
    2218      157967 :         $$ = new FeDeclarator(*$1, FeDeclarator::FD_simple, NULL);
    2219      157967 :         delete $1;
    2220             :         }
    2221      157967 :         ;
    2222             : 
    2223             : complex_declarator :
    2224             :         array_declarator
    2225             :         {
    2226           0 :                 $$ = new FeDeclarator($1->getLocalName(), FeDeclarator::FD_complex, $1);
    2227             :         }
    2228           0 :         ;
    2229             : 
    2230             : array_declarator :
    2231             :         identifier
    2232             :         {
    2233           0 :         idlc()->setParseState(PS_ArrayIDSeen);
    2234           0 :         checkIdentifier($1);
    2235             :         }
    2236           0 :         at_least_one_array_dim
    2237             :         {
    2238           0 :                 idlc()->setParseState(PS_ArrayCompleted);
    2239           0 :                 $$ = new AstArray(*$1, NULL, *$3, idlc()->scopes()->bottom());
    2240           0 :                 delete $1;
    2241             :         }
    2242           0 :         ;
    2243             : 
    2244             : at_least_one_array_dim :
    2245             :         array_dim array_dims
    2246             :         {
    2247           0 :                 if( $2 )
    2248             :                 {
    2249           0 :                         $2->push_front($1);
    2250           0 :                         $$ = $2;
    2251             :                 } else
    2252             :                 {
    2253           0 :                         ExprList* pList = new ExprList();
    2254           0 :                         pList->push_back($1);
    2255           0 :                         $$ = pList;
    2256             :                 }
    2257             :         }
    2258           0 :         ;
    2259             : 
    2260             : array_dims : 
    2261             :         array_dims array_dim
    2262             :         {
    2263           0 :                 if( $1 )
    2264             :                 {
    2265           0 :                         $1->push_back($2);
    2266           0 :                         $$ = $1;
    2267             :                 } else
    2268             :                 {
    2269           0 :                         ExprList* pList = new ExprList();
    2270           0 :                         pList->push_back($2);
    2271           0 :                         $$ = pList;
    2272             :                 }
    2273             :         }
    2274           0 :         | /* EMPTY */
    2275             :         {
    2276           0 :                 $$ = NULL;
    2277             :         }
    2278           0 :     ;
    2279             : 
    2280             : array_dim :
    2281             :         '['
    2282             :         {
    2283           0 :                 idlc()->setParseState(PS_DimSqSeen);
    2284             :         }
    2285           0 :         positive_int_expr
    2286             :         {
    2287           0 :                 idlc()->setParseState(PS_DimExprSeen);
    2288             :         }
    2289           0 :         ']'
    2290             :         {
    2291           0 :                 idlc()->setParseState(PS_DimQsSeen);
    2292             :                 /*
    2293             :                  * Array dimensions are expressions which must be coerced to
    2294             :                  * positive integers
    2295             :                  */
    2296           0 :                 if ( !$3 || !$3->coerce(ET_uhyper) ) 
    2297             :                 {
    2298           0 :                         idlc()->error()->coercionError($3, ET_uhyper);
    2299           0 :                         $$ = NULL;
    2300             :                 } else
    2301           0 :                         $$ = $3;
    2302             :         }
    2303           0 :         ;
    2304             : 
    2305             : at_least_one_scoped_name :
    2306             :         scoped_name scoped_names
    2307             :         {
    2308        7190 :                 if ($2)
    2309             :                 {
    2310           0 :                         $2->push_front(*$1);
    2311           0 :                         $$ = $2;
    2312             :                 } else
    2313             :                 {
    2314        7190 :                         StringList* pNames = new StringList();
    2315        7190 :                         pNames->push_back(*$1);
    2316        7190 :                         $$ = pNames;
    2317             :                 }
    2318        7190 :                 delete($1);
    2319             :         }
    2320        7190 :         ;
    2321             : 
    2322             : scoped_names :
    2323             :         scoped_names
    2324             :         ','
    2325             :         {
    2326           0 :                 idlc()->setParseState(PS_SNListCommaSeen);
    2327             :         }
    2328           0 :         scoped_name
    2329             :         {
    2330           0 :                 idlc()->setParseState(PS_ScopedNameSeen);
    2331           0 :                 if ($1)
    2332             :                 {
    2333           0 :                         $1->push_back(*$4);
    2334           0 :                         $$ = $1;
    2335             :                 } else
    2336             :                 {
    2337           0 :                         StringList* pNames = new StringList();
    2338           0 :                         pNames->push_back(*$4);
    2339           0 :                         $$ = pNames;
    2340             :                 }
    2341           0 :                 delete($4);
    2342             :         }
    2343           0 :         | /* EMPTY */
    2344             :         {
    2345        7190 :                 $$ = NULL;
    2346             :         }
    2347        7190 :         ;
    2348             : 
    2349             : scoped_name :
    2350             :         identifier
    2351             :         {
    2352      151353 :         idlc()->setParseState(PS_SN_IDSeen);
    2353      151353 :         checkIdentifier($1);
    2354      151353 :         $$ = $1;
    2355             :         }
    2356      151353 :         | IDL_SCOPESEPARATOR
    2357             :         {
    2358       12595 :                 idlc()->setParseState(PS_ScopeDelimSeen);
    2359             :         }
    2360       12595 :         identifier
    2361             :         {
    2362       12595 :         checkIdentifier($3);
    2363       12595 :         OString* pName = new OString("::");
    2364       12595 :         *pName += *$3;
    2365       12595 :         delete $3;
    2366       12595 :         $$ = pName;
    2367             :         }
    2368       12595 :         | scoped_name
    2369             :         IDL_SCOPESEPARATOR
    2370             :         {
    2371             :         }
    2372      500777 :         identifier
    2373             :     {
    2374      500777 :         checkIdentifier($4);
    2375      500777 :         *$1 += ::rtl::OString("::");
    2376      500777 :         *$1 += *$4;
    2377      500777 :         delete $4;
    2378      500777 :         $$ = $1;
    2379             :         }
    2380      500777 :         ;
    2381             : 
    2382             : type_spec :
    2383             :         simple_type_spec
    2384             :         | constructed_type_spec
    2385             :         ;
    2386             : 
    2387             : simple_type_spec : 
    2388             :     fundamental_type
    2389             :         | scoped_name opt_type_args
    2390             :         {
    2391       69083 :         $$ = createNamedType($1, $2);
    2392             :         }
    2393       69083 :         ;
    2394             : 
    2395             : fundamental_type:
    2396             :         base_type_spec
    2397             :         {
    2398      140084 :                 $$ = idlc()->scopes()->bottom()->lookupPrimitiveType($1);
    2399             :         }
    2400      140084 :         | template_type_spec
    2401             :     ;
    2402             : 
    2403             : opt_type_args:
    2404         162 :     '<' type_args '>' { $$ = $2; }
    2405         162 :     | /* empty */ { $$ = 0; }
    2406       77203 :     ;
    2407             : 
    2408             : type_args:
    2409             :     type_arg
    2410             :     {
    2411         162 :         $$ = new DeclList;
    2412         162 :         $$->push_back(const_cast< AstDeclaration * >($1)); //TODO: const_cast
    2413             :     }
    2414         162 :     | type_args ',' type_arg
    2415             :     {
    2416          52 :         $1->push_back(const_cast< AstDeclaration * >($3)); //TODO: const_cast
    2417          52 :         $$ = $1;
    2418             :     }
    2419          52 :     ;
    2420             : 
    2421             : type_arg:
    2422             :     simple_type_spec
    2423             :     {
    2424         214 :         if ($1 != 0 && static_cast< AstType const * >($1)->isUnsigned()) {
    2425           0 :             idlc()->error()->error0(EIDL_UNSIGNED_TYPE_ARGUMENT);
    2426             :         }
    2427         214 :         $$ = $1;
    2428             :     }
    2429         214 :     ;
    2430             : 
    2431             : base_type_spec : 
    2432             :         integer_type
    2433             :         | floating_pt_type
    2434             :         | char_type
    2435             :         | boolean_type
    2436             :         | byte_type
    2437             :         | any_type
    2438             :         | type_type
    2439             :         | string_type
    2440             :         ;
    2441             : 
    2442             : integer_type : 
    2443             :         signed_int
    2444             :         | unsigned_int
    2445             :         ;
    2446             : 
    2447             : signed_int : 
    2448             :         IDL_LONG
    2449             :         {
    2450       39404 :                 $$ = ET_long;
    2451             :         }
    2452       39404 :         | IDL_HYPER
    2453             :         {
    2454         249 :                 $$ = ET_hyper;
    2455             :         }
    2456         249 :         | IDL_SHORT
    2457             :         {
    2458       17424 :                 $$ = ET_short;
    2459             :         }
    2460       17424 :         ;
    2461             : 
    2462             : unsigned_int : 
    2463             :         IDL_UNSIGNED IDL_LONG
    2464             :         {
    2465        4284 :                 $$ = ET_ulong;
    2466             :         }
    2467        4284 :         | IDL_UNSIGNED IDL_HYPER
    2468             :         {
    2469          18 :                 $$ = ET_uhyper;
    2470             :         }
    2471          18 :         | IDL_UNSIGNED IDL_SHORT
    2472             :         {
    2473        3460 :                 $$ = ET_ushort;
    2474             :         }
    2475        3460 :         ;
    2476             : 
    2477             : floating_pt_type : 
    2478             :         IDL_DOUBLE
    2479             :         {
    2480        2496 :                 $$ = ET_double;
    2481             :         }
    2482        2496 :         | IDL_FLOAT
    2483             :         {
    2484        1406 :                 $$ = ET_float;
    2485             :         }
    2486        1406 :         ;
    2487             : 
    2488             : char_type : 
    2489             :         IDL_CHAR
    2490             :         {
    2491         906 :                 $$ = ET_char;
    2492             :         }
    2493         906 :         ;
    2494             : 
    2495             : byte_type : 
    2496             :         IDL_BYTE
    2497             :         {
    2498        2439 :                 $$ = ET_byte;
    2499             :         }
    2500        2439 :         ;
    2501             : 
    2502             : boolean_type : 
    2503             :         IDL_BOOLEAN
    2504             :         {
    2505       18690 :                 $$ = ET_boolean;
    2506             :         }
    2507       18690 :         ;
    2508             : 
    2509             : any_type : 
    2510             :         IDL_ANY
    2511             :         {
    2512       16898 :                 $$ = ET_any;
    2513             :         }
    2514       16898 :         ;
    2515             : 
    2516             : type_type :
    2517             :         IDL_TYPE
    2518             :         {
    2519        5434 :                 $$ = ET_type;
    2520             :         }
    2521        5434 :         ;
    2522             : 
    2523             : string_type :
    2524             :         IDL_STRING
    2525             :         {
    2526       40547 :                 $$ = ET_string;
    2527             :         }
    2528       40547 :         ;
    2529             : 
    2530             : template_type_spec : 
    2531             :         sequence_type_spec
    2532             :         | array_type
    2533             :         ;
    2534             : 
    2535             : constructed_type_spec : 
    2536             :         struct_type
    2537             :         | union_type
    2538             :         | enum_type
    2539             :         ;
    2540             : 
    2541             : array_type :
    2542             :         simple_type_spec
    2543             :         {
    2544           0 :                 idlc()->setParseState(PS_ArrayTypeSeen);
    2545             :         }
    2546           0 :         at_least_one_array_dim
    2547             :         {
    2548           0 :                 idlc()->setParseState(PS_ArrayCompleted);
    2549             : 
    2550           0 :                 AstScope* pScope = idlc()->scopes()->bottom();
    2551           0 :                 AstDeclaration* pDecl = NULL;
    2552           0 :                 AstDeclaration* pArray = NULL;
    2553             : 
    2554           0 :                 if ( $1 )
    2555             :                 {
    2556           0 :                         pArray = new AstArray((AstType*)$1, *$3, idlc()->scopes()->bottom());
    2557           0 :                         if ( pScope )
    2558             :                         {
    2559           0 :                                 pDecl = pScope->addDeclaration(pArray);                              
    2560           0 :                                 if ( pArray != pDecl )
    2561             :                                 {
    2562             :                                         // if array type already defined then use it
    2563           0 :                                         delete pArray;
    2564           0 :                                         pArray = pDecl;                                 
    2565             :                                 }
    2566             :                         }
    2567             :                 }
    2568           0 :                 $$ = pArray; 
    2569             :         }
    2570           0 :         ;
    2571             : 
    2572             : sequence_type_spec :
    2573             :         IDL_SEQUENCE
    2574             :         {
    2575       17765 :                 idlc()->setParseState(PS_SequenceSeen);
    2576             :                 /*
    2577             :                  * Push a sequence marker on scopes stack
    2578             :                  */
    2579       17765 :                 idlc()->scopes()->push(NULL);
    2580             :         }
    2581       17765 :         '<'
    2582             :         {
    2583       17765 :                 idlc()->setParseState(PS_SequenceSqSeen);
    2584             :         }
    2585       17765 :         simple_type_spec
    2586             :         {
    2587       17765 :                 idlc()->setParseState(PS_SequenceTypeSeen);
    2588             :         }
    2589       17765 :         '>'
    2590             :         {
    2591       17765 :                 idlc()->setParseState(PS_SequenceQsSeen);
    2592             :                 /*
    2593             :                  * Remove sequence marker from scopes stack
    2594             :                  */
    2595       17765 :                 if (idlc()->scopes()->top() == NULL)
    2596       17765 :                         idlc()->scopes()->pop();
    2597             :                 /*
    2598             :                  * Create a node representing a sequence
    2599             :                  */
    2600       17765 :                 AstScope* pScope = idlc()->scopes()->bottom();
    2601       17765 :                 AstDeclaration* pDecl = NULL;
    2602       17765 :                 AstDeclaration* pSeq = NULL;
    2603             :                 
    2604       17765 :                 if ( $5 )
    2605             :                 {
    2606       17765 :                         AstType *pType = (AstType*)$5;
    2607       17765 :                         if ( pType )
    2608             :                         {
    2609       17765 :                                 pSeq = new AstSequence(pType, pScope);
    2610             :                                 /*
    2611             :                                  * Add this AstSequence to the types defined in the global scope
    2612             :                                  */
    2613       17765 :                                 pDecl = pScope->addDeclaration(pSeq);
    2614       17765 :                                 if ( pSeq != pDecl )
    2615             :                                 {
    2616             :                                         // if sequence type already defined then use it
    2617        7503 :                                         delete pSeq;
    2618        7503 :                                         pSeq = pDecl;
    2619             :                                 }
    2620             :                         }
    2621             :         }
    2622       17765 :                 $$ = pSeq;
    2623             :         }
    2624       17765 :         | error '>' 
    2625             :         {
    2626           0 :                 yyerror("sequence declaration");
    2627           0 :                 yyerrok;
    2628           0 :         $$ = 0;
    2629             :         }
    2630           0 :         ;
    2631             : 
    2632             : struct_type :
    2633             :         structure_header
    2634             :         {
    2635       11405 :                 idlc()->setParseState(PS_StructHeaderSeen);
    2636             : 
    2637       11405 :                 AstScope*       pScope = idlc()->scopes()->topNonNull();
    2638       11405 :                 AstStruct*      pStruct = NULL;
    2639             : 
    2640       11405 :                 if ( pScope )
    2641             :                 {
    2642       11405 :                         AstStruct* pBase= static_cast< AstStruct* >($1->getInherits());
    2643             :             pStruct = new AstStruct(
    2644       11405 :                 *$1->getName(), $1->getTypeParameters(), pBase, pScope);
    2645       11405 :                         pScope->addDeclaration(pStruct);
    2646             :                 }
    2647             :                 /*
    2648             :                  * Push the scope of the struct on the scopes stack
    2649             :                  */
    2650       11405 :                 idlc()->scopes()->push(pStruct);
    2651       11405 :                 delete $1;
    2652             :         }
    2653       11405 :         '{'
    2654             :         {
    2655       11405 :                 idlc()->setParseState(PS_StructSqSeen);
    2656             :         }
    2657       11405 :         at_least_one_member
    2658             :         {
    2659       11405 :                 idlc()->setParseState(PS_StructBodySeen);
    2660             :         }
    2661       11405 :         '}'
    2662             :         {
    2663       11405 :                 idlc()->setParseState(PS_StructQsSeen);
    2664             :                 /* this exception is finished, pop its scope from the stack */ 
    2665       11405 :                 idlc()->scopes()->pop();
    2666             :         }
    2667       11405 :         ;
    2668             : 
    2669             : structure_header :
    2670             :         IDL_STRUCT
    2671             :         {
    2672       11405 :         idlc()->setParseState(PS_StructSeen);
    2673             :         }
    2674       11405 :         identifier
    2675             :         {
    2676       11405 :         idlc()->setParseState(PS_StructIDSeen);
    2677       11405 :         checkIdentifier($3);
    2678             :         }
    2679       11405 :     opt_type_params
    2680             :         inheritance_spec
    2681             :         {
    2682       11405 :         idlc()->setParseState(PS_InheritSpecSeen);
    2683             : 
    2684             :         // Polymorphic struct type templates with base types would cause various
    2685             :         // problems in language bindings, so forbid them here.  For example,
    2686             :         // GCC prior to version 3.4 fails with code like
    2687             :         //
    2688             :         //  struct Base { ... };
    2689             :         //  template< typename typeparam_T > struct Derived: public Base {
    2690             :         //      int member1 CPPU_GCC3_ALIGN(Base);
    2691             :         //      ... };
    2692             :         //
    2693             :         // (Note that plain struct types with instantiated polymorphic struct
    2694             :         // type bases, which might also cause problems in language bindings, are
    2695             :         // already rejected on a syntactic level.)
    2696       11405 :         if ($5 != 0 && $6 != 0) {
    2697           0 :             idlc()->error()->error0(EIDL_STRUCT_TYPE_TEMPLATE_WITH_BASE);
    2698             :         }
    2699             : 
    2700       11405 :         $$ = new FeInheritanceHeader(NT_struct, $3, $6, $5);
    2701       11405 :         delete $5;
    2702       11405 :         delete $6;
    2703             :         }
    2704       11405 :         ;
    2705             : 
    2706             : opt_type_params:
    2707          52 :     '<' type_params '>' { $$ = $2; }
    2708          52 :     | /* empty */ { $$ = 0; }
    2709       11353 :     ;
    2710             : 
    2711             : type_params:
    2712             :     identifier
    2713             :     {
    2714          52 :         $$ = new std::vector< rtl::OString >;
    2715          52 :         $$->push_back(*$1);
    2716          52 :         delete $1;
    2717             :     }
    2718          52 :     | type_params ',' identifier
    2719             :     {
    2720          19 :         if (std::find($1->begin(), $1->end(), *$3) != $1->end()) {
    2721           0 :             idlc()->error()->error0(EIDL_IDENTICAL_TYPE_PARAMETERS);
    2722             :         }
    2723          19 :         $1->push_back(*$3);
    2724          19 :         delete $3;
    2725          19 :         $$ = $1;
    2726             :     }
    2727          19 :     ;
    2728             : 
    2729             : at_least_one_member : member members ;
    2730             : 
    2731             : members : 
    2732             :         members member
    2733             :         | /* EMPTY */
    2734             :         ;
    2735             : 
    2736             : member :
    2737             :         type_or_parameter
    2738             :         {
    2739       53781 :                 idlc()->setParseState(PS_MemberTypeSeen);
    2740             :         }
    2741       53781 :         at_least_one_declarator
    2742             :         {
    2743       53781 :                 idlc()->setParseState(PS_MemberDeclsSeen);
    2744             :         }
    2745       53781 :         ';'
    2746             :         {
    2747       53781 :                 idlc()->setParseState(PS_MemberDeclsCompleted);
    2748             : 
    2749       53781 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
    2750       53781 :                 AstMember*              pMember = NULL;
    2751       53781 :                 FeDeclList*             pList = $3;
    2752       53781 :                 FeDeclarator*   pDecl = NULL;
    2753       53781 :         AstType const * pType = NULL;
    2754             : 
    2755             :                 // !!! check recursive type
    2756             : 
    2757       53781 :                 if ( pScope && pList && $1 )
    2758             :                 {
    2759       53781 :                         FeDeclList::iterator iter = pList->begin();
    2760       53781 :                         FeDeclList::iterator end = pList->end();
    2761      161343 :                         while (iter != end)
    2762             :                         {
    2763       53781 :                                 pDecl = (*iter);
    2764       53781 :                                 if ( !pDecl )
    2765             :                                 {
    2766           0 :                                         iter++;
    2767           0 :                                         continue;
    2768             :                                 }
    2769             : 
    2770       53781 :                                 pType = pDecl->compose($1);                          
    2771             : 
    2772       53781 :                                 if ( !pType )
    2773             :                                 {
    2774           0 :                                         iter++;
    2775           0 :                                         continue;
    2776             :                                 }
    2777             : 
    2778       53781 :                                 pMember = new AstMember(pType, pDecl->getName(), pScope);
    2779             : 
    2780       53781 :                                 if ( !pDecl->checkType($1) )
    2781             :                                 {
    2782             :                                         // WARNING      
    2783             :                                 }
    2784             : 
    2785       53781 :                                 pScope->addDeclaration(pMember);
    2786       53781 :                                 iter++;
    2787       53781 :                                 delete pDecl;
    2788             :                         }
    2789       53781 :                         delete pList;
    2790             :                 }
    2791             :         }
    2792       53781 :         | error ';' 
    2793             :         {
    2794           0 :                 yyerror("member definition");
    2795           0 :                 yyerrok;
    2796             :         }
    2797           0 :         ;
    2798             : 
    2799             : type_or_parameter:
    2800             :     fundamental_type
    2801             :         | scoped_name opt_type_args
    2802             :         {
    2803        8282 :         AstDeclaration const * decl = 0;
    2804        8282 :         AstStruct * scope = static_cast< AstStruct * >(idlc()->scopes()->top());
    2805        8282 :         if (scope != 0 && $2 == 0) {
    2806        8276 :             decl = scope->findTypeParameter(*$1);
    2807             :         }
    2808        8282 :         if (decl != 0) {
    2809          69 :             delete $1;
    2810          69 :             delete $2;
    2811             :         } else {
    2812        8213 :             decl = createNamedType($1, $2);
    2813        8213 :             if (scope != 0 && includes(decl, scopeAsDecl(scope))) {
    2814             :                 idlc()->error()->error1(
    2815           0 :                     EIDL_RECURSIVE_TYPE, scopeAsDecl(scope));
    2816           0 :                 decl = 0;
    2817             :             }
    2818             :         }
    2819        8282 :         $$ = decl;
    2820             :         }
    2821        8282 :     ;
    2822             : 
    2823             : enum_type :
    2824             :         IDL_ENUM
    2825             :         {
    2826        4597 :                 idlc()->setParseState(PS_EnumSeen);
    2827             :         }
    2828        4597 :         identifier
    2829             :         {
    2830        4597 :         idlc()->setParseState(PS_EnumIDSeen);
    2831        4597 :         checkIdentifier($3);
    2832             : 
    2833        4597 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
    2834        4597 :                 AstEnum*                pEnum = NULL;
    2835             : 
    2836             :                 /*
    2837             :                  * Create a node representing an enum and add it to its
    2838             :                  * enclosing scope
    2839             :                  */
    2840        4597 :                 if (pScope != NULL) 
    2841             :                 {
    2842        4597 :                         pEnum = new AstEnum(*$3, pScope);
    2843             :                         /*
    2844             :                          * Add it to its defining scope
    2845             :                          */
    2846        4597 :                         pScope->addDeclaration(pEnum);
    2847             :                 }
    2848        4597 :                 delete $3;
    2849             :                 /*
    2850             :                  * Push the enum scope on the scopes stack
    2851             :                  */
    2852        4597 :                 idlc()->scopes()->push(pEnum);
    2853             :                 
    2854             :         }
    2855        4597 :         '{'
    2856             :         {
    2857        4597 :                 idlc()->setParseState(PS_EnumSqSeen);
    2858             :         }
    2859        4597 :         at_least_one_enumerator
    2860             :         {
    2861        4597 :                 idlc()->setParseState(PS_EnumBodySeen);
    2862             :         }
    2863        4597 :         '}'
    2864             :         {
    2865        4597 :                 idlc()->setParseState(PS_EnumQsSeen);
    2866             :                 /*
    2867             :                  * Done with this enum. Pop its scope from the scopes stack
    2868             :                  */
    2869        4597 :                 if (idlc()->scopes()->top() == NULL)
    2870           0 :                         $$ = NULL;
    2871             :                 else 
    2872             :                 {
    2873        4597 :                         $$ = (AstEnum*)idlc()->scopes()->topNonNull();
    2874        4597 :                         idlc()->scopes()->pop();
    2875             :                 }
    2876             :         }
    2877        4597 :         ;
    2878             : 
    2879             : at_least_one_enumerator : enumerator enumerators ;
    2880             : 
    2881             : enumerators : 
    2882             :         enumerators
    2883             :         ','
    2884             :         {
    2885       59477 :                 idlc()->setParseState(PS_EnumCommaSeen);
    2886             :         }
    2887       59477 :         enumerator
    2888             :         | /* EMPTY */
    2889             :         | error ',' 
    2890             :         {
    2891           0 :                 yyerror("enumerator definition");
    2892           0 :                 yyerrok;
    2893             :         }
    2894           0 :         ;
    2895             : 
    2896             : enumerator :
    2897             :         identifier
    2898             :         {
    2899       63608 :         checkIdentifier($1);
    2900             : 
    2901       63608 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
    2902       63608 :                 AstEnum*                pEnum = NULL;
    2903       63608 :                 AstConstant*    pEnumVal = NULL;
    2904             : 
    2905       63608 :                 if ( pScope && pScope->getScopeNodeType() == NT_enum) 
    2906             :                 {
    2907       63608 :                         pEnum = (AstEnum*)pScope;
    2908       63608 :                         if (pEnum && $1)
    2909             :                         {
    2910       63608 :                                 AstExpression* pExpr = new AstExpression(pEnum->getEnumValueCount());
    2911             :                                 pEnumVal = new AstConstant(ET_long , NT_enum_val, 
    2912       63608 :                                                                                    pExpr, *$1, pScope);
    2913             :                         }
    2914       63608 :                         if ( pEnum->checkValue(pEnumVal->getConstValue()) )
    2915           0 :                                 idlc()->error()->error1(EIDL_EVAL_ERROR, pEnum);                          
    2916             : 
    2917       63608 :                         pScope->addDeclaration(pEnumVal);
    2918             :                 }
    2919       63608 :                 delete $1;
    2920             :         }
    2921       63608 :         | identifier
    2922             :         '='
    2923             :         const_expr
    2924             :         {
    2925         466 :         checkIdentifier($1);
    2926             : 
    2927         466 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
    2928         466 :                 AstEnum*                pEnum = NULL;
    2929         466 :                 AstConstant*    pEnumVal = NULL;
    2930             : 
    2931         466 :                 if ( $3 && pScope && pScope->getScopeNodeType() == NT_enum) 
    2932             :                 {
    2933         466 :                         $3->evaluate(EK_const);
    2934         466 :                         if ( $3->coerce(ET_long) )
    2935             :                         {
    2936         466 :                                 pEnum = (AstEnum*)pScope;
    2937         466 :                                 if (pEnum)
    2938             :                                 {
    2939             :                                         pEnumVal = new AstConstant(ET_long , NT_enum_val, 
    2940         466 :                                                                                            $3, *$1, pScope);
    2941             :                                 }
    2942         466 :                                 if ( pEnum->checkValue(pEnumVal->getConstValue()) )
    2943           0 :                                         idlc()->error()->error1(EIDL_EVAL_ERROR, pEnum);                          
    2944             : 
    2945         466 :                                 pScope->addDeclaration(pEnumVal);
    2946             :                         } else
    2947             :                         {
    2948           0 :                                 idlc()->error()->coercionError($3, ET_long);
    2949           0 :                                 delete $3;
    2950             :                         }
    2951             :                 }
    2952         466 :                 delete $1;
    2953             :         }
    2954         466 :         ;
    2955             : 
    2956             : union_type :
    2957             :         IDL_UNION
    2958             :         {
    2959           0 :                 idlc()->setParseState(PS_UnionSeen);
    2960             :         }
    2961           0 :         identifier
    2962             :         {
    2963           0 :         idlc()->setParseState(PS_UnionIDSeen);
    2964           0 :         checkIdentifier($3);
    2965             :         }
    2966           0 :         IDL_SWITCH
    2967             :         {
    2968           0 :                 idlc()->setParseState(PS_SwitchSeen);
    2969             :         }
    2970           0 :         '('
    2971             :         {
    2972           0 :                 idlc()->setParseState(PS_SwitchOpenParSeen);
    2973             :         }
    2974           0 :         switch_type_spec
    2975             :         {
    2976           0 :                 idlc()->setParseState(PS_SwitchTypeSeen);
    2977             :         }
    2978           0 :         ')'
    2979             :         {
    2980           0 :                 idlc()->setParseState(PS_SwitchCloseParSeen);
    2981             : 
    2982           0 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
    2983           0 :                 AstUnion*               pUnion = NULL;
    2984             : 
    2985             :                 /*
    2986             :                  * Create a node representing a union. Add it to its enclosing
    2987             :                  * scope
    2988             :                  */
    2989           0 :                 if ( $9 && pScope ) 
    2990             :                 {
    2991           0 :                         AstType* pType = (AstType*)$9;
    2992           0 :                         if ( !pType) 
    2993             :                         {
    2994           0 :                                 idlc()->error()->noTypeError($9);
    2995             :                         } else 
    2996             :                         {
    2997           0 :                                 pUnion = new AstUnion(*$3, pType, pScope);
    2998           0 :                                 pScope->addDeclaration(pUnion);
    2999             :                         }
    3000             :                 }
    3001           0 :                 delete $3;
    3002             :                 /*
    3003             :                  * Push the scope of the union on the scopes stack
    3004             :                  */
    3005           0 :                 idlc()->scopes()->push(pUnion);
    3006             :         }
    3007           0 :         '{'
    3008             :         {
    3009           0 :                 idlc()->setParseState(PS_UnionSqSeen);
    3010             :         }
    3011           0 :         at_least_one_case_branch
    3012             :         {
    3013           0 :                 idlc()->setParseState(PS_UnionBodySeen);
    3014             :         }
    3015           0 :         '}'
    3016             :         {
    3017           0 :                 idlc()->setParseState(PS_UnionQsSeen);
    3018             :                 /* this union is finished, pop its scope from the stack */ 
    3019           0 :                 idlc()->scopes()->pop();
    3020             :         }
    3021           0 :         ;
    3022             : 
    3023             : switch_type_spec :
    3024             :         integer_type
    3025             :         {       
    3026           0 :                 $$ = idlc()->scopes()->bottom()->lookupPrimitiveType($1);
    3027             :         }
    3028           0 :         | char_type
    3029             :         {
    3030           0 :                 $$ = idlc()->scopes()->bottom()->lookupPrimitiveType($1);
    3031             :         }
    3032           0 :         | boolean_type
    3033             :         {
    3034           0 :                 $$ = idlc()->scopes()->bottom()->lookupPrimitiveType($1);
    3035             :         }
    3036           0 :         | enum_type
    3037             :         | scoped_name
    3038             :         {
    3039           0 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
    3040           0 :                 AstBaseType*    pBaseType = NULL;
    3041           0 :         AstDeclaration const * pDecl = NULL;
    3042           0 :                 AstTypeDef*             pTypeDef = NULL;
    3043           0 :                 sal_Bool                bFound = sal_False;
    3044             :                 /*
    3045             :                  * If the constant's type is a scoped name, it must resolve
    3046             :                  * to a scalar constant type
    3047             :                  */
    3048           0 :                 if ( pScope && (pDecl = pScope->lookupByName(*$1)) ) 
    3049             :                 {
    3050             :                         /*
    3051             :                          * Look through typedefs
    3052             :                          */
    3053           0 :                         while ( !bFound ) 
    3054             :                         {
    3055           0 :                                 switch (pDecl->getNodeType()) 
    3056             :                                 {
    3057             :                                         case NT_enum:
    3058           0 :                                                 $$ = pDecl;
    3059           0 :                                                 bFound = sal_True;
    3060           0 :                                                 break;
    3061             :                                         case NT_predefined:
    3062           0 :                                                 pBaseType = (AstBaseType*)pDecl;
    3063           0 :                                                 if ( pBaseType ) 
    3064             :                                                 {
    3065           0 :                                                         switch (pBaseType->getExprType()) 
    3066             :                                                         {
    3067             :                                                                 case ET_short:
    3068             :                                                                 case ET_ushort:
    3069             :                                                                 case ET_long:
    3070             :                                                                 case ET_ulong:
    3071             :                                                                 case ET_hyper:
    3072             :                                                                 case ET_uhyper:
    3073             :                                                                 case ET_char:
    3074             :                                                                 case ET_byte:
    3075             :                                                                 case ET_boolean:
    3076           0 :                                                                         $$ = pBaseType;
    3077           0 :                                                                         bFound = sal_True;
    3078           0 :                                                                         break;
    3079             :                                                                 default:
    3080           0 :                                                                         $$ = NULL;
    3081           0 :                                                                         bFound = sal_True;
    3082           0 :                                                                         break;
    3083             :                                                         }
    3084             :                                                 }
    3085           0 :                                                 break;
    3086             :                                         case NT_typedef:
    3087           0 :                                                 pTypeDef = (AstTypeDef*)pDecl;
    3088           0 :                                                 if ( pTypeDef )
    3089           0 :                                                         pDecl = pTypeDef->getBaseType();
    3090           0 :                                                 break;
    3091             :                                         default:
    3092           0 :                                                 $$ = NULL;
    3093           0 :                                                 bFound = sal_True;
    3094           0 :                                break;           
    3095             :                                 }
    3096             :                         }
    3097             :                 } else
    3098           0 :                         $$ = NULL;
    3099             : 
    3100           0 :                 if ($$ == NULL)
    3101           0 :                         idlc()->error()->lookupError(*$1);
    3102             :         }
    3103           0 :         ;
    3104             : 
    3105             : at_least_one_case_branch : case_branch case_branches ;
    3106             : 
    3107             : case_branches : 
    3108             :         case_branches case_branch
    3109             :         | /* EMPTY */
    3110             :         ;
    3111             : 
    3112             : case_branch :
    3113             :         at_least_one_case_label
    3114             :         {
    3115           0 :                 idlc()->setParseState(PS_UnionLabelSeen);
    3116             :         }
    3117           0 :         element_spec
    3118             :         {
    3119           0 :                 idlc()->setParseState(PS_UnionElemSeen);
    3120             : 
    3121           0 :                 AstScope*               pScope = idlc()->scopes()->topNonNull();
    3122           0 :                 AstUnionLabel*  pLabel = NULL;
    3123           0 :                 AstUnionBranch* pBranch = NULL;
    3124           0 :                 AstMember*              pMember = $3;
    3125             : 
    3126             :                 /*
    3127             :                  * Create several nodes representing branches of a union.
    3128             :                  * Add them to the enclosing scope (the union scope)
    3129             :                  */
    3130           0 :                 if ( pScope && $1 && $3 ) 
    3131             :                 {
    3132           0 :                         LabelList::iterator iter = $1->begin();
    3133           0 :                         LabelList::iterator end = $1->end();
    3134           0 :                         for (;iter != end; iter++) 
    3135             :                         {
    3136           0 :                                 pLabel = *iter;
    3137           0 :                                 if ( !pLabel )
    3138             :                                 {
    3139           0 :                                         iter++;
    3140           0 :                                         continue;
    3141             :                                 }
    3142             :                                 pBranch = new AstUnionBranch(pLabel, pMember->getType(),
    3143           0 :                                                  pMember->getLocalName(), pScope);
    3144           0 :                                 pScope->addDeclaration(pBranch);
    3145             :                         }
    3146             :                 }
    3147           0 :                 if ( $1 ) delete($1);
    3148             :         }
    3149           0 :         ;
    3150             : 
    3151             : at_least_one_case_label :
    3152             :         case_label case_labels
    3153             :         {
    3154           0 :                 if ( $2 )
    3155             :                 {
    3156           0 :                         $2->push_front($1);
    3157           0 :                         $$ = $2;
    3158             :                 } else
    3159             :                 {
    3160           0 :                         LabelList* pLabels = new LabelList();
    3161           0 :                         pLabels->push_back($1);
    3162           0 :                         $$ = pLabels;
    3163             :                 }
    3164             :         }
    3165           0 :         ;
    3166             : 
    3167             : case_labels : 
    3168             :         case_labels case_label
    3169             :         {
    3170           0 :                 if ( $1 )
    3171             :                 {
    3172           0 :                         $1->push_back($2);
    3173           0 :                         $$ = $1;
    3174             :                 } else
    3175             :                 {
    3176           0 :                         LabelList* pLabels = new LabelList();
    3177           0 :                         pLabels->push_back($2);
    3178           0 :                         $$ = pLabels;
    3179             :                 }
    3180             :         }
    3181           0 :         | /* EMPTY */
    3182             :         {
    3183           0 :                 $$ = NULL;
    3184             :         }
    3185           0 :         ;
    3186             : 
    3187             : case_label : 
    3188             :         IDL_DEFAULT
    3189             :         {
    3190           0 :                 idlc()->setParseState(PS_DefaultSeen);
    3191             :         }
    3192           0 :         ':'
    3193             :         {
    3194           0 :                 idlc()->setParseState(PS_LabelColonSeen);
    3195           0 :                 $$ = new AstUnionLabel(UL_default, NULL);
    3196             :         }
    3197           0 :         | IDL_CASE
    3198             :         {
    3199           0 :                 idlc()->setParseState(PS_CaseSeen);
    3200             :         }
    3201           0 :         const_expr
    3202             :         {
    3203           0 :                 idlc()->setParseState(PS_LabelExprSeen);
    3204             :         }
    3205           0 :         ':'
    3206             :         {
    3207           0 :                 idlc()->setParseState(PS_LabelColonSeen);
    3208           0 :                 $$ = new AstUnionLabel(UL_label, $3);
    3209             :         }
    3210           0 :         ;
    3211             : 
    3212             : element_spec :
    3213             :         type_spec
    3214             :         {
    3215           0 :                 idlc()->setParseState(PS_UnionElemTypeSeen);
    3216             :         }
    3217           0 :         declarator
    3218             :         {
    3219           0 :                 idlc()->setParseState(PS_UnionElemDeclSeen);
    3220             :         }
    3221           0 :         ';'
    3222             :         {
    3223           0 :                 idlc()->setParseState(PS_UnionElemCompleted);
    3224             : 
    3225           0 :                 AstScope* pScope = idlc()->scopes()->topNonNull();
    3226             :                 /*
    3227             :                  * Check for illegal recursive use of type
    3228             :                  */
    3229             : //              if ( $1 && AST_illegal_recursive_type($1))
    3230             : //                      idlc()->error()->error1(EIDL_RECURSIVE_TYPE, $1);
    3231             :                 /*
    3232             :                  * Create a field in a union branch
    3233             :                  */
    3234           0 :                 if ( $1 && $3 )
    3235             :                 {
    3236           0 :             AstType const * pType = $3->compose($1);
    3237           0 :                         if ( !pType )
    3238           0 :                                 $$ = NULL;
    3239             :                         else
    3240           0 :                                 $$ = new AstMember(pType, $3->getName(), pScope);
    3241             :                 } else
    3242           0 :                         $$ = NULL;
    3243             :                 
    3244           0 :                 if ( $3 ) delete $3;
    3245             :         }
    3246           0 :         | error
    3247             :         ';'
    3248             :         {
    3249           0 :                 $$ = NULL;
    3250             :         }
    3251           0 :         ;
    3252             : 
    3253             : identifier:
    3254             :     IDL_IDENTIFIER
    3255           7 :     | IDL_GET { $$ = new OString("get"); }
    3256           7 :     | IDL_SET { $$ = new OString("set"); }
    3257           4 :     | IDL_PUBLISHED { $$ = new OString("published"); }
    3258           0 :     ;
    3259             : 
    3260             : %%
    3261             : 
    3262             : /*
    3263             :  * Report an error situation discovered in a production
    3264             :  */
    3265           0 : void yyerror(char const *errmsg)
    3266             : {
    3267           0 :         idlc()->error()->syntaxError(idlc()->getParseState(), idlc()->getLineNumber(), errmsg);
    3268           0 :         idlc()->setParseState(PS_NoState);
    3269           0 : }

Generated by: LCOV version 1.10