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 }