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

Generated by: LCOV version 1.10