Initial revision
[charm.git] / src / xlat-i / xi-scan.flex
1
2 %{
3
4 #include "xi-symbol.h"
5 #include "xi-parse.tab.h"
6 #include <ctype.h>
7
8 /* Global Variables and Functions - used in parse.y */
9 unsigned int lineno = 1;
10 // int yylex()
11
12 /* Local to file */
13 static unsigned char in_comment=FALSE;
14 int binsearch(char *s, int lb, int ub);
15 static int check_name(char *);
16
17 /* We return Tokens only when not in a comment. */
18 #define Return if (!in_comment) return
19 #define Token(x) x
20
21 #ifdef yywrap
22 #undef yywrap
23 #endif
24 %}
25
26 ws      [ \t]+
27 nl      [\n]
28 alpha   [A-Za-z]
29 digit   [0-9]
30
31 name    ({alpha})({alpha}|{digit}|[_])*
32
33 string1 \'[^\n']*\'
34 string2 \'[^\n']*(\'\'[^\n']*)+\'
35 string3 \"[^\n"]*\"
36 string  {string1}|{string2}
37
38 int     [-+]?{digit}+
39
40 expo    ([eE][-+]?{digit}+)?
41 real1   {int}\.?{expo}
42 real2   [-+]?{digit}*\.{digit}+{expo}
43 real    {real1}|{real2}
44
45 bool    TRUE|FALSE
46
47 %%
48 "//".*          { /* ignore single line comments */ }
49 "/*"            { in_comment = TRUE; /* Single line C-style comments */ }
50 "*/"            { in_comment = FALSE; }
51 {ws}            { /* ignore white space */ }
52 {nl}            { lineno++; /* Return Token(NL); */ }
53 {name}          { Return Token(check_name(yytext)); }
54 .               { Return Token(yytext[0]); }
55 %%
56
57 /* {nl}/{nl}    { lineno++; } */
58 struct rwtable {
59         char *s;        int tok;
60 };
61
62 /* Reserved word table */
63 struct rwtable rwtable[] = {
64         "",             9,
65 /* MUST BE IN SORTED ORDER */
66         "boc",          BOC,
67         "chare",        CHARE,
68         "entry",        ENTRY,
69         "extern",       EXTERN,
70         "group",        BOC,
71         "message",      MESSAGE,
72         "readonly",     READONLY,
73         "table",        TABLE,
74         "threaded",     THREADED,
75 /* MAKE SURE TO UPDATE THE NUMBER OF ENTRIES ABOVE */
76         "",             0,
77 };
78
79 int binsearch(char *s, int lb, int ub)
80 {
81         int mid = (lb+ub)/2;
82         int result = 0;
83
84         if (lb>ub) return 0;    /* not found */
85         else if ((result = strcmp(s, rwtable[mid].s))==0)
86                 return mid; /* found */
87         else if (result<0) return binsearch(s, lb, mid-1);      /* lower half */
88         else return binsearch(s, mid+1, ub);    /* upper half */
89 }
90
91 /* Distinguish between reserved words and identifiers. */
92 static int check_name(char *ss)
93 {
94         int i;
95         char *s = new char[1+strlen(ss)];
96
97         /* for case insensitivity, we convert to lower case */
98         for(i=0; i<= strlen(ss); i++) s[i] = tolower(ss[i]);
99
100         /* Is "s" a reserved word ? */
101         if ( (i=binsearch(s, 1, rwtable[0].tok)) )
102                 {       delete s;
103                         return rwtable[i].tok;
104                 }
105
106         /* ... otherwise it must be an identifier. */
107         yylval.strval = strcpy(new char[yyleng+1], yytext);
108 /*
109         yylval = createASTnode( AIDENTIFIER, lookup(s),
110                         NULL, NULL, NULL, NULL);
111 */
112
113         delete s;
114
115         return IDENTIFIER;
116 }
117
118 int yywrap() { return 1; }