fix baseline build (old cairo) - 'cairo_rectangle_int_t' does not name a type
[LibreOffice.git] / unoidl / source / sourceprovider-scanner.l
blobb0e9299b3779edfa2d6ee3055eacc19eb922c908
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  */
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
20 %top {
22 #include "sal/config.h"
24 #include <algorithm>
25 #include <cassert>
26 #include <cstddef>
27 #include <cstring>
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"
39 #include "sourceprovider-parser-requires.hxx"
40 #include "sourceprovider-parser.hxx"
41 #include "sourceprovider-scanner.hxx"
43 namespace unoidl { namespace detail {
45 static std::size_t sourceProviderScannerInput(
46     SourceProviderScannerData * data, char * buffer, std::size_t size)
48     assert(data != 0);
49     if (data->sourcePosition == data->sourceEnd) {
50         return YY_NULL;
51     }
52     assert(data->sourcePosition < data->sourceEnd);
53     size = std::min<std::size_t>(size, data->sourceEnd - data->sourcePosition);
54     std::memcpy(buffer, data->sourcePosition, size);
55     data->sourcePosition += size;
56     return size;
59 } }
61 #define YY_INPUT(buf, result, max_size) ((result) = \
62     ::unoidl::detail::sourceProviderScannerInput(yyextra, (buf), (max_size)))
64 namespace {
66 int nonZeroIntegerLiteral(
67     char const * text, std::size_t length, sal_Int16 radix, sal_uInt64 * value,
68     unoidl::detail::SourceProviderScannerData * data)
70     assert(text != 0);
71     assert(length != 0);
72     assert(value != 0);
73     assert(data != 0);
74     std::size_t n = length;
75     switch (text[length - 1]) {
76     case 'L':
77     case 'U':
78     case 'l':
79     case 'u':
80         --n;
81         break;
82     default:
83         break;
84     }
85     *value = OString(text, n).toUInt64(radix);
86     if (*value == 0) {
87         data->errorMessage = "out-of-range integer literal "
88             + OUString(text, length, RTL_TEXTENCODING_ASCII_US);
89         return TOK_ERROR;
90     }
91     return TOK_INTEGER;
98 %x comment1 comment2 doc docdepr
100 DIGIT [0-9]
101 UPPER [A-Z]
102 LOWER [a-z]
103 ALPHA {UPPER}|{LOWER}
104 ALNUM {DIGIT}|{ALPHA}
108 [ \t\r]
109 \n *yylloc = yylineno;
111 "//" BEGIN comment1;
112 "#" BEGIN comment1; //TODO: only at start of line
113 <comment1>.
114 <comment1>\n *yylloc = yylineno; BEGIN INITIAL;
116 "/*" BEGIN comment2;
117 "/**" BEGIN doc;
118 "/***" BEGIN comment2;
120 <comment2,doc>"*/" BEGIN INITIAL;
121 <docdepr>"*/" BEGIN INITIAL; return TOK_DEPRECATED;
123 <comment2,docdepr>.
124 <comment2,doc,docdepr>\n *yylloc = yylineno;
125 <comment2,doc,docdepr><<EOF>> {
126     yyextra->errorMessage = "unterminated comment";
127     return TOK_ERROR;
130 <doc>[ \t\r]
131 <doc>"@deprecated" BEGIN docdepr;
132 <doc>"*"
133 <doc>[^ \t\r\n*]+
135 [%&()*+,\-/:;<=>[\]^{|}~] return yytext[0];
137 "..." return TOK_ELLIPSIS;
138 "::" return TOK_COLONS;
139 "<<" return TOK_LEFTSHIFT;
140 ">>" return TOK_RIGHTSHIFT;
142 "FALSE" return TOK_FALSE;
143 "False" return TOK_FALSE;
144 "TRUE" return TOK_TRUE;
145 "True" return TOK_TRUE;
146 "any" return TOK_ANY;
147 "attribute" return TOK_ATTRIBUTE;
148 "boolean" return TOK_BOOLEAN;
149 "bound" return TOK_BOUND;
150 "byte" return TOK_BYTE;
151 "char" return TOK_CHAR;
152 "const" return TOK_CONST;
153 "constants" return TOK_CONSTANTS;
154 "constrained" return TOK_CONSTRAINED;
155 "double" return TOK_DOUBLE;
156 "enum" return TOK_ENUM;
157 "exception" return TOK_EXCEPTION;
158 "float" return TOK_FLOAT;
159 "get" return TOK_GET;
160 "hyper" return TOK_HYPER;
161 "in" return TOK_IN;
162 "inout" return TOK_INOUT;
163 "interface" return TOK_INTERFACE;
164 "long" return TOK_LONG;
165 "maybeambiguous" return TOK_MAYBEAMBIGUOUS;
166 "maybedefault" return TOK_MAYBEDEFAULT;
167 "maybevoid" return TOK_MAYBEVOID;
168 "module" return TOK_MODULE;
169 "optional" return TOK_OPTIONAL;
170 "out" return TOK_OUT;
171 "property" return TOK_PROPERTY;
172 "published" return TOK_PUBLISHED;
173 "raises" return TOK_RAISES;
174 "readonly" return TOK_READONLY;
175 "removable" return TOK_REMOVABLE;
176 "sequence" return TOK_SEQUENCE;
177 "service" return TOK_SERVICE;
178 "set" return TOK_SET;
179 "short" return TOK_SHORT;
180 "singleton" return TOK_SINGLETON;
181 "string" return TOK_STRING;
182 "struct" return TOK_STRUCT;
183 "transient" return TOK_TRANSIENT;
184 "type" return TOK_TYPE;
185 "typedef" return TOK_TYPEDEF;
186 "unsigned" return TOK_UNSIGNED;
187 "void" return TOK_VOID;
189 {UPPER}("_"?{ALNUM})*|{LOWER}{ALNUM}* {
190     yylval->sval = new OString(yytext);
191     return TOK_IDENTIFIER;
194 ({ALPHA}|"_")({ALNUM}|"_")* {
195 #if 1 //TODO
196     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
204 0+[LUlu]? |
205 0[Xx]0+[LUlu]? {
206     yylval->ival = 0;
207     return TOK_INTEGER;
210 0[0-7]+[LUlu]? {
211     return nonZeroIntegerLiteral(yytext, yyleng, 8, &yylval->ival, yyextra);
214 [1-9]{DIGIT}*[LUlu]? {
215     return nonZeroIntegerLiteral(yytext, yyleng, 10, &yylval->ival, yyextra);
218 0[Xx][0-9A-Fa-f]+[LUlu]? {
219     return nonZeroIntegerLiteral(
220         yytext + 2, yyleng - 2, 16, &yylval->ival, yyextra);
223 {DIGIT}+[Ee][+\-]?{DIGIT}+[Ff]? |
224 {DIGIT}*"."{DIGIT}+([Ee][+\-]?{DIGIT}+)?[Ff]? {
225     rtl_math_ConversionStatus s;
226     yylval->fval = rtl_math_stringToDouble(
227         yytext, yytext + yyleng, '.', 0, &s, 0);
228     if (s == rtl_math_ConversionStatus_OutOfRange) {
229         yyextra->errorMessage = "out-of-range floating-point literal "
230             + OUString(yytext, yyleng, RTL_TEXTENCODING_ASCII_US);
231         return TOK_ERROR;
232     }
233     return TOK_FLOATING;
236 {DIGIT}({ALNUM}|"_")* {
237     yyextra->errorMessage = "illegal numeric literal "
238         + OUString(yytext, yyleng, RTL_TEXTENCODING_ASCII_US);
239     return TOK_ERROR;
242 . {
243     unsigned char c = yytext[0];
244     yyextra->errorMessage = c >= ' ' && c <= '~'
245         ? OUString("invalid character \"" + OUString(sal_Unicode(c)) + "\"")
246         : OUString(
247             "invalid byte x" + OUString::number(c, 16).toAsciiUpperCase());
248     return TOK_ERROR;
253 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */