1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
/*******************************************************/
/* CUDF solver: cudf.l */
/* Lexical analyser of CUDF problems */
/* (c) Claude Michel I3S (UNSA-CNRS) 2009,2010,2011 */
/*******************************************************/
/* Based on flex lexical analizer generator*/
%{
#include <cudf.h>
#include <stdio.h>
#include <cudf.tab.h>
#define STRLIMIT 5000 /* max string size */
char astring[STRLIMIT];
int strsize = 0;
extern int pidenttype(char *pname);
%}
%x anstr keepstate proptype linestring
%option yylineno
%option noyywrap
%%
preamble: return PREAMBLE;
property: return PROPERTYDEF;
package: return PACKAGE;
version: return VERSION;
depends: return DEPENDS;
conflicts: return CONFLICTS;
provides: return PROVIDES;
installed: return INSTALLED;
was-installed: return WASINSTALLED;
keep: { BEGIN(keepstate); return KEEP; }
true return TRUE;
false return FALSE;
true! return VTRUE;
false! return VFALSE;
= return EQ;
!= return NEQ;
> return SUP;
>= return SUPEQ;
\< return INF;
\<= return INFEQ;
<keepstate>version { BEGIN(INITIAL); return KEEPVERSION; }
<keepstate>package { BEGIN(INITIAL); return KEEPPACKAGE; }
<keepstate>feature { BEGIN(INITIAL); return KEEPFEATURE; }
<keepstate>none { BEGIN(INITIAL); return KEEPNONE; }
<keepstate>[\t ]
<keepstate>. fprintf(stderr, "CUDF scanner error: Unrecognized character in keep state value: %s\n", yytext);
request:[^\n]* return PROBLEM;
install: return INSTALL;
remove: return REMOVE;
upgrade: return UPGRADE;
univ-checksum:[^\n]* /* Ignore */
status-checksum:[^\n]* /* Ignore */
req-checksum:[^\n]* /* Ignore */
\" { strsize = 0; BEGIN(anstr); } /* handling strings */
<anstr>\" { BEGIN(INITIAL); astring[strsize++] = '\0'; return STRING; }
<anstr>\\\" { if (strsize < STRLIMIT) astring[strsize++] = yytext[1];
else { fprintf(stderr, "CUDF error (line %d): string are limited to %d characters.\n", cudflineno, STRLIMIT); exit(-1); } }
<anstr>[^"] { if (strsize < STRLIMIT) astring[strsize++] = yytext[0];
else { fprintf(stderr, "CUDF error (line %d): string are limited to %d characters.\n", cudflineno, STRLIMIT); exit(-1); } }
<linestring>[^\n]* { BEGIN(INITIAL); strcpy(astring, (yytext + 1)); return STRING; }
[+-]?[0-9]+ { strcpy(cudflval.str, yytext); return INTEGER; } /* handling integers */
[a-zA-Z0-9+*_%/\-\.@]*[ \t]*":" { /* user property names */
int l = (int)strlen(yytext), i;
for (i = 0; i < l; i++)
if ((yytext[i] == ' ') || (yytext[i] == '\t')) {
cudflval.str[i] = ':';
break;
} else
cudflval.str[i] = yytext[i];
if (cudflval.str[i-1] != ':') cudflval.str[i++] = ':';
cudflval.str[i] = '\0';
switch(pidenttype(cudflval.str)) {
case pt_bool:
return PIDENT_BOOL;
case pt_int:
return PIDENT_INT;
case pt_nat:
return PIDENT_NAT;
case pt_posint:
return PIDENT_POSINT;
case pt_enum:
return PIDENT_ENUM;
case pt_string:
BEGIN(linestring);
return PIDENT_STRING;
case pt_vpkg:
return PIDENT_VPKG;
case pt_veqpkg:
return PIDENT_VEQPKG;
case pt_vpkglist:
return PIDENT_VPKGLIST;
case pt_veqpkglist:
return PIDENT_VEQPKGLIST;
case pt_vpkgformula:
return PIDENT_VPKGFORMULA;
case pt_none:
default:
return PIDENT;
}
}
[a-zA-Z0-9+*_%/\-\.@()]* { strcpy(cudflval.str, yytext); return IDENT; }
#[^\n]* /* comment */
[,:|\[\]] return yytext[0];
[\t\n ] /* Just ignore spaces */
. fprintf(stderr, "CUDF scanner error: Unrecognized character: %s\n", yytext);
%%
|