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: */
|