Merge branch 'charm' of charmgit:charm into charm
[charm.git] / src / xlat-i / xi-scan.l
1 %{
2 #include <string.h>
3 #include "xi-symbol.h"
4 #include <ctype.h>
5 using namespace xi;
6 #include "xi-grammar.tab.h"
7 #include <list>
8
9 /* Global Variables and Functions - used in grammar.y */
10 unsigned int lineno = 1;
11 int in_bracket=0; /*Horrific hack to get "array length" code snippets (between []'s)*/
12 int in_braces=0; /*Horrific hack to get SDAG entry code snippets (between {}'s)*/
13 int in_int_expr=0;
14 std::list<Entry *> connectEntries;
15 /* Local to file */
16 unsigned char in_comment=0;
17 int search(char *s);
18 int count_newlines(char *s);
19
20 /* We return Tokens only when not in a comment. */
21 #define Return if (!in_comment) return
22 #define Token(x) x
23 #define Yval yylval.strval = strcpy(new char[yyleng+1], yytext)
24
25 #ifdef yywrap
26 #undef yywrap
27 #endif
28
29 %}
30
31 ws      [ \t]+
32 nl      [\n]
33 alpha   [A-Za-z]
34 digit   [0-9]
35
36 name    ({alpha}|[_])({alpha}|{digit}|[_])*
37
38 string1 \'[^\n']*\'
39 string2 \'[^\n']*(\'({ws}|{nl})*\'[^\n']*)+\'
40 string3 \"[^\n"]*\"
41 string4 \"[^\n"]*(\"({ws}|{nl})*\"[^\n"]*)+\"
42 string  {string1}|{string2}|{string3}|{string4}
43
44 int     [-+]?{digit}+
45
46 number  {int}[KkMm]?
47 expo    ([eE][-+]?{digit}+)?
48 real1   {int}\.?{expo}
49 real2   [-+]?{digit}*\.{digit}+{expo}
50 real    {real1}|{real2}
51
52 literal {number}|{real}|{string}
53
54 nonBracket [^][]*
55 nonBraces [^{}]*
56 nonIntExpr [^();,:]*
57
58 %%
59 {nonBracket}    { if (in_bracket) {Yval;return Token(CPROGRAM);} else REJECT;}
60 {nonBraces}     { if (in_braces) {Yval; lineno += count_newlines(yytext); return Token(CPROGRAM);} else REJECT;}
61 {nonIntExpr}    { if (in_int_expr) {Yval;return Token(CPROGRAM);} else REJECT;}
62 "//".*          { /* ignore single line comments */ }
63 "\r"            { /* ignore ^M characters for dos-unix compat */ }
64 "/*"            { in_comment = 1; /* Single line C-style comments */ }
65 "*/"            { in_comment = 0; }
66 "#if"           { Return Token(HASHIF); }
67 "#ifdef"        { Return Token(HASHIFDEF); }
68 "#endif"        { in_comment = 0; /* comments */ }
69 {ws}            { /* ignore white space */ }
70 {nl}            { lineno++;}
71 {number}        { Yval; Return Token(NUMBER); }
72 {literal}       { Yval; Return Token(LITERAL); }
73 {name}          { Return Token(search(yytext)); }
74 .               { Return Token(yytext[0]); }
75 %%
76
77 struct rwtable {
78   const char *res;      int tok;
79 };
80
81 /* Reserved word table */
82 struct rwtable rwtable[] = {
83 {  "module",    MODULE },
84 {  "mainmodule",        MAINMODULE },
85 {  "chare",     CHARE },
86 {  "group",     GROUP },
87 {  "nodegroup",  NODEGROUP },
88 {  "array",     ARRAY },
89 {  "message",   MESSAGE },
90 {  "conditional",CONDITIONAL },
91 {  "extern",    EXTERN },
92 {  "initcall",  INITCALL },
93 {  "initnode",  INITNODE },
94 {  "initproc",  INITPROC },
95 {  "readonly",  READONLY },
96 {  "stacksize", STACKSIZE },
97 {  "threaded",  THREADED },
98 {  "migratable",        MIGRATABLE },
99 {  "PUPable",   PUPABLE },
100 {  "pupable",   PUPABLE },
101 {  "createhere",        CREATEHERE },
102 {  "createhome",        CREATEHOME },
103 {  "nokeep",    NOKEEP },
104 {  "notrace",   NOTRACE },
105 {  "template",  TEMPLATE },
106 {  "class",     CLASS },
107 {  "include",   INCLUDE },
108 {  "sync",      SYNC },
109 {  "iget",       IGET },
110 {  "exclusive", EXCLUSIVE },
111 {  "immediate",  IMMEDIATE },
112 {  "expedited",  SKIPSCHED },
113 {  "inline",    INLINE },
114 {  "local",      LOCAL },
115 {  "virtual",    VIRTUAL },
116 {  "mainchare", MAINCHARE },
117 {  "packed",     PACKED },
118 {  "varsize",    VARSIZE },
119 {  "entry",      ENTRY },
120 {  "int",        INT },
121 {  "short",      SHORT },
122 {  "long",       LONG },
123 {  "char",       CHAR },
124 {  "float",      FLOAT },
125 {  "double",     DOUBLE },
126 {  "unsigned",   UNSIGNED },
127 {  "void",      VOID },
128 {  "const",     CONST },
129 {  "atomic",    ATOMIC },
130 {  "serial",    ATOMIC },
131 {  "forward",   FORWARD },
132 {  "when",      WHEN },
133 {  "while",     WHILE },
134 {  "for",       FOR },
135 {  "forall",    FORALL },
136 {  "if",        IF },
137 {  "else",      ELSE },
138 {  "overlap",   OVERLAP },
139 {  "connect",    CONNECT },
140 {  "publishes",  PUBLISHES },
141 {  "python",     PYTHON },
142 {  "namespace",  NAMESPACE },
143 {  "using",      USING },
144 {  "accel",      ACCEL },
145 {  "readwrite",  READWRITE },
146 {  "writeonly",  WRITEONLY },
147 {  "accelblock", ACCELBLOCK },
148 {  "memcritical", MEMCRITICAL },
149 {  "reductiontarget", REDUCTIONTARGET },
150 {  "case",       CASE },
151 {  "",          0 }
152 };
153
154 int search(char *s)
155 {
156   int i;
157   for(i=0; rwtable[i].tok != 0; i++) {
158     if(strcmp(rwtable[i].res, s) == 0)
159       return(rwtable[i].tok);
160   }
161   yylval.strval = strcpy(new char[yyleng+1], s);
162   return IDENT;
163 }
164
165 // Oh my $DEITY...
166 int count_newlines(char *s) {
167     int count = 0;
168
169     while (*s != '\0') {
170         if (*s == '\n') count++;
171         s++;
172     }
173
174     return count;
175 }
176
177 int yywrap() { return 1; }