LCOV - code coverage report
Current view: top level - libreoffice/idlc/source - scanner.l (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 214 287 74.6 %
Date: 2012-12-27 Functions: 3 4 75.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             : %option yylineno
      20             : 
      21             : %{
      22             : /*
      23             :  * scanner.ll - Lexical scanner for IDLC 1.0
      24             :  */
      25             : 
      26             : #include <ctype.h>
      27             : #include <stdlib.h>
      28             : #include <string.h>
      29             : 
      30             : #ifndef _IDLC_IDLC_HXX_
      31             : #include <idlc/idlc.hxx>
      32             : #endif
      33             : #ifndef _IDLC_ERRORHANDLER_HXX_
      34             : #include <idlc/errorhandler.hxx>
      35             : #endif
      36             : #ifndef _IDLC_FEHELPER_HXX_
      37             : #include <idlc/fehelper.hxx>
      38             : #endif
      39             : 
      40             : #include "attributeexceptions.hxx"
      41             : 
      42             : 
      43             : class AstExpression;
      44             : class AstArray;
      45             : class AstMember;
      46             : 
      47             : #include <parser.hxx>
      48             : 
      49             : /* handle locations */
      50             : int yycolumn = 1;
      51             : 
      52             : #define YY_USER_ACTION idlc()->setOffset(yycolumn, yycolumn+yyleng-1); \
      53             :     yycolumn += yyleng;
      54             : 
      55             : sal_Int32               beginLine = 0;
      56         138 : ::rtl::OString  docu;
      57             : 
      58       13985 : static int asciiToInteger(char const * s, sal_Int64  * sval, sal_uInt64 * uval) {
      59       13985 :     bool neg = false;
      60       13985 :     if (*s == '-') {
      61         602 :         neg = true;
      62         602 :         ++s;
      63             :     }
      64       13985 :     unsigned int base = 10;
      65       13985 :     if (*s == '0') {
      66        1431 :         base = 8;
      67        1431 :         ++s;
      68        1431 :         if (*s == 'X' || *s == 'x') {
      69         475 :             base = 16;
      70         475 :             ++s;
      71             :         }
      72             :     }
      73       13985 :     sal_uInt64 val = 0;
      74       42346 :     for (; *s != 0; ++s) {
      75             :         unsigned int n;
      76       28361 :         if (*s >= '0' && *s <= '9') {
      77       28289 :             n = *s - '0';
      78             :         } else {
      79          72 :             switch (*s) {
      80             :             case 'A':
      81             :             case 'a':
      82           0 :                 n = 10;
      83           0 :                 break;
      84             :             case 'B':
      85             :             case 'b':
      86           5 :                 n = 11;
      87           5 :                 break;
      88             :             case 'C':
      89             :             case 'c':
      90           0 :                 n = 12;
      91           0 :                 break;
      92             :             case 'D':
      93             :             case 'd':
      94           0 :                 n = 13;
      95           0 :                 break;
      96             :             case 'E':
      97             :             case 'e':
      98           1 :                 n = 14;
      99           1 :                 break;
     100             :             case 'F':
     101             :             case 'f':
     102          66 :                 n = 15;
     103          66 :                 break;
     104             :             default:
     105           0 :                 goto done;
     106             :             }
     107             :         }
     108             :         // The following guarantees the invariant val <= SAL_MAX_UINT64 (because
     109             :         // base and n are sufficiently small), *if*
     110             :         // std::numeric_limits<sal_uInt64>::max() == SAL_MAX_UINT64:
     111       28361 :         sal_uInt64 nval = val * base + n;
     112       28361 :         if (nval < val) {
     113             :             idlc()->error()->syntaxError(
     114           0 :                 PS_NoState, idlc()->getLineNumber(),
     115           0 :                 "integral constant too large");
     116           0 :             val = 0;
     117           0 :             break;
     118             :         }
     119       28361 :         val = nval;
     120             :     }
     121             :  done:
     122       13985 :     if (neg) {
     123         602 :         if (val < SAL_CONST_UINT64(0x8000000000000000)) {
     124         601 :             *sval = -static_cast< sal_Int64 >(val);
     125           1 :         } else if (val == SAL_CONST_UINT64(0x8000000000000000)) {
     126           1 :             *sval = SAL_MIN_INT64;
     127             :         } else {
     128             :             idlc()->error()->syntaxError(
     129           0 :                 PS_NoState, idlc()->getLineNumber(),
     130           0 :                 "negative integral constant too large");
     131           0 :             *sval = 0;
     132             :         }
     133         602 :         return IDL_INTEGER_LITERAL;
     134       13383 :     } else if (val <= static_cast< sal_uInt64 >(SAL_MAX_INT64)) {
     135       13382 :         *sval = static_cast< sal_Int64 >(val);
     136       13382 :         return IDL_INTEGER_LITERAL;
     137             :     } else {
     138           1 :         *uval = val;
     139           1 :         return IDL_INTEGER_ULITERAL;
     140             :     }
     141             : }
     142             : 
     143          20 : static double asciiToFloat(const sal_Char *s)
     144             : {
     145          20 :         double          d = 0.0;
     146             :         double          e, k;
     147          20 :         sal_Int32       neg = 0, negexp = 0;
     148             : 
     149          20 :         if (*s == '-')
     150             :         {
     151           0 :         neg = 1;
     152           0 :         s++;
     153             :         }
     154          88 :         while (*s >= '0' && *s <= '9')
     155             :         {
     156          48 :         d = (d * 10) + *s - '0';
     157          48 :         s++;
     158             :         }
     159          20 :         if (*s == '.')
     160             :         {
     161          20 :         s++;
     162          20 :         e = 10;
     163         160 :         while (*s >= '0' && *s <= '9')
     164             :         {
     165         120 :                 d += (*s - '0') / (e * 1.0);
     166         120 :                 e *= 10;
     167         120 :                 s++;
     168             :         }
     169             :         }
     170          20 :         if (*s == 'e' || *s == 'E')
     171             :         {
     172           0 :         s++;
     173           0 :         if (*s == '-')
     174             :         {
     175           0 :                 negexp = 1;
     176           0 :                 s++;
     177             :         } else
     178             :         {
     179           0 :                 if (*s == '+')
     180           0 :                 s++;
     181           0 :                 e = 0;
     182           0 :                 while (*s >= '0' && *s <= '9')
     183             :                 {
     184           0 :                 e = (e * 10) + *s - '0';
     185           0 :                 s++;
     186             :                 }
     187           0 :                 if (e > 0)
     188             :                 {
     189           0 :                 for (k = 1; e > 0; k *= 10, e--)
     190             :                     ;
     191           0 :                 if (negexp)
     192           0 :                         d /= k;
     193             :                 else
     194           0 :                         d *= k;
     195             :                 }
     196             :                 }
     197             :         }
     198          20 :         if (neg) d *= -1.0;
     199          20 :         return d;
     200             : }
     201             : 
     202           0 : static void     idlParsePragma(sal_Char* pPragma)
     203             : {
     204           0 :         ::rtl::OString pragma(pPragma);
     205           0 :         sal_Int32 index = pragma.indexOf("include");
     206           0 :         sal_Char* begin = pPragma + index + 8;
     207           0 :         sal_Char* offset = begin;
     208           0 :         while (*offset != ',') offset++;
     209             :         //::rtl::OString include = pragma.copy(index + 8, offset - begin);
     210             :         //unused// idlc()->insertInclude(pragma.copy(index + 8, (sal_Int32)(offset - begin)));
     211           0 : }       
     212             : 
     213      115249 : static void parseLineAndFile(sal_Char* pBuf)
     214             : {
     215      115249 :         sal_Char        *r = pBuf;
     216             :         sal_Char    *h;
     217      115249 :         sal_Bool        bIsInMain = sal_False;
     218             : 
     219             :         /* Skip initial '#' */
     220      115249 :         if (*r != '#')
     221             :                 return;
     222             : 
     223             :         /* Find line number */
     224      115249 :         for (r++; *r == ' ' || *r == '\t' || isalpha(*r); r++) ;
     225      115249 :         h = r;
     226      115249 :         for (; *r != '\0' && *r != ' ' && *r != '\t'; r++) ;
     227      115249 :         *r++ = 0;
     228      115249 :         idlc()->setLineNumber((sal_uInt32)atol(h));
     229      115249 :     yylineno = atol(h);
     230             : 
     231             :         /* Find file name, if present */
     232      115249 :         for (; *r != '"'; r++)
     233             :         {
     234           0 :                 if (*r == '\n' || *r == '\0')
     235             :                         return;
     236             :         }
     237      115249 :         h = ++r;
     238      115249 :         for (; *r != '"'; r++) ;
     239      115249 :         *r = 0;
     240      115249 :         if (*h == '\0')
     241           0 :                 idlc()->setFileName(::rtl::OString("standard input"));
     242             :         else
     243      115249 :                 idlc()->setFileName(::rtl::OString(h));
     244             : 
     245      115249 :         bIsInMain = (idlc()->getFileName() == idlc()->getRealFileName()) ? sal_True : sal_False;
     246      115249 :         idlc()->setInMainfile(bIsInMain);            
     247             : }       
     248             : 
     249             : // Suppress any warnings from generated code:
     250             : #if defined __GNUC__
     251             : #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
     252             : #pragma GCC diagnostic ignored "-Wunused-function"
     253             : #pragma GCC diagnostic ignored "-Wunused-label"
     254             : #endif
     255             : #elif defined __SUNPRO_CC
     256             : #pragma disable_warn
     257             : #elif defined _MSC_VER
     258             : #pragma warning(push, 1)
     259             : /**/
     260             : #ifdef yywrap
     261             : #undef  yywrap
     262             : #define yywrap() 1
     263             : #endif
     264             : /**/
     265             : #endif
     266             : %}
     267             : 
     268             : %option noyywrap
     269             : %option never-interactive
     270             : 
     271             : %x DOCU
     272             : %x COMMENT
     273             : 
     274             : DIGIT           [0-9]
     275             : OCT_DIGIT       [0-7]
     276             : HEX_DIGIT       [a-fA-F0-9]
     277             : CAPITAL         [A-Z]
     278             : ALPHA           [a-zA-Z]
     279             : INT_LITERAL     [1-9][0-9]*
     280             : OCT_LITERAL     0{OCT_DIGIT}*
     281             : HEX_LITERAL     (0x|0X){HEX_DIGIT}*
     282             : 
     283             : IDENTIFIER_NEW  ({ALPHA}({ALPHA}|{DIGIT})*)|({CAPITAL}("_"?({ALPHA}|{DIGIT})+)*)
     284             : IDENTIFIER      ("_"?({ALPHA}|{DIGIT})+)*
     285             : 
     286             : %%
     287             : 
     288             : [ \t\r]+        ; /* eat up whitespace */
     289     2283210 : [\n]           {
     290     2231777 :        idlc()->incLineNumber();
     291     2231777 :        yycolumn = 1;
     292     4463554 :        yylineno++;
     293             : }
     294     2231777 : 
     295        4492 : attribute       return IDL_ATTRIBUTE;
     296        6008 : bound           return IDL_BOUND;
     297           0 : case            return IDL_CASE;
     298       15087 : const           return IDL_CONST;
     299        1469 : constants       return IDL_CONSTANTS;
     300       13571 : constrained     return IDL_CONSTRAINED;
     301        1469 : default         return IDL_DEFAULT;
     302        4597 : enum            return IDL_ENUM;
     303       12903 : exception       return IDL_EXCEPTION;
     304       46771 : interface       return IDL_INTERFACE;
     305       12903 : maybeambiguous  return IDL_MAYBEAMBIGUOUS;
     306       42177 : maybedefault    return IDL_MAYBEDEFAULT;
     307         394 : maybevoid       return IDL_MAYBEVOID;
     308      242533 : module          return IDL_MODULE;
     309         394 : needs           return IDL_NEEDS;
     310      242530 : observes        return IDL_OBSERVES;
     311       10020 : optional        return IDL_OPTIONAL;
     312       17531 : property        return IDL_PROPERTY;
     313       34354 : raises          return IDL_RAISES;
     314       19491 : readonly        return IDL_READONLY;
     315       24334 : removable       return IDL_REMOVEABLE;
     316        6961 : service         return IDL_SERVICE;
     317       17765 : sequence        return IDL_SEQUENCE;
     318        5165 : singleton       return IDL_SINGLETON;
     319       29170 : struct          return IDL_STRUCT;
     320         164 : switch          return IDL_SWITCH;
     321       11421 : transient       return IDL_TRANSIENT;
     322         722 : typedef         return IDL_TYPEDEF;
     323          16 : union           return IDL_UNION;
     324         722 : 
     325       16898 : any             return IDL_ANY;                         
     326       35588 : boolean         return IDL_BOOLEAN;
     327        2439 : byte            return IDL_BYTE;
     328       19596 : char            return IDL_CHAR;
     329        4935 : double          return IDL_DOUBLE;
     330        2312 : float           return IDL_FLOAT;
     331        2763 : hyper           return IDL_HYPER;
     332       45094 : long            return IDL_LONG;
     333       21151 : short           return IDL_SHORT;
     334       84235 : string          return IDL_STRING;
     335       26318 : type            return IDL_TYPE;
     336       48309 : unsigned        return IDL_UNSIGNED;
     337       48956 : void            return IDL_VOID;
     338        7762 : 
     339       43522 : TRUE            return IDL_TRUE;
     340           0 : True            return IDL_TRUE;
     341           0 : FALSE           return IDL_FALSE;
     342           0 : False           return IDL_FALSE;
     343           0 : 
     344       79106 : in              return IDL_IN;
     345       81349 : out             return IDL_OUT;
     346          92 : inout           return IDL_INOUT;
     347        2243 : 
     348        1273 : get             return IDL_GET;
     349        2540 : set             return IDL_SET;
     350             : 
     351       62717 : published       return IDL_PUBLISHED;
     352       61358 : 
     353           2 : "..."           return IDL_ELLIPSIS;
     354           2 : 
     355             : ("-")?{INT_LITERAL}+(l|L|u|U)?    {
     356       12554 :                 return asciiToInteger(yytext, &yylval.ival, &yylval.uval);
     357             :             }
     358             : 
     359             : ("-")?{OCT_LITERAL}+(l|L|u|U)?    {
     360         956 :                 return asciiToInteger(yytext, &yylval.ival, &yylval.uval);
     361             :             }
     362             : 
     363             : ("-")?{HEX_LITERAL}+(l|L|u|U)?    {
     364         475 :                 return asciiToInteger(yytext, &yylval.ival, &yylval.uval);
     365             :             }
     366             : 
     367             : ("-")?{DIGIT}+(e|E){1}(("+"|"-")?{DIGIT}+)+(f|F)? |
     368             : ("-")?"."{DIGIT}+((e|E)("+"|"-")?{DIGIT}+)?(f|F)?       |
     369             : ("-")?{DIGIT}*"."{DIGIT}+((e|E)("+"|"-")?{DIGIT}+)?(f|F)?        {
     370          20 :                 yylval.dval = asciiToFloat( yytext );
     371          20 :                                 return IDL_FLOATING_PT_LITERAL;
     372             :             }
     373             : 
     374             : {IDENTIFIER}    {
     375     1314871 :                                 yylval.sval = new ::rtl::OString(yytext);
     376     1314871 :                                 return IDL_IDENTIFIER;
     377             :                         }
     378             : 
     379             : \<\<      {
     380           0 :                 yylval.strval = yytext;
     381           0 :                 return IDL_LEFTSHIFT;
     382             :         }
     383             : \>\>      {
     384           0 :                 yylval.strval = yytext;
     385           0 :                 return IDL_RIGHTSHIFT;
     386             :         }
     387             : \:\:    {
     388      513372 :                 yylval.strval = yytext;
     389     1026744 :                 return IDL_SCOPESEPARATOR;
     390             :         }
     391             : 
     392             : "/*"  { 
     393      179039 :                         BEGIN( COMMENT );
     394      179039 :                         docu = ::rtl::OString();
     395      179039 :                         beginLine = idlc()->getLineNumber();
     396             :                 }
     397      179039 : 
     398             : "/***"        { 
     399           4 :                         BEGIN( COMMENT );
     400           4 :                         docu = ::rtl::OString();
     401           4 :                         beginLine = idlc()->getLineNumber();
     402             :                 }
     403           4 : 
     404             : <COMMENT>[^*]+    {
     405      299114 :                                 docu += ::rtl::OString(yytext);
     406      299114 :                         } 
     407      299114 : 
     408             : <COMMENT>"*"[^*/]+      {
     409     1019438 :                                 docu += ::rtl::OString(yytext);
     410     1019438 :                         }
     411     1019438 : 
     412             : <COMMENT>"**"   {
     413           0 :                                 docu += ::rtl::OString(yytext);
     414             :                         }
     415           0 : 
     416             : <COMMENT>[*]+"/"  {
     417      179043 :                                 docu = docu.trim();
     418      179043 :                 sal_Int32 nIndex = 0;
     419      179043 :                 int count = 0;
     420     1022055 :                 do { docu.getToken( 0, '\n', nIndex ); count++; } while( nIndex != -1 );
     421      179043 :                                 idlc()->setLineNumber( beginLine + count - 1);
     422      179043 :                                 BEGIN( INITIAL );
     423             :                         }
     424      179043 : 
     425             : "/**" {
     426      301186 :                         BEGIN( DOCU );
     427      301186 :                         docu = ::rtl::OString();
     428      301186 :                         beginLine = idlc()->getLineNumber();
     429             :                 }
     430      301186 : 
     431             : <DOCU>[^*\n]+     {
     432     1261143 :                                 docu += ::rtl::OString(yytext);
     433             :                         }
     434     1261143 : 
     435             : <DOCU>"\n"[ \t]*"*"{1}        {
     436        3930 :                                 idlc()->setLineNumber( idlc()->getLineNumber()  + 1);
     437        7860 :                                 docu += ::rtl::OString("\n");
     438             :                         }
     439        3930 : 
     440             : <DOCU>"\n"      {
     441     1210998 :                                 idlc()->setLineNumber( idlc()->getLineNumber()  + 1);
     442     2421996 :                                 docu += ::rtl::OString(yytext);
     443             :                         }
     444     1210998 : 
     445             : <DOCU>"*"[^*^/\n]*      {
     446        1037 :                                 docu += ::rtl::OString(yytext);
     447             :                         }
     448        1037 : 
     449             : <DOCU>"\n"[ \t]*"*/"  {
     450      299890 :                                 docu = docu.trim();
     451      599780 :                                 sal_Int32 nIndex = 0;
     452      299890 :                                 int count = 0;
     453     1500667 :                                 do { docu.getToken( 0, '\n', nIndex ); count++; } while( nIndex != -1 );
     454      299890 :                                 idlc()->setLineNumber( beginLine + count - 1);                
     455      299890 :                                 if ( (nIndex = docu.indexOf("/*")) >= 0 || (nIndex = docu.indexOf("///")) >= 0 )
     456             :                                 {
     457          41 :                     if ( 0 != nIndex &&
     458          27 :                          (docu.getStr()[nIndex - 1] != '"' && docu.getStr()[nIndex - 1] != ':') )
     459           0 :                         idlc()->error()->syntaxError(PS_NoState, idlc()->getLineNumber(),
     460           0 :                                                      "nested documentation strings are not allowed!");
     461             :                                 }
     462      299890 :                                 idlc()->setDocumentation(docu);
     463      299890 :                                 BEGIN( INITIAL );
     464             :                         }
     465      299890 : 
     466             : <DOCU>"*/"      {
     467        1296 :                                 docu = docu.trim();
     468        1296 :                                 sal_Int32 nIndex = 0;
     469        1296 :                                 int count = 0;
     470        2025 :                                 do { docu.getToken( 0, '\n', nIndex ); count++; } while( nIndex != -1 );
     471        1296 :                                 idlc()->setLineNumber( beginLine + count - 1);
     472        1296 :                                 if ( docu.indexOf("/*") >= 0 || docu.indexOf("//") >= 0 )
     473             :                                 {
     474           0 :                     if ( 0 != nIndex &&
     475           0 :                          (docu.getStr()[nIndex - 1] != '"' && docu.getStr()[nIndex - 1] != ':') )
     476           0 :                         idlc()->error()->syntaxError(PS_NoState, idlc()->getLineNumber(),
     477           0 :                                                      "nested documentation strings are not allowed!");
     478             :                                 }
     479        1296 :                                 idlc()->setDocumentation(docu);
     480        1296 :                                 BEGIN( INITIAL );
     481             :                         }
     482        1296 : 
     483             : "//"[^/]{1}.*"\n" {
     484             :                                 /* only a comment */
     485       46996 :                                 ::rtl::OString docStr(yytext);
     486       46996 :                                 docStr = docStr.copy( 0, docStr.lastIndexOf('\n') );
     487       46996 :                                 docStr = docStr.copy( docStr.lastIndexOf('/')+1 );
     488       46996 :                                 docStr = docStr.trim();
     489       46996 :                                 idlc()->incLineNumber();
     490             :                         }
     491       46996 : 
     492             : "///".*"\n"  {
     493        3288 :                                 ::rtl::OString docStr(yytext);
     494        6576 :                                 docStr = docStr.copy( 0, docStr.lastIndexOf('\n') );
     495        3288 :                                 docStr = docStr.copy( docStr.lastIndexOf('/')+1 );
     496        3288 :                                 docStr = docStr.trim();
     497        3288 :                                 idlc()->incLineNumber();
     498        3288 :                                 idlc()->setDocumentation(docStr);
     499             :                         }
     500        3288 : 
     501     1787115 : .       return yytext[0];
     502     1787115 : 
     503             : ^#[ \t]*line[ \t]*[0-9]*" ""\""[^\"]*"\""\n    {
     504      115249 :         parseLineAndFile(yytext);
     505      115249 : }
     506      115249 : 
     507             : ^#[ \t]*[0-9]*" ""\""[^\"]*"\""" "[0-9]*\n {
     508           0 :         parseLineAndFile(yytext);
     509           0 : }
     510           0 : 
     511             : ^#[ \t]*[0-9]*" ""\""[^\"]*"\""\n {
     512           0 :         parseLineAndFile(yytext);
     513           0 : }
     514           0 : 
     515             : ^#[ \t]*[0-9]*\n {
     516           0 :         parseLineAndFile(yytext);
     517           0 : }
     518           0 : 
     519             : ^#[ \t]*ident.*\n {
     520             :         /* ignore cpp ident */
     521           0 :         idlc()->incLineNumber();
     522             : }
     523           0 : 
     524             : ^#[ \t]*pragma[ \t].*\n        {       /* remember pragma */
     525           0 :         idlParsePragma(yytext);
     526           0 :         idlc()->incLineNumber();
     527             : }
     528           0 : 
     529           0 : %%

Generated by: LCOV version 1.10