Warning, /frameworks/kholidays/src/parsers/plan2/holidayscannerplan.lpp is written in an unsupported language. File is not indexed.
0001 /*
0002 Original version from plan:
0003 SPDX-FileCopyrightText: Thomas Driemeyer <thomas@bitrot.de>
0004
0005 Adapted for use in KOrganizer:
0006 SPDX-FileCopyrightText: Preston Brown <pbrown@kde.org> and
0007 SPDX-FileCopyrightText: Reinhold Kainhofer <reinhold@kainhofer.com>
0008
0009 Major rewrite using Bison C++ skeleton:
0010 SPDX-FileCopyrightText: 2010 John Layt <john@layt.net>
0011
0012 SPDX-License-Identifier: LGPL-2.0-or-later
0013 */
0014
0015 %{ /*** C/C++ Declarations ***/
0016 # include <cstdlib>
0017 # include <errno.h>
0018 # include <limits.h>
0019 # include <string>
0020
0021 # include <kholidays_debug.h>
0022
0023 # include "holidayscannerplan_p.h"
0024 # include "holidayparserdriverplan_p.h"
0025 # include "holidayparserplan.hpp"
0026
0027 /* import the parser's token type into a local typedef */
0028 typedef KHolidays::HolidayParserPlan::token token;
0029 typedef KHolidays::HolidayParserPlan::token_type token_type;
0030
0031 /* By default yylex returns int, we use token_type. Unfortunately yyterminate
0032 * by default returns 0, which is not of token_type. */
0033 # define yyterminate() return token::END
0034
0035 /* This disables inclusion of unistd.h, which is not available under Visual C++
0036 * on Win32. The C++ scanner uses STL streams instead. */
0037 # define YY_NO_UNISTD_H
0038 %}
0039
0040 /*** Flex Declarations and Options ***/
0041
0042 /* enable c++ scanner class generation */
0043 %option c++
0044
0045 /* change the name of the scanner class. results in "HolidayScannerFlexLexer" */
0046 %option prefix="HolidayScanner"
0047
0048 /* the manual says "somewhat more optimized" */
0049 %option batch
0050
0051 /* enable scanner to generate debug output. disable this for release
0052 * versions. */
0053 %option debug
0054
0055 /* no support for include files is planned */
0056 %option yywrap nounput
0057
0058 /* enables the use of start condition stacks */
0059 %option stack
0060
0061 %option 8bit
0062
0063 /* The following paragraph suffices to track locations accurately. Each time
0064 * yylex is invoked, the begin position is moved onto the end position. */
0065 %{
0066 # define YY_USER_ACTION yylloc->columns( yyleng );
0067 %}
0068
0069 %% /*** Regular Expressions Part ***/
0070
0071 %{
0072 /* code to place at the beginning of yylex() */
0073 // reset location
0074 yylloc->step();
0075 %}
0076
0077 #.*\n { yylloc->lines( yyleng ); yylloc->step(); }
0078 ^:.*\n { yylloc->lines( yyleng ); yylloc->step(); }
0079 [ \t\r]+ { yylloc->step(); }
0080 [\n]+ { yylloc->lines( yyleng ); yylloc->step(); }
0081 [-+*/%.!?:()\[\]] { return KHolidays::HolidayParserPlan::token_type( *yytext ); }
0082
0083 country { return token::COUNTRY; }
0084 language { return token::LANGUAGE; }
0085 name { return token::NAME; }
0086 description { return token::DESCRIPTION; }
0087
0088 [0-9]+ { yylval->ival = atoi( yytext ); return token::NUMBER; }
0089
0090 \"[^"]*\" { yylval->sval = strdup( yytext + 1 );
0091 yylval->sval[ strlen( yylval->sval ) - 1 ] = 0;
0092 return token::STRING; }
0093
0094 every ;
0095 day ;
0096 days ;
0097 on ;
0098 to ;
0099 in { return token::INOP; }
0100 if { return token::IF; }
0101 plus { return token::PLUS; }
0102 minus { return token::MINUS; }
0103 year { return token::YEAR; }
0104 leapyear { return token::LEAPYEAR; }
0105 easter { return token::EASTER; }
0106 pascha { return token::PASCHA; }
0107 length { return token::LENGTH; }
0108 shift { return token::SHIFT; }
0109
0110 "==" { return token::EQ; }
0111 "!=" { return token::NE; }
0112 "<=" { return token::LE; }
0113 ">=" { return token::GE; }
0114 "<" { return token::LT; }
0115 ">" { return token::GT; }
0116 "&&" { return token::AND;}
0117 "||" { return token::OR; }
0118
0119 1st|first { yylval->ival = 1; return token::NUMBER; }
0120 2nd|second { yylval->ival = 2; return token::NUMBER; }
0121 3rd|third { yylval->ival = 3; return token::NUMBER; }
0122 4th|fourth { yylval->ival = 4; return token::NUMBER; }
0123 5th|fifth { yylval->ival = 5; return token::NUMBER; }
0124 last { yylval->ival = 99999; return token::NUMBER; }
0125 any { yylval->ival = -99999; return token::NUMBER; }
0126 noop { yylval->ival = 0; return token::NUMBER; }
0127
0128 before { yylval->ival = -1; return token::NUMBER; }
0129 after { yylval->ival = 1; return token::NUMBER; }
0130
0131 public { yylval->sval = (char *)"public"; return token::CATEGORY; }
0132 civil { yylval->sval = (char *)"civil"; return token::CATEGORY; }
0133 religious { yylval->sval = (char *)"religious"; return token::CATEGORY; }
0134 school { yylval->sval = (char *)"school"; return token::CATEGORY; }
0135 government { yylval->sval = (char *)"government"; return token::CATEGORY; }
0136 financial { yylval->sval = (char *)"financial"; return token::CATEGORY; }
0137 cultural { yylval->sval = (char *)"cultural"; return token::CATEGORY; }
0138 commemorative { yylval->sval = (char *)"commemorative"; return token::CATEGORY; }
0139 historical { yylval->sval = (char *)"historical"; return token::CATEGORY; }
0140 nameday { yylval->sval = (char *)"nameday"; return token::CATEGORY; }
0141 seasonal { yylval->sval = (char *)"seasonal"; return token::CATEGORY; }
0142
0143 gregorian { yylval->sval = (char *)"gregorian"; return token::CALENDAR; }
0144 julian { yylval->sval = (char *)"julian"; return token::CALENDAR; }
0145
0146 january { yylval->ival = 1; return token::MONTH; }
0147 february { yylval->ival = 2; return token::MONTH; }
0148 march { yylval->ival = 3; return token::MONTH; }
0149 april { yylval->ival = 4; return token::MONTH; }
0150 may { yylval->ival = 5; return token::MONTH; }
0151 june { yylval->ival = 6; return token::MONTH; }
0152 july { yylval->ival = 7; return token::MONTH; }
0153 august { yylval->ival = 8; return token::MONTH; }
0154 september { yylval->ival = 9; return token::MONTH; }
0155 october { yylval->ival = 10; return token::MONTH; }
0156 november { yylval->ival = 11; return token::MONTH; }
0157 december { yylval->ival = 12; return token::MONTH; }
0158
0159 monday { yylval->ival = 1; return token::WDAY; }
0160 tuesday { yylval->ival = 2; return token::WDAY; }
0161 wednesday { yylval->ival = 3; return token::WDAY; }
0162 thursday { yylval->ival = 4; return token::WDAY; }
0163 friday { yylval->ival = 5; return token::WDAY; }
0164 saturday { yylval->ival = 6; return token::WDAY; }
0165 sunday { yylval->ival = 7; return token::WDAY; }
0166
0167 coptic { yylval->sval = (char *)"coptic"; return token::CALENDAR; }
0168
0169 thoout { yylval->ival = 1; return token::MONTH; }
0170 paope { yylval->ival = 2; return token::MONTH; }
0171 hathor { yylval->ival = 3; return token::MONTH; }
0172 kiahk { yylval->ival = 4; return token::MONTH; }
0173 tobe { yylval->ival = 5; return token::MONTH; }
0174 meshir { yylval->ival = 6; return token::MONTH; }
0175 paremhotep { yylval->ival = 7; return token::MONTH; }
0176 parmoute { yylval->ival = 8; return token::MONTH; }
0177 pashons { yylval->ival = 9; return token::MONTH; }
0178 paone { yylval->ival = 10; return token::MONTH; }
0179 epep { yylval->ival = 11; return token::MONTH; }
0180 mesore { yylval->ival = 12; return token::MONTH; }
0181 koujinabot { yylval->ival = 13; return token::MONTH; }
0182
0183 pesnau { yylval->ival = 1; return token::WDAY; }
0184 pshoment { yylval->ival = 2; return token::WDAY; }
0185 peftoou { yylval->ival = 3; return token::WDAY; }
0186 ptiou { yylval->ival = 4; return token::WDAY; }
0187 psoou { yylval->ival = 5; return token::WDAY; }
0188 psabbaton { yylval->ival = 6; return token::WDAY; }
0189 tkyriake { yylval->ival = 7; return token::WDAY; }
0190
0191 ethiopian { yylval->sval = (char *)"ethiopian"; return token::CALENDAR; }
0192
0193 meskerem { yylval->ival = 1; return token::MONTH; }
0194 tequemt { yylval->ival = 2; return token::MONTH; }
0195 hedar { yylval->ival = 3; return token::MONTH; }
0196 tahsas { yylval->ival = 4; return token::MONTH; }
0197 ter { yylval->ival = 5; return token::MONTH; }
0198 yakatit { yylval->ival = 6; return token::MONTH; }
0199 magabit { yylval->ival = 7; return token::MONTH; }
0200 miyazya { yylval->ival = 8; return token::MONTH; }
0201 genbot { yylval->ival = 9; return token::MONTH; }
0202 sene { yylval->ival = 10; return token::MONTH; }
0203 hamle { yylval->ival = 11; return token::MONTH; }
0204 nehase { yylval->ival = 12; return token::MONTH; }
0205 pagumen { yylval->ival = 13; return token::MONTH; }
0206
0207 segno { yylval->ival = 1; return token::WDAY; }
0208 maksegno { yylval->ival = 2; return token::WDAY; }
0209 rob { yylval->ival = 3; return token::WDAY; }
0210 hamus { yylval->ival = 4; return token::WDAY; }
0211 arb { yylval->ival = 5; return token::WDAY; }
0212 qedame { yylval->ival = 6; return token::WDAY; }
0213 ehud { yylval->ival = 7; return token::WDAY; }
0214
0215 hebrew { yylval->sval = (char *)"hebrew"; return token::CALENDAR; }
0216
0217 tishrey { yylval->ival = 1; return token::MONTH; }
0218 heshvan { yylval->ival = 2; return token::MONTH; }
0219 kislev { yylval->ival = 3; return token::MONTH; }
0220 tevet { yylval->ival = 4; return token::MONTH; }
0221 shvat { yylval->ival = 5; return token::MONTH; }
0222 adar { yylval->ival = 6; return token::MONTH; }
0223 nisan { yylval->ival = 7; return token::MONTH; }
0224 iyar { yylval->ival = 8; return token::MONTH; }
0225 sivan { yylval->ival = 9; return token::MONTH; }
0226 tamuz { yylval->ival = 10; return token::MONTH; }
0227 av { yylval->ival = 11; return token::MONTH; }
0228 elul { yylval->ival = 12; return token::MONTH; }
0229 adari { yylval->ival = 13; return token::MONTH; }
0230 adarii { yylval->ival = 14; return token::MONTH; }
0231
0232 yomsheni { yylval->ival = 1; return token::WDAY; }
0233 yomshlishi { yylval->ival = 2; return token::WDAY; }
0234 yomrevii { yylval->ival = 3; return token::WDAY; }
0235 yomchamishi { yylval->ival = 4; return token::WDAY; }
0236 yomshishi { yylval->ival = 5; return token::WDAY; }
0237 shabbat { yylval->ival = 6; return token::WDAY; }
0238 yomrishon { yylval->ival = 7; return token::WDAY; }
0239
0240 hijri { yylval->sval = (char *)"hijri"; return token::CALENDAR; }
0241
0242 muharram { yylval->ival = 1; return token::MONTH; }
0243 safar { yylval->ival = 2; return token::MONTH; }
0244 rabialawal { yylval->ival = 3; return token::MONTH; }
0245 rabialthaani { yylval->ival = 4; return token::MONTH; }
0246 jumaadaalawal { yylval->ival = 5; return token::MONTH; }
0247 jumaadaalthaani { yylval->ival = 6; return token::MONTH; }
0248 rajab { yylval->ival = 7; return token::MONTH; }
0249 shaban { yylval->ival = 8; return token::MONTH; }
0250 ramadan { yylval->ival = 9; return token::MONTH; }
0251 shawwal { yylval->ival = 10; return token::MONTH; }
0252 thualqidah { yylval->ival = 11; return token::MONTH; }
0253 thualhijjah { yylval->ival = 12; return token::MONTH; }
0254
0255 yaumalithnain { yylval->ival = 1; return token::WDAY; }
0256 yaualthulatha { yylval->ival = 2; return token::WDAY; }
0257 yaumalarbia { yylval->ival = 3; return token::WDAY; }
0258 yaumalkhamees { yylval->ival = 4; return token::WDAY; }
0259 yaumaljumma { yylval->ival = 5; return token::WDAY; }
0260 yaumalsabt { yylval->ival = 6; return token::WDAY; }
0261 yaumalahad { yylval->ival = 7; return token::WDAY; }
0262
0263 indiannational { yylval->sval = (char *)"indiannational"; return token::CALENDAR; }
0264
0265 chaitra { yylval->ival = 1; return token::MONTH; }
0266 vaishakh { yylval->ival = 2; return token::MONTH; }
0267 jyaishtha { yylval->ival = 3; return token::MONTH; }
0268 ashadha { yylval->ival = 4; return token::MONTH; }
0269 shravana { yylval->ival = 5; return token::MONTH; }
0270 bhadrapad { yylval->ival = 6; return token::MONTH; }
0271 ashwin { yylval->ival = 7; return token::MONTH; }
0272 kartik { yylval->ival = 8; return token::MONTH; }
0273 agrahayana { yylval->ival = 9; return token::MONTH; }
0274 paush { yylval->ival = 10; return token::MONTH; }
0275 magh { yylval->ival = 11; return token::MONTH; }
0276 phalgun { yylval->ival = 12; return token::MONTH; }
0277
0278 somavara { yylval->ival = 1; return token::WDAY; }
0279 mangalva { yylval->ival = 2; return token::WDAY; }
0280 budhavara { yylval->ival = 3; return token::WDAY; }
0281 guruvara { yylval->ival = 4; return token::WDAY; }
0282 sukravara { yylval->ival = 5; return token::WDAY; }
0283 sanivara { yylval->ival = 6; return token::WDAY; }
0284 raviara { yylval->ival = 7; return token::WDAY; }
0285
0286 jalali { yylval->sval = (char *)"jalali"; return token::CALENDAR; }
0287
0288 farvardin { yylval->ival = 1; return token::MONTH; }
0289 ordibehesht { yylval->ival = 2; return token::MONTH; }
0290 khordad { yylval->ival = 3; return token::MONTH; }
0291 tir { yylval->ival = 4; return token::MONTH; }
0292 mordad { yylval->ival = 5; return token::MONTH; }
0293 shahrivar { yylval->ival = 6; return token::MONTH; }
0294 mehr { yylval->ival = 7; return token::MONTH; }
0295 aban { yylval->ival = 8; return token::MONTH; }
0296 azar { yylval->ival = 9; return token::MONTH; }
0297 dei { yylval->ival = 10; return token::MONTH; }
0298 bahman { yylval->ival = 11; return token::MONTH; }
0299 esfand { yylval->ival = 12; return token::MONTH; }
0300
0301 doshanbe { yylval->ival = 1; return token::WDAY; }
0302 seshanbe { yylval->ival = 2; return token::WDAY; }
0303 chaharshanbe { yylval->ival = 3; return token::WDAY; }
0304 panjshanbe { yylval->ival = 4; return token::WDAY; }
0305 jumee { yylval->ival = 5; return token::WDAY; }
0306 shanbe { yylval->ival = 6; return token::WDAY; }
0307 yekshanbe { yylval->ival = 7; return token::WDAY; }
0308
0309 . { LexerError( yytext ); }
0310
0311 %% /*** Additional Code ***/
0312
0313 namespace KHolidays {
0314
0315 HolidayScannerPlan::HolidayScannerPlan(std::istream* in, std::ostream* out)
0316 : HolidayScannerFlexLexer(in, out)
0317 {
0318 }
0319
0320 HolidayScannerPlan::~HolidayScannerPlan()
0321 {
0322 }
0323
0324 void HolidayScannerPlan::set_debug(bool b)
0325 {
0326 yy_flex_debug = b;
0327 }
0328
0329 } // namespace KHolidays
0330
0331 /* This implementation of HolidayScannerFlexLexer::yylex() is required to fill the
0332 * vtable of the class HolidayScannerFlexLexer. We define the scanner's main yylex
0333 * function via YY_DECL to reside in the HolidayScannerPlan class instead. */
0334
0335 #ifdef yylex
0336 #undef yylex
0337 #endif
0338
0339 int HolidayScannerFlexLexer::yylex()
0340 {
0341 qCDebug(KHOLIDAYS_LOG) << "in HolidayScannerFlexLexer::yylex() !";
0342 return 0;
0343 }
0344
0345 /* When the scanner receives an end-of-file indication from YY_INPUT, it then
0346 * checks the yywrap() function. If yywrap() returns false (zero), then it is
0347 * assumed that the function has gone ahead and set up `yyin' to point to
0348 * another input file, and scanning continues. If it returns true (non-zero),
0349 * then the scanner terminates, returning 0 to its caller. */
0350
0351 int HolidayScannerFlexLexer::yywrap()
0352 {
0353 return 1;
0354 }