LCOV - code coverage report
Current view: top level - libreoffice/rsc/source/parser - rscyacc.y (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 307 609 50.4 %
Date: 2012-12-27 Functions: 7 7 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : %{
       2             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       3             : /*
       4             :  * This file is part of the LibreOffice project.
       5             :  *
       6             :  * This Source Code Form is subject to the terms of the Mozilla Public
       7             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       8             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       9             :  *
      10             :  * This file incorporates work covered by the following license notice:
      11             :  *
      12             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      13             :  *   contributor license agreements. See the NOTICE file distributed
      14             :  *   with this work for additional information regarding copyright
      15             :  *   ownership. The ASF licenses this file to you under the Apache
      16             :  *   License, Version 2.0 (the "License"); you may not use this file
      17             :  *   except in compliance with the License. You may obtain a copy of
      18             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      19             :  */
      20             : 
      21             : #include <stdio.h>
      22             : #include <ctype.h>
      23             : #include <string.h>
      24             : 
      25             : #include <rtl/strbuf.hxx>
      26             : #include <tools/rc.h>
      27             : #include <rscerror.h>
      28             : #include <rsctools.hxx>
      29             : #include <rscclass.hxx>
      30             : #include <rsccont.hxx>
      31             : #include <rsctree.hxx>
      32             : #include <rscdb.hxx>
      33             : #include <rscdef.hxx>
      34             : #include <rscpar.hxx>
      35             : 
      36             : #include <rsclex.hxx>
      37             : 
      38             : /************** V a r i a b l e n ****************************************/
      39         691 : ObjectStack                     S;
      40             : RscTop *                        pCurClass;
      41             : sal_uInt32                      nCurMask;
      42             : char                            szErrBuf[ 100 ];
      43             : 
      44             : /************** H i l f s F u n k t i o n e n ****************************/
      45      102021 : RSCINST GetVarInst( const RSCINST & rInst, const char * pVarName )
      46             : {
      47      102021 :     RSCINST aInst;
      48             : 
      49             :     aInst = rInst.pClass->GetVariable( rInst, pHS->getID( pVarName ),
      50      102021 :                                        RSCINST() );
      51             : 
      52      102021 :     if( !aInst.pData )
      53           0 :         pTC->pEH->Error( ERR_NOVARIABLENAME, rInst.pClass, RscId() );
      54             : 
      55      102021 :     return( aInst );
      56             : }
      57             : 
      58       68016 : void SetNumber( const RSCINST & rInst, const char * pVarName, sal_Int32 lValue )
      59             : {
      60       68016 :     RSCINST aInst;
      61             : 
      62       68016 :     aInst = GetVarInst( rInst, pVarName );
      63             : 
      64       68016 :     if( aInst.pData ){
      65       68016 :         ERRTYPE aError;
      66       68016 :         aError = aInst.pClass->SetNumber( aInst, lValue );
      67             : 
      68       68016 :         if( aError.IsError() )
      69           0 :             pTC->pEH->Error( aError, aInst.pClass, RscId() );
      70             :     }
      71       68016 : }
      72             : 
      73       34004 : void SetConst( const RSCINST & rInst, const char * pVarName,
      74             :                Atom nValueId, sal_Int32 nVal )
      75             : {
      76       34004 :     RSCINST aInst;
      77             : 
      78       34004 :     aInst = GetVarInst( rInst, pVarName );
      79       34004 :     if( aInst.pData )
      80             :     {
      81       34004 :         ERRTYPE aError;
      82       34004 :         aError = aInst.pClass->SetConst( aInst, nValueId, nVal );
      83             : 
      84       34004 :         if( aError.IsError() )
      85           0 :             pTC->pEH->Error( aError, aInst.pClass, RscId() );
      86             :     }
      87       34004 : }
      88             : 
      89           1 : void SetString( const RSCINST & rInst, const char * pVarName, const char * pStr )
      90             : {
      91           1 :     RSCINST aInst;
      92             : 
      93           1 :     aInst = GetVarInst( rInst, pVarName );
      94           1 :     if( aInst.pData ){
      95           1 :         ERRTYPE aError;
      96           1 :         aError = aInst.pClass->SetString( aInst, pStr );
      97             : 
      98           1 :         if( aError.IsError() )
      99           0 :             pTC->pEH->Error( aError, aInst.pClass, RscId() );
     100             :     }
     101           1 : }
     102             : 
     103      119850 : RscId MakeRscId( RscExpType aExpType )
     104             : {
     105      119850 :     if( !aExpType.IsNothing() )
     106             :     {
     107       48240 :         sal_Int32 lValue(0);
     108             : 
     109       48240 :         if( !aExpType.Evaluate( &lValue ) )
     110           0 :             pTC->pEH->Error( ERR_ZERODIVISION, NULL, RscId() );
     111       48240 :         if( lValue < 1 || lValue > (sal_Int32)0x7FFF )
     112             :         {
     113             :             pTC->pEH->Error( ERR_IDRANGE, NULL, RscId(),
     114           0 :                              rtl::OString::valueOf(lValue).getStr() );
     115             :         }
     116             : 
     117       48240 :         if( aExpType.IsDefinition() )
     118           0 :             return RscId( aExpType.aExp.pDef );
     119             :         else
     120       48240 :             return RscId( lValue );
     121             :     }
     122       71610 :     return RscId();
     123             : }
     124             : 
     125       59925 : sal_Bool DoClassHeader( RSCHEADER * pHeader, sal_Bool bMember )
     126             : {
     127       59925 :     RSCINST aCopyInst;
     128       59925 :     RscId aName1 = MakeRscId( pHeader->nName1 );
     129       59925 :     RscId aName2 = MakeRscId( pHeader->nName2 );
     130             : 
     131       59925 :     if( pHeader->pRefClass )
     132           0 :         aCopyInst.pClass = pHeader->pRefClass;
     133             :     else
     134       59925 :         aCopyInst.pClass = pHeader->pClass;
     135             : 
     136       59925 :     if( TYPE_COPY == pHeader->nTyp )
     137             :     {
     138           9 :         ObjNode * pCopyObj = aCopyInst.pClass->GetObjNode( aName2 );
     139             : 
     140           9 :         if( !pCopyObj )
     141             :         {
     142           0 :             rtl::OStringBuffer aMsg( pHS->getString( aCopyInst.pClass->GetId() ) );
     143           0 :             aMsg.append(' ');
     144           0 :             aMsg.append(aName2.GetName());
     145             :             pTC->pEH->Error( ERR_NOCOPYOBJ, pHeader->pClass, aName1,
     146           0 :                              aMsg.getStr() );
     147             :         }
     148             :         else
     149           9 :             aCopyInst.pData = pCopyObj->GetRscObj();
     150             :     }
     151             : 
     152       59925 :     if( bMember )
     153             :     {
     154             :         // Angabe von Superklassen oder abgeleiteten Klassen ist jetzt erlaubt
     155        2771 :         if( S.Top().pClass->InHierarchy( pHeader->pClass )
     156           0 :           ||  pHeader->pClass->InHierarchy( S.Top().pClass) )
     157             :         {
     158        2771 :             if( aCopyInst.IsInst() )
     159             :             {
     160           0 :                 RSCINST aTmpI( S.Top() );
     161           0 :                 aTmpI.pClass->Destroy( aTmpI );
     162           0 :                 aTmpI.pClass->Create( &aTmpI, aCopyInst );
     163             :             }
     164             :         }
     165             :         else
     166           0 :             pTC->pEH->Error( ERR_FALSETYPE, S.Top().pClass, aName1,
     167           0 :                              pHS->getString( pHeader->pClass->GetId() ).getStr() );
     168             :     }
     169             :     else
     170             :     {
     171       57154 :         if( S.IsEmpty() )
     172             :         {
     173       18856 :             if( (sal_Int32)aName1 < 256 )
     174           0 :                 pTC->pEH->Error( WRN_GLOBALID, pHeader->pClass, aName1 );
     175             : 
     176       18856 :             if( aCopyInst.IsInst() )
     177           9 :                 S.Push( pHeader->pClass->Create( NULL, aCopyInst ) );
     178             :             else
     179       18847 :                 S.Push( pHeader->pClass->Create( NULL, RSCINST() ) );
     180             : 
     181       18856 :             ObjNode * pNode = new ObjNode( aName1, S.Top().pData,
     182       18856 :                                            pFI->GetFileIndex() );
     183       18856 :             pTC->pEH->StdOut( ".", RscVerbosityVerbose );
     184             : 
     185       18856 :             if( !aName1.IsId() )
     186           0 :                 pTC->pEH->Error( ERR_IDEXPECTED, pHeader->pClass, aName1 );
     187       18856 :             else if( !pHeader->pClass->PutObjNode( pNode ) )
     188           0 :                 pTC->pEH->Error( ERR_DOUBLEID, pHeader->pClass, aName1 );
     189             :         }
     190             :         else
     191             :         {
     192       38298 :             RSCINST aTmpI;
     193       38298 :             ERRTYPE aError;
     194             : 
     195       38298 :             if( (sal_Int32)aName1 >= 256 && aName1.IsId() )
     196        3534 :                 pTC->pEH->Error( WRN_LOCALID, pHeader->pClass, aName1 );
     197       76596 :             aError = S.Top().pClass->GetElement( S.Top(), aName1,
     198       76596 :                                                  pHeader->pClass, aCopyInst, &aTmpI );
     199             : 
     200       38298 :             if( aError.IsWarning() )
     201           0 :                 pTC->pEH->Error( aError, pHeader->pClass, aName1 );
     202       38298 :             else if( aError.IsError() )
     203             :             {
     204           0 :                 if( ERR_CONT_INVALIDTYPE == aError )
     205           0 :                     pTC->pEH->Error( aError, S.Top().pClass, aName1,
     206           0 :                                      pHS->getString( pHeader->pClass->GetId() ).getStr() );
     207             :                 else
     208           0 :                     pTC->pEH->Error( aError, S.Top().pClass, aName1 );
     209           0 :                 S.Top().pClass->GetElement( S.Top(), RscId(),
     210           0 :                                             pHeader->pClass, RSCINST(), &aTmpI );
     211             : 
     212           0 :                 if( !aTmpI.IsInst() )
     213           0 :                     return( sal_False );
     214             :             }
     215       38298 :             S.Push( aTmpI );
     216             :         }
     217             :     }
     218       59925 :     if( TYPE_REF == pHeader->nTyp )
     219             :     {
     220           9 :         ERRTYPE aError;
     221             : 
     222           9 :         aError = S.Top().pClass->SetRef( S.Top(), aName2 );
     223           9 :         pTC->pEH->Error( aError, S.Top().pClass, aName1 );
     224             :     }
     225             : 
     226       59925 :     return( sal_True );
     227             : }
     228             : 
     229         166 : RSCINST GetFirstTupelEle( const RSCINST & rTop )
     230             : { // Aufwaertskompatible, Tupel probieren
     231         166 :     RSCINST aInst;
     232         166 :     ERRTYPE aErr;
     233             : 
     234         166 :     aErr = rTop.pClass->GetElement( rTop, RscId(), NULL, RSCINST(), &aInst );
     235         166 :     if( !aErr.IsError() )
     236         166 :         aInst = aInst.pClass->GetTupelVar( aInst, 0, RSCINST() );
     237         166 :     return aInst;
     238             : }
     239             : 
     240             : /************** Y a c c   C o d e ****************************************/
     241             : //#define YYDEBUG 1
     242             : 
     243             : #define TYPE_Atom             0
     244             : #define TYPE_RESID                1
     245             : 
     246             : #ifdef UNX
     247             : #define YYMAXDEPTH              2000
     248             : #else
     249             : #define YYMAXDEPTH              800
     250             : #endif
     251             : 
     252             : #if defined _MSC_VER
     253             : #pragma warning(push, 1)
     254             : #pragma warning(disable:4129 4273 4701 4702)
     255             : #endif
     256             : #if defined __GNUC__
     257             : #define GCC_VERSION (__GNUC__ * 10000 \
     258             :                      + __GNUC_MINOR__ * 100 \
     259             :                      + __GNUC_PATCHLEVEL__)
     260             : /* Diagnostics pragma was introduced with gcc-4.2.1 */
     261             : #if GCC_VERSION >= 40201
     262             : #pragma GCC diagnostic ignored "-Wwrite-strings"
     263             : #endif
     264             : #elif defined __SUNPRO_CC
     265             : #pragma disable_warn
     266             : #endif
     267             : %}
     268             : 
     269             : /* Compilerstack */
     270             : 
     271             : %union {
     272             :         Atom                    varid;
     273             :         struct {
     274             :                 Atom                    hashid;
     275             :                 sal_Int32                       nValue;
     276             :         }                               constname;
     277             :         RscTop *                pClass;
     278             :         RSCHEADER               header;
     279             :         struct {
     280             :                 CLASS_DATA      pData;
     281             :                 RscTop *        pClass;
     282             :         }                               instance;
     283             :         sal_Int32                       value;
     284             :         sal_uInt16                      ushort;
     285             :         short                   exp_short;
     286             :         char *                  string;
     287             :         sal_Bool                        svbool;
     288             :         REF_ENUM                copyref;
     289             :         RscDefine         * defineele;
     290             :         CharSet                 charset;
     291             :         RscExpType              macrostruct;
     292             : }
     293             : 
     294             : /* Token */
     295             : %token <value>                    NUMBER
     296             : %token <string>           SYMBOL
     297             : %token <defineele>                RSCDEFINE
     298             : %token <string>           STRING
     299             : %token <string>           INCLUDE_STRING
     300             : %token <character>                CHARACTER
     301             : %token <svbool>           BOOLEAN
     302             : 
     303             : %token LINE
     304             : %token AUTO_ID
     305             : %token NOT
     306             : %token XSCALE
     307             : %token YSCALE
     308             : %token RGB
     309             : %token GEOMETRY
     310             : %token POSITION
     311             : %token DIMENSION
     312             : %token INZOOMOUTPUTSIZE
     313             : %token FLOATINGPOS
     314             : %token DEFINE
     315             : %token INCLUDE
     316             : %token MACROTARGET
     317             : %token DEFAULT
     318             : 
     319             : 
     320             : %token <pClass>           CLASSNAME
     321             : %token <varid>                    VARNAME
     322             : %token <constname>                CONSTNAME
     323             : %token CLASS
     324             : %token EXTENDABLE
     325             : %token WRITEIFSET
     326             : 
     327             : 
     328             : %type  <macrostruct>      macro_expression
     329             : %type  <macrostruct>      id_expression
     330             : %type  <value>                    long_expression
     331             : %type  <string>           string_multiline
     332             : 
     333             : %type  <pClass>           type
     334             : %type  <pClass>           type_base
     335             : %type  <header>           class_header_body
     336             : %type  <header>           class_header
     337             : %type  <header>           var_header_class
     338             : %type  <copyref>          copy_ref
     339             : %type  <ushort>           type_flags
     340             : 
     341             : 
     342             : %left '|'
     343             : %left '&'
     344             : %left LEFTSHIFT RIGHTSHIFT
     345             : %left '+' '-'
     346             : %left '*' '/'
     347             : %left UNARYMINUS
     348             : %left UNARYPLUS
     349             : %left ','
     350             : %left '(' ')'
     351             : 
     352             : 
     353             : /*      Grammatik  */
     354             : 
     355             : %start resource_definitions
     356             : 
     357             : %%
     358             : 
     359             : /********************** D E F I N I T I O N S ****************************/
     360             : resource_definitions
     361             :   :
     362             :   | resource_definitions resource_definition
     363             :   | MACROTARGET macro_expression
     364             :         {
     365             :                 RscExpType              aExpType;
     366             :                 sal_Int32                       lValue;
     367             : 
     368           0 :                 aExpType.cType = RSCEXP_NOTHING;
     369           0 :                 pExp = new RscExpression( aExpType, '+', $2 );
     370           0 :                 if( !pExp->Evaluate( &lValue ) )
     371           0 :                         pTC->pEH->Error( ERR_ZERODIVISION, NULL, RscId() );
     372             :         }
     373           0 :   ;
     374             : 
     375             : resource_definition
     376             :   : line_number
     377             :   | '#' DEFINE SYMBOL macro_expression
     378             :         {
     379           0 :                 sal_Bool                bError = sal_False;
     380             : 
     381           0 :                 if( $4.IsNumber() ){
     382           0 :                         if( !pTC->aFileTab.NewDef( pFI->GetFileIndex(),
     383           0 :                                                                            rtl::OString( $3 ),
     384           0 :                                                                            $4.GetLong(), ULONG_MAX ) )
     385           0 :                                 bError = sal_True;
     386             :                 }
     387           0 :                 else if( $4.IsDefinition() ){
     388             :                         RscExpType              aExpType;
     389             :                         RscExpression * pExpr;
     390             : 
     391           0 :                         aExpType.cType = RSCEXP_NOTHING;
     392           0 :                         aExpType.SetLong( 0 );
     393           0 :                         aExpType.cType = RSCEXP_LONG;
     394           0 :                         pExpr = new RscExpression( aExpType, '+', $4 );
     395             : 
     396           0 :                         if( !pTC->aFileTab.NewDef( pFI->GetFileIndex(),
     397           0 :                                                                            rtl::OString( $3 ), pExpr, ULONG_MAX ) )
     398           0 :                                 bError = sal_True;
     399             :                 }
     400           0 :                 else if( $4.IsExpression() ){
     401           0 :                         if( !pTC->aFileTab.NewDef( pFI->GetFileIndex(),
     402           0 :                                                                            rtl::OString( $3 ), $4.aExp.pExp,
     403           0 :                                                                            ULONG_MAX ) )
     404           0 :                                 bError = sal_True;
     405             :                 }
     406             : 
     407           0 :                 if( bError ){
     408           0 :                         pTC->pEH->Error( ERR_DECLAREDEFINE, NULL, RscId(), $3 );
     409             :                 }
     410             :         }
     411           0 :   | '#' DEFINE RSCDEFINE macro_expression
     412             :         {
     413           0 :                 pTC->pEH->Error( ERR_DOUBLEDEFINE, NULL, RscId(), $3->GetName().getStr() );
     414             :         }
     415           0 :   | '#' INCLUDE STRING
     416             :         {
     417             :         }
     418           0 :   | '#' INCLUDE INCLUDE_STRING
     419             :         {
     420             :         }
     421           0 :   | class_definition ';'
     422             :         {
     423             : #ifdef D40
     424             :                         void * pMem;
     425             :                         pMem = rtl_allocateMemory( 20000 );
     426             :                         rtl_freeMemory( pMem );
     427             : #endif
     428             :         }
     429       18856 :   | new_class_definition_header '{' new_class_definition_body '}' ';'
     430             :   | new_class_definition_header ';'
     431             :   ;
     432             : 
     433             : new_class_definition_header
     434             :   : CLASS SYMBOL id_expression ':' CLASSNAME
     435             :         {
     436             :                 sal_Int32       lType;
     437             : 
     438           0 :                 $3.Evaluate( &lType );
     439             : 
     440             :                 // Klasse anlegen
     441           0 :                 Atom nId = pHS->getID( $2 );
     442           0 :                 pCurClass = new RscClass( nId, lType, $5 );
     443           0 :                 nCurMask = 1;
     444           0 :                 pTC->aNmTb.Put( nId, CLASSNAME, pCurClass );
     445           0 :                 pTC->GetRoot()->Insert( pCurClass );
     446             :         }
     447           0 :   | CLASS CLASSNAME id_expression ':' CLASSNAME
     448             :         {
     449           0 :                 pCurClass = $2;
     450           0 :                 nCurMask = 1;
     451             :         }
     452           0 :   ;
     453             : 
     454             : new_class_definition_body
     455             :   :
     456             :   | property_definition ';' new_class_definition_body
     457             :   ;
     458             : 
     459             : property_definition
     460             :   : type_flags type SYMBOL
     461             :   {
     462             :         // Variable anlegen
     463           0 :         Atom nId = pTC->aNmTb.Put( $3, VARNAME );
     464           0 :         pCurClass->SetVariable( nId, $2, NULL, $1, nCurMask );
     465           0 :         nCurMask <<= 1;
     466             :   }
     467           0 :   | type_flags type VARNAME
     468             :   {
     469           0 :         pCurClass->SetVariable( $3, $2, NULL, $1, nCurMask );
     470           0 :         nCurMask <<= 1;
     471             :   }
     472           0 :   ;
     473             : 
     474             : type_flags
     475             :   : type_flags EXTENDABLE
     476             :   {
     477           0 :         $$ = $1 | VAR_EXTENDABLE;
     478             :   }
     479           0 :   | type_flags WRITEIFSET
     480             :   {
     481           0 :         $$ = $1 | VAR_SVDYNAMIC;
     482             :   }
     483           0 :   |
     484             :   {
     485           0 :         $$ = 0;
     486             :   }
     487           0 :   ;
     488             : 
     489             : type
     490             :   : type_base
     491             :   {
     492           0 :         $$ = $1;
     493             :   }
     494           0 :   | type_base '[' ']'
     495             :   {
     496           0 :         if( $1 )
     497             :         {
     498           0 :                 rtl::OString aTypeName = rtl::OStringBuffer(pHS->getString($1->GetId())).
     499           0 :                     append("[]").makeStringAndClear();
     500           0 :                 $$ = pTC->SearchType( pHS->getID( aTypeName.getStr(), true ) );
     501           0 :                 if( !$$ )
     502             :                 {
     503             :                         RscCont * pCont;
     504           0 :                         pCont = new RscCont( pHS->getID( aTypeName.getStr() ), RSC_NOTYPE );
     505           0 :                         pCont->SetTypeClass( $1 );
     506           0 :                         pTC->InsertType( pCont );
     507           0 :                         $$ = pCont;
     508           0 :                 }
     509             :         }
     510             :         else
     511           0 :                 $$ = NULL;
     512             :   }
     513           0 :   ;
     514             : 
     515             : type_base
     516             :   : CLASSNAME
     517             :   {
     518           0 :         $$ = $1;
     519             :   }
     520           0 :   | SYMBOL
     521             :   {
     522           0 :         RscTop * pType = pTC->SearchType( pHS->getID( $1, true ) );
     523           0 :         if( !pType )
     524           0 :                 pTC->pEH->Error( ERR_NOTYPE, pCurClass, RscId() );
     525           0 :         $$ = pType;
     526             :   }
     527           0 :   ;
     528             : 
     529             : class_definition
     530             :   : class_header class_body
     531             :   {
     532       57152 :         if( TYPE_REF == $1.nTyp )
     533           0 :                 pTC->pEH->Error( ERR_REFNOTALLOWED, S.Top().pClass,
     534           0 :                                                  RscId( $1.nName1 ) );
     535       57152 :         S.Pop();
     536             :   }
     537       57152 :   | class_header
     538             :   {
     539           2 :         ERRTYPE aError;
     540           2 :         RscId aRscId( $1.nName1 );
     541             : 
     542           2 :         if( TYPE_NOTHING == $1.nTyp && aRscId.IsId() )
     543           1 :                 aError = S.Top().pClass->SetRef( S.Top(), aRscId );
     544           1 :         else if( TYPE_COPY == $1.nTyp )
     545           0 :                 aError = ERR_COPYNOTALLOWED;
     546           2 :         if( aError.IsError() || aError.IsWarning() )
     547           0 :                 pTC->pEH->Error( aError, S.Top().pClass, aRscId );
     548           2 :         S.Pop();
     549             :   }
     550           2 :   ;
     551             : 
     552             : class_header
     553             :   : class_header_body
     554             :         {
     555       57154 :                 if( !DoClassHeader( &$1, sal_False ) )
     556           0 :                         return( ERR_ERROR );
     557       57154 :                 $$ = $1;
     558             :         }
     559       57154 :   ;
     560             : 
     561             : copy_ref
     562             :   : '<'
     563             :         {
     564           9 :                 $$ = TYPE_COPY;
     565             :         }
     566           9 :   | ','
     567             :         {
     568           9 :                 $$ = TYPE_REF;
     569             :         }
     570           9 :   ;
     571             : 
     572             : class_header_body
     573             :   : CLASSNAME id_expression copy_ref CLASSNAME id_expression
     574             :         {
     575           0 :                 $$.pClass = $1;
     576           0 :                 $$.nName1 = $2;
     577           0 :                 $$.nTyp = $3;
     578           0 :                 $$.pRefClass = $4;
     579           0 :                 $$.nName2 = $5;
     580             :         }
     581           0 :   | CLASSNAME id_expression copy_ref id_expression
     582             :         {
     583          10 :                 $$.pClass = $1;
     584          10 :                 $$.nName1 = $2;
     585          10 :                 $$.nTyp = $3;
     586          10 :                 $$.pRefClass = NULL;
     587          10 :                 $$.nName2 = $4;
     588             :         }
     589          10 :   | CLASSNAME id_expression
     590             :         {
     591       48212 :                 $$.pClass = $1;
     592       48212 :                 $$.nName1 = $2;
     593       48212 :                 $$.nTyp = TYPE_NOTHING;
     594       48212 :                 $$.pRefClass = NULL;
     595       48212 :                 $$.nName2.cType = RSCEXP_NOTHING;
     596             :         }
     597       48212 :   | CLASSNAME copy_ref id_expression
     598             :         {
     599           8 :                 $$.pClass = $1;
     600           8 :                 $$.nName1.cType = RSCEXP_NOTHING;
     601           8 :                 $$.nTyp = $2;
     602           8 :                 $$.pRefClass = NULL;
     603           8 :                 $$.nName2 = $3;
     604             :         }
     605           8 :   | CLASSNAME copy_ref CLASSNAME id_expression
     606             :         {
     607           0 :                 $$.pClass = $1;
     608           0 :                 $$.nName1.cType = RSCEXP_NOTHING;
     609           0 :                 $$.nTyp = $2;
     610           0 :                 $$.pRefClass = $3;
     611           0 :                 $$.nName2 = $4;
     612             :         }
     613           0 :   | CLASSNAME
     614             :         {
     615       11695 :                 $$.pClass = $1;
     616       11695 :                 $$.nName1.cType = RSCEXP_NOTHING;
     617       11695 :                 $$.nTyp = TYPE_NOTHING;
     618       11695 :                 $$.nName2.cType = RSCEXP_NOTHING;
     619             :         }
     620       11695 :   ;
     621             : 
     622             : class_body
     623             :   : '{' var_definitions '}'
     624             :   | '{' '}'
     625             :   | string_multiline
     626             :         {
     627           1 :                 SetString( S.Top(), "TEXT", $1 );
     628             :         }
     629           1 :   ;
     630             : 
     631             : var_definitions
     632             :   : var_definition
     633             :   | var_definitions var_definition
     634             :   ;
     635             : 
     636             : xy_mapmode
     637             :   : CONSTNAME
     638             :         {
     639       16350 :                 SetConst( S.Top(), "_XYMAPMODE", $1.hashid, $1.nValue );
     640             :         }
     641       16350 :   |
     642             :   ;
     643             : 
     644             : wh_mapmode
     645             :   : CONSTNAME
     646             :         {
     647       17642 :                 SetConst( S.Top(), "_WHMAPMODE", $1.hashid, $1.nValue );
     648             :         }
     649       17642 :   |
     650             :   ;
     651             : 
     652             : xywh_mapmode
     653             :   : CONSTNAME
     654             :         {
     655           6 :                 SetConst( S.Top(), "_XYMAPMODE", $1.hashid, $1.nValue );
     656           6 :                 SetConst( S.Top(), "_WHMAPMODE", $1.hashid, $1.nValue );
     657             :         }
     658           6 :   |
     659             :   ;
     660             : 
     661             : var_definition
     662             :   : line_number
     663             :   | var_header var_body ';'
     664             :         {
     665      126320 :                 S.Pop();
     666             :         }
     667      126320 :   | class_definition ';'
     668             :   | var_header_class class_body ';'
     669             :         {
     670        2763 :                 if( TYPE_REF == $1.nTyp )
     671           0 :                         pTC->pEH->Error( ERR_REFNOTALLOWED, S.Top().pClass,
     672           0 :                                                          RscId( $1.nName1 ) );
     673             : 
     674        2763 :                 if( S.Top().pClass->GetCount( S.Top() ) )
     675           0 :                         pTC->pEH->Error( WRN_SUBINMEMBER, S.Top().pClass,
     676           0 :                                                          RscId(  $1.nName1 ) );
     677             : 
     678        2763 :                 S.Pop();
     679             :         }
     680        2763 :   | var_header_class ';'
     681             :         {
     682           8 :                 ERRTYPE aError;
     683           8 :                 RscId aRscId( $1.nName1 );
     684             : 
     685           8 :                 if( TYPE_NOTHING == $1.nTyp && aRscId.IsId() )
     686           0 :                         aError = S.Top().pClass->SetRef( S.Top(), aRscId );
     687           8 :                 else if( TYPE_COPY == $1.nTyp )
     688           0 :                         aError = ERR_COPYNOTALLOWED;
     689           8 :                 if( S.Top().pClass->GetCount( S.Top() ) )
     690           0 :                         aError = WRN_SUBINMEMBER;
     691           8 :                 if( aError.IsError() || aError.IsWarning() )
     692           0 :                         pTC->pEH->Error( aError, S.Top().pClass, aRscId );
     693             : 
     694           8 :                 S.Pop();
     695             :         }
     696           8 :   | XSCALE '=' '(' long_expression ',' long_expression ')' ';'
     697             :         {
     698           0 :                 SetNumber( S.Top(), "_XNUMERATOR", $4 );
     699           0 :                 SetNumber( S.Top(), "_XDENOMINATOR", $6 );
     700             :         }
     701           0 :   | YSCALE '=' '(' long_expression ',' long_expression ')' ';'
     702             :         {
     703           0 :                 SetNumber( S.Top(), "_YNUMERATOR", $4 );
     704           0 :                 SetNumber( S.Top(), "_YDENOMINATOR", $6 );
     705             :         }
     706           0 :   | RGB '=' '(' long_expression ',' long_expression
     707             :                                 ',' long_expression ')' ';'
     708             :         {
     709           0 :                 SetNumber( S.Top(), "RED", $4 );
     710           0 :                 SetNumber( S.Top(), "GREEN", $6 );
     711           0 :                 SetNumber( S.Top(), "BLUE", $8 );
     712             :         }
     713           0 :   | GEOMETRY '=' xywh_mapmode '(' long_expression ',' long_expression ','
     714             :                                                 long_expression ',' long_expression ')' ';'
     715             :         {
     716           6 :                 SetNumber( S.Top(), "_X", $5 );
     717           6 :                 SetNumber( S.Top(), "_Y", $7 );
     718           6 :                 SetNumber( S.Top(), "_WIDTH", $9 );
     719           6 :                 SetNumber( S.Top(), "_HEIGHT", $11 );
     720             :         }
     721           6 :   | POSITION '=' xy_mapmode '(' long_expression ',' long_expression
     722             :                                                         ')' ';'
     723             :         {
     724       16350 :                 SetNumber( S.Top(), "_X", $5 );
     725       16350 :                 SetNumber( S.Top(), "_Y", $7 );
     726             :         }
     727       16350 :   | DIMENSION '=' wh_mapmode '(' long_expression ',' long_expression
     728             :                                                          ')' ';'
     729             :         {
     730       17646 :                 SetNumber( S.Top(), "_WIDTH", $5 );
     731       17646 :                 SetNumber( S.Top(), "_HEIGHT", $7 );
     732             :         }
     733       17646 :   | INZOOMOUTPUTSIZE '=' CONSTNAME '(' long_expression ',' long_expression
     734             :                                                          ')' ';'
     735             :         {
     736           0 :                 SetConst( S.Top(), "_ZOOMINMAPMODE", $3.hashid, $3.nValue );
     737           0 :                 SetNumber( S.Top(), "_ZOOMINWIDTH", $5 );
     738           0 :                 SetNumber( S.Top(), "_ZOOMINHEIGHT", $7 );
     739             :         }
     740           0 :   | INZOOMOUTPUTSIZE '=' '(' long_expression ',' long_expression ')' ';'
     741             :         {
     742           0 :                 SetNumber( S.Top(), "_ZOOMINWIDTH", $4 );
     743           0 :                 SetNumber( S.Top(), "_ZOOMINHEIGHT", $6 );
     744             :         }
     745           0 :   | FLOATINGPOS '=' CONSTNAME '(' long_expression ',' long_expression
     746             :                                                          ')' ';'
     747             :         {
     748           0 :                 SetConst( S.Top(),      "_FLOATINGPOSMAPMODE", $3.hashid, $3.nValue );
     749           0 :                 SetNumber( S.Top(), "_FLOATINGPOSX", $5 );
     750           0 :                 SetNumber( S.Top(), "_FLOATINGPOSY", $7 );
     751             :         }
     752           0 :   | FLOATINGPOS '=' '(' long_expression ',' long_expression ')' ';'
     753             :         {
     754           0 :                 SetNumber( S.Top(), "_FLOATINGPOSX", $4 );
     755           0 :                 SetNumber( S.Top(), "_FLOATINGPOSY", $6 );
     756             :         }
     757           0 :   ;
     758             : 
     759             : var_header_class
     760             :   : VARNAME '=' class_header_body
     761             :         {
     762        2771 :                 RSCINST aInst;
     763             : 
     764        2771 :                 aInst = S.Top().pClass->GetVariable( S.Top(), $1, RSCINST(), sal_False, $3.pClass );
     765             : 
     766        2771 :                 if( aInst.pData )
     767        2771 :                         S.Push( aInst );
     768             :                 else
     769             :                 {
     770           0 :                         pTC->pEH->Error( ERR_NOVARIABLENAME, S.Top().pClass, RscId(),
     771           0 :                                                          pHS->getString( $1 ).getStr() );
     772           0 :                         return( ERR_ERROR );
     773             :                 }
     774             : 
     775        2771 :                 if( !DoClassHeader( &$3, sal_True ) )
     776           0 :                         return( ERR_ERROR );
     777        2771 :                 $$ = $3;
     778             :         }
     779        2771 :   | VARNAME '[' CONSTNAME ']' '=' class_header_body
     780             :         {
     781           0 :                 RSCINST aInst;
     782             : 
     783           0 :                 aInst = S.Top().pClass->GetVariable( S.Top(), $1, RSCINST() );
     784             : 
     785           0 :                 if( aInst.pData )
     786             :                 {
     787           0 :                         ERRTYPE aError;
     788           0 :                         RSCINST aIdxInst;
     789             : 
     790           0 :                         aError = aInst.pClass->GetArrayEle( aInst, $3.hashid, NULL, &aIdxInst );
     791           0 :                         if( aError.IsError() || aError.IsWarning() )
     792           0 :                                  pTC->pEH->Error( aError, S.Top().pClass, RscId() );
     793           0 :                         if( aError.IsError() )
     794           0 :                                 return( ERR_ERROR );
     795           0 :                         S.Push( aIdxInst );
     796             :                 }
     797             :                 else
     798             :                 {
     799           0 :                         pTC->pEH->Error( ERR_NOVARIABLENAME, S.Top().pClass, RscId(),
     800           0 :                                                          pHS->getString( $1 ).getStr() );
     801           0 :                         return( ERR_ERROR );
     802             :                 }
     803           0 :                 if( !DoClassHeader( &$6, sal_True ) )
     804           0 :                         return( ERR_ERROR );
     805           0 :                 $$ = $6;
     806             :         }
     807           0 :   | VARNAME '[' SYMBOL ']' '=' class_header_body
     808             :         {
     809           0 :                 RSCINST aInst;
     810             : 
     811           0 :                 aInst = S.Top().pClass->GetVariable( S.Top(), $1, RSCINST() );
     812             : 
     813           0 :                 if( aInst.pData )
     814             :                 {
     815           0 :             long nNewLang = pTC->AddLanguage( $3 );
     816           0 :                         ERRTYPE aError;
     817           0 :                         RSCINST aIdxInst;
     818             : 
     819           0 :                         aError = aInst.pClass->GetArrayEle( aInst, nNewLang, NULL, &aIdxInst );
     820           0 :                         if( aError.IsError() || aError.IsWarning() )
     821           0 :                                  pTC->pEH->Error( aError, S.Top().pClass, RscId() );
     822           0 :                         if( aError.IsError() )
     823           0 :                                 return( ERR_ERROR );
     824           0 :                         S.Push( aIdxInst );
     825             :                 }
     826             :                 else
     827             :                 {
     828           0 :                         pTC->pEH->Error( ERR_NOVARIABLENAME, S.Top().pClass, RscId(),
     829           0 :                                                          pHS->getString( $1 ).getStr() );
     830           0 :                         return( ERR_ERROR );
     831             :                 }
     832           0 :                 if( !DoClassHeader( &$6, sal_True ) )
     833           0 :                         return( ERR_ERROR );
     834           0 :                 $$ = $6;
     835             :         }
     836           0 :   ;
     837             : 
     838             : var_header
     839             :   : VARNAME '='
     840             :         {
     841       84339 :                 RSCINST aInst;
     842             : 
     843       84339 :                 aInst = S.Top().pClass->GetVariable( S.Top(), $1, RSCINST() );
     844             : 
     845       84339 :                 if( aInst.pData )
     846       84339 :                         S.Push( aInst );
     847             :                 else{
     848           0 :                         pTC->pEH->Error( ERR_NOVARIABLENAME, S.Top().pClass, RscId(),
     849           0 :                                                          pHS->getString( $1 ).getStr() );
     850           0 :                         return( ERR_ERROR );
     851             :                 }
     852             :         }
     853       84339 :   | VARNAME '[' CONSTNAME ']' '='
     854             :         {
     855       41981 :                 RSCINST aInst;
     856             : 
     857       41981 :                 aInst = S.Top().pClass->GetVariable( S.Top(), $1, RSCINST() );
     858             : 
     859       41981 :                 if( aInst.pData )
     860             :                 {
     861       41981 :                         ERRTYPE aError;
     862       41981 :                         RSCINST aIdxInst;
     863             : 
     864       41981 :                         aError = aInst.pClass->GetArrayEle( aInst, $3.hashid, NULL, &aIdxInst );
     865       41981 :                         if( aError.IsError() || aError.IsWarning() )
     866           0 :                                  pTC->pEH->Error( aError, S.Top().pClass, RscId() );
     867       41981 :                         if( aError.IsError() )
     868           0 :                                 return( ERR_ERROR );
     869       41981 :                         S.Push( aIdxInst );
     870             :                 }
     871             :                 else{
     872           0 :                         pTC->pEH->Error( ERR_NOVARIABLENAME, S.Top().pClass, RscId(),
     873           0 :                                                          pHS->getString( $1 ).getStr() );
     874           0 :                         return( ERR_ERROR );
     875             :                 }
     876             :         }
     877       41981 :   | VARNAME '[' SYMBOL ']' '='
     878             :         {
     879           0 :                 RSCINST aInst;
     880             : 
     881           0 :                 aInst = S.Top().pClass->GetVariable( S.Top(), $1, RSCINST() );
     882             : 
     883           0 :                 if( aInst.pData )
     884             :                 {
     885           0 :             long nNewLang = pTC->AddLanguage( $3 );
     886           0 :                         ERRTYPE aError;
     887           0 :                         RSCINST aIdxInst;
     888             : 
     889           0 :                         aError = aInst.pClass->GetArrayEle( aInst, nNewLang, NULL, &aIdxInst );
     890           0 :                         if( aError.IsError() || aError.IsWarning() )
     891           0 :                                  pTC->pEH->Error( aError, S.Top().pClass, RscId() );
     892           0 :                         if( aError.IsError() )
     893           0 :                                 return( ERR_ERROR );
     894           0 :                         S.Push( aIdxInst );
     895             :                 }
     896             :                 else{
     897           0 :                         pTC->pEH->Error( ERR_NOVARIABLENAME, S.Top().pClass, RscId(),
     898           0 :                                                          pHS->getString( $1 ).getStr() );
     899           0 :                         return( ERR_ERROR );
     900             :                 }
     901             :         }
     902           0 :   ;
     903             : tupel_header0
     904             :   :
     905             :         {
     906        5279 :                 RSCINST aInst;
     907             : 
     908        5279 :                 aInst = S.Top().pClass->GetTupelVar( S.Top(), 0, RSCINST() );
     909        5279 :                 if( aInst.pData )
     910        5279 :                         S.Push( aInst );
     911             :                 else
     912             :                 {
     913           0 :                         pTC->pEH->Error( ERR_NOTUPELNAME, S.Top().pClass, RscId() );
     914           0 :                         return( ERR_ERROR );
     915             :                 }
     916             :         }
     917        5279 :   ;
     918             : 
     919             : tupel_header1
     920             :   :
     921             :         {
     922        4397 :                 RSCINST aInst;
     923             : 
     924        4397 :                 aInst = S.Top().pClass->GetTupelVar( S.Top(), 1, RSCINST() );
     925        4397 :                 if( aInst.pData )
     926        4397 :                         S.Push( aInst );
     927             :                 else
     928             :                 {
     929           0 :                         pTC->pEH->Error( ERR_NOTUPELNAME, S.Top().pClass, RscId() );
     930           0 :                         return( ERR_ERROR );
     931             :                 }
     932             :         }
     933        4397 :   ;
     934             : 
     935             : tupel_header2
     936             :   :
     937             :         {
     938          13 :                 RSCINST aInst;
     939             : 
     940          13 :                 aInst = S.Top().pClass->GetTupelVar( S.Top(), 2, RSCINST() );
     941          13 :                 if( aInst.pData )
     942          13 :                         S.Push( aInst );
     943             :                 else
     944             :                 {
     945           0 :                         pTC->pEH->Error( ERR_NOTUPELNAME, S.Top().pClass, RscId() );
     946           0 :                         return( ERR_ERROR );
     947             :                 }
     948             :         }
     949          13 :   ;
     950             : 
     951             : tupel_header3
     952             :   :
     953             :         {
     954          13 :                 RSCINST aInst;
     955             : 
     956          13 :                 aInst = S.Top().pClass->GetTupelVar( S.Top(), 3, RSCINST() );
     957          13 :                 if( !aInst.pData )
     958             :                 {
     959           0 :                         pTC->pEH->Error( ERR_NOTUPELNAME, S.Top().pClass, RscId() );
     960           0 :                         return( ERR_ERROR );
     961             :                 }
     962          13 :                 S.Push( aInst );
     963             :         }
     964          13 :   ;
     965             : 
     966             : tupel_body
     967             :   : var_body
     968             :         {
     969        9702 :                 S.Pop();
     970             :         }
     971        9702 :   ;
     972             : 
     973             : var_list_header
     974             :   :
     975             :         {
     976        5266 :                 ERRTYPE aError;
     977        5266 :                 RSCINST aInst;
     978             : 
     979       10532 :                 aError = S.Top().pClass->GetElement( S.Top(), RscId(),
     980       10532 :                                                                                         NULL, RSCINST(), &aInst );
     981        5266 :                 if( aError.IsError() || aError.IsWarning() )
     982           0 :                         pTC->pEH->Error( aError, S.Top().pClass, RscId() );
     983        5266 :                 if( aError.IsError() )
     984             :                 { // unbedingt Instanz auf den Stack bringen
     985           0 :                         aInst = S.Top().pClass->Create( NULL, RSCINST() );
     986             :                 }
     987        5266 :                 S.Push( aInst );
     988             :         }
     989        5266 :   ;
     990             : 
     991             : list_body
     992             :   : var_bodycomplex
     993             :         {
     994        5266 :                 S.Pop();
     995             :         }
     996        5266 :   ;
     997             : 
     998             : list_header
     999             :   :
    1000             :         {
    1001        2886 :                 sal_uInt32 nCount = S.Top().pClass->GetCount( S.Top() );
    1002             :                 sal_uInt32 i;
    1003             : 
    1004        2920 :                 for( i = nCount; i > 0; i-- )
    1005          34 :                         S.Top().pClass->DeletePos( S.Top(), i -1 );
    1006             :         }
    1007        2886 :   ;
    1008             : 
    1009             : list
    1010             :   : list var_list_header list_body ';'
    1011             :   | list var_bodysimple ';'
    1012             :   | list class_definition ';'
    1013             :   | list line_number
    1014             :   |
    1015             :   ;
    1016             : 
    1017             : var_bodysimple
    1018             :   : macro_expression
    1019             :         {
    1020             :                 sal_Int32       l;
    1021       20553 :                 ERRTYPE aError;
    1022             : 
    1023       20553 :                 if( !$1.Evaluate( &l ) )
    1024           0 :                         pTC->pEH->Error( ERR_ZERODIVISION, NULL, RscId() );
    1025             :                 else
    1026             :                 {
    1027       20553 :                         aError = S.Top().pClass->SetRef( S.Top(), RscId( $1 ) );
    1028       20553 :                         if( aError.IsError() )
    1029             :                         {
    1030        9075 :                                 aError.Clear();
    1031        9075 :                                 aError = S.Top().pClass->SetNumber( S.Top(), l );
    1032             :                         }
    1033       20553 :                         if( aError.IsError() )
    1034             :                         { // Aufwaertskompatible, Tupel probieren
    1035           0 :                                 RSCINST aInst = GetFirstTupelEle( S.Top() );
    1036           0 :                                 if( aInst.pData )
    1037             :                                 {
    1038           0 :                                         aError.Clear(); // Fehler zuruecksetzen
    1039           0 :                                         aError = aInst.pClass->SetRef( aInst, RscId( $1 ) );
    1040           0 :                                         if( aError.IsError() )
    1041             :                                         {
    1042           0 :                                                 aError.Clear();
    1043           0 :                                                 aError = aInst.pClass->SetNumber( aInst, l );
    1044             :                                         }
    1045             :                                 }
    1046             :                         }
    1047             :                 }
    1048             : 
    1049       20553 :                 if( $1.IsExpression() )
    1050           0 :                         delete $1.aExp.pExp;
    1051             : 
    1052       20553 :                 if( aError.IsError() || aError.IsWarning() )
    1053           0 :                         pTC->pEH->Error( aError, S.Top().pClass, RscId() );
    1054             :         }
    1055       20553 :   | CONSTNAME
    1056             :         {
    1057        1312 :                 ERRTYPE aError;
    1058        1312 :                 aError = S.Top().pClass->SetConst( S.Top(), $1.hashid, $1.nValue );
    1059        1312 :                 if( aError.IsError() )
    1060             :                 { // Aufwaertskompatible, Tupel probieren
    1061           0 :                         RSCINST aInst = GetFirstTupelEle( S.Top() );
    1062           0 :                         if( aInst.pData )
    1063             :                         {
    1064           0 :                                 aError.Clear(); // Fehler zuruecksetzen
    1065           0 :                                 aError = aInst.pClass->SetConst( aInst, $1.hashid, $1.nValue );
    1066             :                         }
    1067             :                 }
    1068             : 
    1069        1312 :                 if( aError.IsError() || aError.IsWarning() )
    1070           0 :                         pTC->pEH->Error( aError, S.Top().pClass, RscId() );
    1071             :         }
    1072        1312 :   | NOT CONSTNAME
    1073             :         {
    1074           0 :                 ERRTYPE aError;
    1075           0 :                 aError = S.Top().pClass->SetNotConst( S.Top(), $2.hashid );
    1076           0 :                 if( aError.IsError() )
    1077             :                 { // Aufwaertskompatible, Tupel probieren
    1078           0 :                         RSCINST aInst = GetFirstTupelEle( S.Top() );
    1079           0 :                         if( aInst.pData )
    1080             :                         {
    1081           0 :                                 aError.Clear(); // Fehler zuruecksetzen
    1082           0 :                                 aError = aInst.pClass->SetNotConst( aInst, $2.hashid );
    1083             :                         }
    1084             :                 }
    1085             : 
    1086           0 :                 if( aError.IsError() || aError.IsWarning() )
    1087           0 :                         pTC->pEH->Error( aError, S.Top().pClass, RscId() );
    1088             :         }
    1089           0 :   | BOOLEAN
    1090             :         {
    1091       24953 :                 ERRTYPE aError;
    1092       24953 :                 aError = S.Top().pClass->SetBool( S.Top(), $1 );
    1093       24953 :                 if( aError.IsError() )
    1094             :                 { // Aufwaertskompatible, Tupel probieren
    1095           0 :                         RSCINST aInst = GetFirstTupelEle( S.Top() );
    1096           0 :                         if( aInst.pData )
    1097             :                         {
    1098           0 :                                 aError.Clear(); // Fehler zuruecksetzen
    1099           0 :                                 aError = aInst.pClass->SetBool( aInst, $1 );
    1100             :                         }
    1101             :                 }
    1102             : 
    1103       24953 :                 if( aError.IsError() || aError.IsWarning() )
    1104           0 :                         pTC->pEH->Error( aError, S.Top().pClass, RscId() );
    1105             :         }
    1106       24953 :   | string_multiline
    1107             :         {
    1108       89635 :                 ERRTYPE aError;
    1109       89635 :                 aError = S.Top().pClass->SetString( S.Top(), $1 );
    1110       89635 :                 if( aError.IsError() )
    1111             :                 { // Aufwaertskompatible, Tupel probieren
    1112         166 :                         RSCINST aInst = GetFirstTupelEle( S.Top() );
    1113         166 :                         if( aInst.pData )
    1114             :                         {
    1115         166 :                                 aError.Clear(); // Fehler zuruecksetzen
    1116         166 :                                 aError = aInst.pClass->SetString( aInst, $1 );
    1117             :                         }
    1118             :                 }
    1119             : 
    1120       89635 :                 if( aError.IsError() || aError.IsWarning() )
    1121           0 :                         pTC->pEH->Error( aError, S.Top().pClass, RscId() );
    1122             :         }
    1123       89635 :   | DEFAULT
    1124             :   ;
    1125             : 
    1126             : var_bodycomplex
    1127             :   : '{' list_header list '}'
    1128             :   | '<' tupel_header0 tupel_body ';' '>'
    1129             :   | '<' tupel_header0 tupel_body ';' tupel_header1 tupel_body ';' '>'
    1130             :   | '<' tupel_header0 tupel_body ';' tupel_header1 tupel_body ';'
    1131             :                 tupel_header2 tupel_body ';' '>'
    1132             :   | '<' tupel_header0 tupel_body ';' tupel_header1 tupel_body ';'
    1133             :                 tupel_header2 tupel_body ';' tupel_header3 tupel_body ';' '>'
    1134             :   ;
    1135             : 
    1136             : var_body
    1137             :   : var_bodysimple
    1138             :   | var_bodycomplex
    1139             :   ;
    1140             : 
    1141             : /********************** work on yacc stack *******************************/
    1142             : string_multiline
    1143             :   : STRING
    1144             :         {
    1145       89636 :                 $$ = $1;
    1146             :         }
    1147       89636 :   | string_multiline STRING
    1148             :         {
    1149        1306 :         rtl::OStringBuffer aBuf( 256 );
    1150        1306 :         aBuf.append( $1 );
    1151        1306 :         aBuf.append( $2 );
    1152        1306 :         $$ = (char*)pStringContainer->putString( aBuf.getStr() );
    1153             :         }
    1154        1306 :   ;
    1155             : 
    1156             : long_expression
    1157             :   : macro_expression
    1158             :         {
    1159       68016 :                 if( !$1.Evaluate( &$$ ) )
    1160           0 :                         pTC->pEH->Error( ERR_ZERODIVISION, NULL, RscId() );
    1161       68016 :                 if( $1.IsExpression() )
    1162           0 :                         delete $1.aExp.pExp;
    1163             :         }
    1164       68016 :   ;
    1165             : 
    1166             : macro_expression
    1167             :   : RSCDEFINE
    1168             :         {
    1169           0 :                 $$.cType = RSCEXP_DEF;
    1170           0 :                 $$.aExp.pDef = $1;
    1171             :         }
    1172           0 :   | NUMBER
    1173             :         {
    1174      186567 :                 $$.cType = RSCEXP_LONG;
    1175      186567 :                 $$.SetLong( $1 );
    1176             :         }
    1177      186567 :   | '-' macro_expression %prec UNARYMINUS
    1178             :         {
    1179         177 :                 if( $2.IsNumber() ){
    1180         177 :                         $$.cType = $2.cType;
    1181         177 :                         $$.SetLong( - $2.GetLong() );
    1182             :                 }
    1183             :                 else{
    1184             :                         RscExpType aLeftExp;
    1185             : 
    1186           0 :                         aLeftExp.cType = RSCEXP_NOTHING;
    1187           0 :                         $$.cType = RSCEXP_EXP;
    1188           0 :                         $$.aExp.pExp = new RscExpression( aLeftExp, '-', $2 );
    1189             :                 }
    1190             :         }
    1191         177 :   | '+' macro_expression %prec UNARYPLUS
    1192             :         {
    1193           1 :                 $$ = $2;
    1194             :         }
    1195           1 :   | macro_expression '+' macro_expression
    1196             :         {
    1197       42742 :                 if( $1.IsNumber() && $3.IsNumber() ){
    1198       42742 :                         $$.cType = RSCEXP_LONG;
    1199       42742 :                         $$.SetLong( $1.GetLong() + $3.GetLong() );
    1200             :                 }
    1201             :                 else{
    1202           0 :                         $$.cType = RSCEXP_EXP;
    1203           0 :                         $$.aExp.pExp = new RscExpression( $1, '+', $3 );
    1204             :                 }
    1205             :         }
    1206       42742 :   | macro_expression '-' macro_expression
    1207             :         {
    1208        3243 :                 if( $1.IsNumber() && $3.IsNumber() ){
    1209        3243 :                         $$.cType = RSCEXP_LONG;
    1210        3243 :                         $$.SetLong( $1.GetLong() - $3.GetLong() );
    1211             :                 }
    1212             :                 else{
    1213           0 :                         $$.cType = RSCEXP_EXP;
    1214           0 :                         $$.aExp.pExp = new RscExpression( $1, '-', $3 );
    1215             :                 }
    1216             :         }
    1217        3243 :   | macro_expression '*' macro_expression
    1218             :         {
    1219        1651 :                 if( $1.IsNumber() && $3.IsNumber() ){
    1220        1651 :                         $$.cType = RSCEXP_LONG;
    1221        1651 :                         $$.SetLong( $1.GetLong() * $3.GetLong() );
    1222             :                 }
    1223             :                 else{
    1224           0 :                         $$.cType = RSCEXP_EXP;
    1225           0 :                         $$.aExp.pExp = new RscExpression( $1, '*', $3 );
    1226             :                 }
    1227             :         }
    1228        1651 :   | macro_expression '/' macro_expression
    1229             :         {
    1230         233 :                 if( $1.IsNumber() && $3.IsNumber() ){
    1231         233 :                         if( 0 == $3.GetLong() ){
    1232           0 :                                 $$.cType = RSCEXP_EXP;
    1233           0 :                                 $$.aExp.pExp = new RscExpression( $1, '/', $3 );
    1234             :                         }
    1235             :                         else{
    1236         233 :                                 $$.cType = RSCEXP_LONG;
    1237         233 :                                 $$.SetLong( $1.GetLong() / $3.GetLong() );
    1238             :                         }
    1239             :                 }
    1240             :                 else{
    1241           0 :                         $$.cType = RSCEXP_EXP;
    1242           0 :                         $$.aExp.pExp = new RscExpression( $1, '/', $3 );
    1243             :                 }
    1244             :         }
    1245         233 :   | macro_expression '&' macro_expression
    1246             :         {
    1247         293 :                 if( $1.IsNumber() && $3.IsNumber() ){
    1248         293 :                         $$.cType = RSCEXP_LONG;
    1249         293 :                         $$.SetLong( $1.GetLong() & $3.GetLong() );
    1250             :                 }
    1251             :                 else{
    1252           0 :                         $$.cType = RSCEXP_EXP;
    1253           0 :                         $$.aExp.pExp = new RscExpression( $1, '&', $3 );
    1254             :                 }
    1255             :         }
    1256         293 :   | macro_expression '|' macro_expression
    1257             :         {
    1258         768 :                 if( $1.IsNumber() && $3.IsNumber() ){
    1259         768 :                         $$.cType = RSCEXP_LONG;
    1260         768 :                         $$.SetLong( $1.GetLong() | $3.GetLong() );
    1261             :                 }
    1262             :                 else{
    1263           0 :                         $$.cType = RSCEXP_EXP;
    1264           0 :                         $$.aExp.pExp = new RscExpression( $1, '|', $3 );
    1265             :                 }
    1266             :         }
    1267         768 :   | '(' macro_expression ')'
    1268             :         {
    1269       47789 :                 $$ = $2;
    1270             :         }
    1271       47789 :   | macro_expression LEFTSHIFT macro_expression
    1272             :         {
    1273         828 :                 if( $1.IsNumber() && $3.IsNumber() ){
    1274         828 :                         $$.cType = RSCEXP_LONG;
    1275         828 :                         $$.SetLong( $1.GetLong() << $3.GetLong() );
    1276             :                 }
    1277             :                 else{
    1278           0 :                         $$.cType = RSCEXP_EXP;
    1279           0 :                         $$.aExp.pExp = new RscExpression( $1, 'l', $3 );
    1280             :                 }
    1281             :         }
    1282         828 :   | macro_expression RIGHTSHIFT macro_expression
    1283             :         {
    1284           0 :                 if( $1.IsNumber() && $3.IsNumber() ){
    1285           0 :                         $$.cType = RSCEXP_LONG;
    1286           0 :                         $$.SetLong( $1.GetLong() >> $3.GetLong() );
    1287             :                 }
    1288             :                 else{
    1289           0 :                         $$.cType = RSCEXP_EXP;
    1290           0 :                         $$.aExp.pExp = new RscExpression( $1, 'r', $3 );
    1291             :                 }
    1292             :         }
    1293           0 :   ;
    1294             : 
    1295             : id_expression
    1296             :   : id_expression line_number
    1297             :   | macro_expression
    1298             :         {  // pExpession auswerten und loeschen
    1299       48240 :                 if( RSCEXP_EXP == $1.cType ){
    1300             :                         sal_Int32       lValue;
    1301             : 
    1302           0 :                         if( !$1.Evaluate( &lValue ) )
    1303           0 :                                 pTC->pEH->Error( ERR_ZERODIVISION, NULL, RscId() );
    1304           0 :                         delete $1.aExp.pExp;
    1305           0 :                         $$.cType = RSCEXP_LONG;
    1306           0 :                         $$.SetLong( lValue );
    1307             :                 }
    1308             :                 else
    1309       48240 :                         $$ = $1;
    1310             :         }
    1311       48240 :   ;
    1312             : 
    1313             : DUMMY_NUMBER
    1314             :   : NUMBER
    1315             :         {
    1316             :         }
    1317           0 :   |
    1318             :         {
    1319             :         }
    1320         632 :   ;
    1321             : 
    1322             : line_number
    1323             :   : '#' LINE NUMBER STRING
    1324             :         {
    1325             :                 RscFile * pFName;
    1326             : 
    1327           0 :                 pFI->SetLineNo( $3 );
    1328           0 :                 pFI->SetFileIndex( pTC->aFileTab.NewCodeFile( rtl::OString( $4 ) ) );
    1329           0 :                 pFName = pTC->aFileTab.Get( pFI->GetFileIndex() );
    1330           0 :                 pFName->bLoaded = sal_True;
    1331           0 :                 pFName->bScanned = sal_True;
    1332             :         }
    1333           0 :   | '#' NUMBER STRING DUMMY_NUMBER
    1334             :         {
    1335             :                 RscFile * pFName;
    1336             : 
    1337         632 :                 pFI->SetLineNo( $2 );
    1338         632 :                 pFI->SetFileIndex( pTC->aFileTab.NewCodeFile( rtl::OString( $3 ) ) );
    1339         632 :                 pFName = pTC->aFileTab.Get( pFI->GetFileIndex() );
    1340         632 :                 pFName->bLoaded = sal_True;
    1341         632 :                 pFName->bScanned = sal_True;
    1342             :         }
    1343         632 :   | '#' NUMBER
    1344             :         {
    1345        2212 :                 pFI->SetLineNo( $2 );
    1346             :         }
    1347        2212 :   ;
    1348             : 
    1349             : %%
    1350             : #if defined _MSC_VER
    1351             : #pragma warning(pop)
    1352             : #endif
    1353             : 
    1354             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
    1355             : 
    1356             : 

Generated by: LCOV version 1.10