LCOV - code coverage report
Current view: top level - unoidl/source - sourceprovider-scanner.l (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 97 115 84.3 %
Date: 2015-06-13 12:38:46 Functions: 2 2 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  */
       9             : 
      10             : %option bison-bridge
      11             : %option bison-locations
      12             : %option extra-type="unoidl::detail::SourceProviderScannerData *"
      13             : %option never-interactive
      14             : %option nounistd
      15             : %option noyywrap
      16             : %option reentrant
      17             : %option warn
      18             : %option yylineno
      19             : 
      20             : %top {
      21             : 
      22             : #include "sal/config.h"
      23             : 
      24             : #include <algorithm>
      25             : #include <cassert>
      26             : #include <cstddef>
      27             : #include <cstring>
      28             : 
      29             : }
      30             : 
      31             : %{
      32             : 
      33             : #include "rtl/math.h"
      34             : #include "rtl/string.hxx"
      35             : #include "rtl/ustring.hxx"
      36             : #include "rtl/textenc.h"
      37             : #include "sal/types.h"
      38             : 
      39             : #include "sourceprovider-parser-requires.hxx"
      40             : #include "sourceprovider-parser.hxx"
      41             : #include "sourceprovider-scanner.hxx"
      42             : 
      43             : namespace unoidl { namespace detail {
      44             : 
      45       11696 : static std::size_t sourceProviderScannerInput(
      46             :     SourceProviderScannerData * data, char * buffer, std::size_t size)
      47             : {
      48             :     assert(data != 0);
      49       11696 :     if (data->sourcePosition == data->sourceEnd) {
      50        5621 :         return YY_NULL;
      51             :     }
      52             :     assert(data->sourcePosition < data->sourceEnd);
      53        6075 :     size = std::min<std::size_t>(size, data->sourceEnd - data->sourcePosition);
      54        6075 :     std::memcpy(buffer, data->sourcePosition, size);
      55        6075 :     data->sourcePosition += size;
      56        6075 :     return size;
      57             : }
      58             : 
      59             : } }
      60             : 
      61             : #define YY_INPUT(buf, result, max_size) ((result) = \
      62             :     ::unoidl::detail::sourceProviderScannerInput(yyextra, (buf), (max_size)))
      63             : 
      64             : namespace {
      65             : 
      66       14027 : int nonZeroIntegerLiteral(
      67             :     char const * text, std::size_t length, sal_Int16 radix, sal_uInt64 * value,
      68             :     unoidl::detail::SourceProviderScannerData * data)
      69             : {
      70             :     assert(text != 0);
      71             :     assert(length != 0);
      72             :     assert(value != 0);
      73             :     assert(data != 0);
      74       14027 :     std::size_t n = length;
      75       14027 :     switch (text[length - 1]) {
      76             :     case 'L':
      77             :     case 'U':
      78             :     case 'l':
      79             :     case 'u':
      80           0 :         --n;
      81           0 :         break;
      82             :     default:
      83       14027 :         break;
      84             :     }
      85       14027 :     *value = OString(text, n).toUInt64(radix);
      86       14027 :     if (*value == 0) {
      87           6 :         data->errorMessage = "out-of-range integer literal "
      88           9 :             + OUString(text, length, RTL_TEXTENCODING_ASCII_US);
      89           3 :         return TOK_ERROR;
      90             :     }
      91       14024 :     return TOK_INTEGER;
      92             : }
      93             : 
      94             : }
      95             : 
      96             : %}
      97             : 
      98             : %x comment1 comment2 doc docdepr
      99             : 
     100             : DIGIT [0-9]
     101             : UPPER [A-Z]
     102             : LOWER [a-z]
     103             : ALPHA {UPPER}|{LOWER}
     104             : ALNUM {DIGIT}|{ALPHA}
     105             : 
     106             : %%
     107             : 
     108             : [ \t\r]
     109      667395 : \n *yylloc = yylineno;
     110      183801 : 
     111        2345 : "//" BEGIN comment1;
     112        2345 : "#" BEGIN comment1; //TODO: only at start of line
     113       23230 : <comment1>.
     114     1020396 : <comment1>\n *yylloc = yylineno; BEGIN INITIAL;
     115       25575 : 
     116       16788 : "/*" BEGIN comment2;
     117       16788 : "/**" BEGIN doc;
     118       20114 : "/***" BEGIN comment2;
     119           4 : 
     120       36368 : <comment2,doc>"*/" BEGIN INITIAL;
     121       36368 : <docdepr>"*/" BEGIN INITIAL; return TOK_DEPRECATED;
     122             : 
     123             : <comment2,docdepr>.
     124     4900929 : <comment2,doc,docdepr>\n *yylloc = yylineno;
     125      195424 : <comment2,doc,docdepr><<EOF>> {
     126           0 :     yyextra->errorMessage = "unterminated comment";
     127           0 :     return TOK_ERROR;
     128             : }
     129             : 
     130             : <doc>[ \t\r]
     131     1222146 : <doc>"@deprecated" BEGIN docdepr;
     132         538 : <doc>"*"
     133        1249 : <doc>[^ \t\r\n*]+
     134      599856 : 
     135      236495 : [%&()*+,\-/:;<=>[\]^{|}~] return yytext[0];
     136             : 
     137          14 : "..." return TOK_ELLIPSIS;
     138       85213 : "::" return TOK_COLONS;
     139           0 : "<<" return TOK_LEFTSHIFT;
     140           0 : ">>" return TOK_RIGHTSHIFT;
     141             : 
     142           1 : "FALSE" return TOK_FALSE;
     143           0 : "False" return TOK_FALSE;
     144           0 : "TRUE" return TOK_TRUE;
     145           0 : "True" return TOK_TRUE;
     146        1926 : "any" return TOK_ANY;
     147        1358 : "attribute" return TOK_ATTRIBUTE;
     148        3829 : "boolean" return TOK_BOOLEAN;
     149         161 : "bound" return TOK_BOUND;
     150         568 : "byte" return TOK_BYTE;
     151          87 : "char" return TOK_CHAR;
     152       13903 : "const" return TOK_CONST;
     153        1461 : "constants" return TOK_CONSTANTS;
     154           1 : "constrained" return TOK_CONSTRAINED;
     155         692 : "double" return TOK_DOUBLE;
     156         396 : "enum" return TOK_ENUM;
     157         462 : "exception" return TOK_EXCEPTION;
     158         180 : "float" return TOK_FLOAT;
     159         111 : "get" return TOK_GET;
     160         243 : "hyper" return TOK_HYPER;
     161       10992 : "in" return TOK_IN;
     162          74 : "inout" return TOK_INOUT;
     163        9217 : "interface" return TOK_INTERFACE;
     164       14313 : "long" return TOK_LONG;
     165           0 : "maybeambiguous" return TOK_MAYBEAMBIGUOUS;
     166           4 : "maybedefault" return TOK_MAYBEDEFAULT;
     167         199 : "maybevoid" return TOK_MAYBEVOID;
     168       22450 : "module" return TOK_MODULE;
     169        2692 : "optional" return TOK_OPTIONAL;
     170         141 : "out" return TOK_OUT;
     171        5848 : "property" return TOK_PROPERTY;
     172        6303 : "published" return TOK_PUBLISHED;
     173        3525 : "raises" return TOK_RAISES;
     174         705 : "readonly" return TOK_READONLY;
     175           1 : "removable" return TOK_REMOVABLE;
     176        2111 : "sequence" return TOK_SEQUENCE;
     177        3893 : "service" return TOK_SERVICE;
     178         126 : "set" return TOK_SET;
     179        5089 : "short" return TOK_SHORT;
     180         200 : "singleton" return TOK_SINGLETON;
     181        5658 : "string" return TOK_STRING;
     182         787 : "struct" return TOK_STRUCT;
     183          16 : "transient" return TOK_TRANSIENT;
     184         208 : "type" return TOK_TYPE;
     185         109 : "typedef" return TOK_TYPEDEF;
     186         204 : "unsigned" return TOK_UNSIGNED;
     187        4395 : "void" return TOK_VOID;
     188             : 
     189             : {UPPER}("_"?{ALNUM})*|{LOWER}{ALNUM}* {
     190      178722 :     yylval->sval = new OString(yytext);
     191      178722 :     return TOK_IDENTIFIER;
     192             : }
     193             : 
     194             : ({ALPHA}|"_")({ALNUM}|"_")* {
     195             : #if 1 //TODO
     196          88 :     yylval->sval=new OString(yytext);return TOK_IDENTIFIER;
     197             : #else
     198             :     yyextra->errorMessage = "illegal identifier "
     199             :         + OUString(yytext, yyleng, RTL_TEXTENCODING_ASCII_US);
     200             :     return TOK_ERROR;
     201             : #endif
     202             : }
     203             : 
     204             : 0+[LUlu]? |
     205             : 0[Xx]0+[LUlu]? {
     206        1038 :     yylval->ival = 0;
     207        1038 :     return TOK_INTEGER;
     208             : }
     209             : 
     210             : 0[0-7]+[LUlu]? {
     211          25 :     return nonZeroIntegerLiteral(yytext, yyleng, 8, &yylval->ival, yyextra);
     212             : }
     213             : 
     214             : [1-9]{DIGIT}*[LUlu]? {
     215       13763 :     return nonZeroIntegerLiteral(yytext, yyleng, 10, &yylval->ival, yyextra);
     216             : }
     217             : 
     218             : 0[Xx][0-9A-Fa-f]+[LUlu]? {
     219             :     return nonZeroIntegerLiteral(
     220         239 :         yytext + 2, yyleng - 2, 16, &yylval->ival, yyextra);
     221             : }
     222             : 
     223             : {DIGIT}+[Ee][+\-]?{DIGIT}+[Ff]? |
     224             : {DIGIT}*"."{DIGIT}+([Ee][+\-]?{DIGIT}+)?[Ff]? {
     225             :     rtl_math_ConversionStatus s;
     226             :     yylval->fval = rtl_math_stringToDouble(
     227          22 :         yytext, yytext + yyleng, '.', 0, &s, 0);
     228          22 :     if (s == rtl_math_ConversionStatus_OutOfRange) {
     229           0 :         yyextra->errorMessage = "out-of-range floating-point literal "
     230           0 :             + OUString(yytext, yyleng, RTL_TEXTENCODING_ASCII_US);
     231           0 :         return TOK_ERROR;
     232             :     }
     233          22 :     return TOK_FLOATING;
     234             : }
     235             : 
     236             : {DIGIT}({ALNUM}|"_")* {
     237           0 :     yyextra->errorMessage = "illegal numeric literal "
     238           0 :         + OUString(yytext, yyleng, RTL_TEXTENCODING_ASCII_US);
     239           0 :     return TOK_ERROR;
     240             : }
     241             : 
     242             : . {
     243           2 :     unsigned char c = yytext[0];
     244           6 :     yyextra->errorMessage = c >= ' ' && c <= '~'
     245           6 :         ? OUString("invalid character \"" + OUString(sal_Unicode(c)) + "\"")
     246             :         : OUString(
     247           4 :             "invalid byte x" + OUString::number(c, 16).toAsciiUpperCase());
     248           2 :     return TOK_ERROR;
     249             : }
     250             : 
     251           0 : %%
     252           0 : 
     253             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11