File: cudf.l

package info (click to toggle)
mccs 1%3A1.1-8
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 724 kB
  • sloc: ansic: 6,051; yacc: 652; makefile: 148; lex: 129; sh: 26
file content (140 lines) | stat: -rw-r--r-- 5,191 bytes parent folder | download | duplicates (6)
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);

%%