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