Initial revision
[charm.git] / src / xlat-i / xi-parse.bison
1
2 %{
3
4 #include "xi-symbol.h"
5
6 extern int lineno;
7 extern int yylex (void) ;
8 extern Module *thismodule ;
9
10 // Local data and functions
11 int yyerror(char *);
12
13 %}
14
15 /* Conventions:
16         Terminal symbols (tokens) are written in CAPITALS.
17 */
18
19 %union {
20         char *strval;
21         int intval;
22 }
23
24 %token BOC
25 %token CHARE
26 %token ENTRY
27 %token MESSAGE
28 %token READONLY
29 %token TABLE
30 %token THREADED
31 %token EXTERN
32 %token <strval> IDENTIFIER
33
34 %type <strval> Id ChareName EntryName MessageName ReadOnlyName TableName
35 %type <strval> SimpleType PtrType OptionalMessagePtr
36 %type <intval> OptionalThreaded OptionalExtern
37
38 %%
39
40 File    :       ItemElist
41         ;
42
43 ItemElist:      /* empty */
44         |       ItemList
45         ;
46
47 ItemList:       Item
48         |       ItemList Item
49         ;
50
51 Item    :       Boc | Chare | Message | ReadOnly | Table
52         ;
53
54 OptionalExtern
55         :       /* empty */
56                 { $$ = FALSE; }
57         |       EXTERN
58                 { $$ = TRUE; }
59         ;
60
61 Boc     :       OptionalExtern BOC ChareName '{'
62                 {
63                         Chare *c = new Chare($3, BOC, $1) ;
64                         delete $3;
65                         thismodule->AddChare(c) ;
66                 }
67                 EntryList '}' ';'
68         ;
69
70 Chare   :       OptionalExtern CHARE ChareName '{'
71                 {
72                         Chare *c = new Chare($3, CHARE, $1) ;
73                         delete $3;
74                         thismodule->AddChare(c) ;
75                 }
76                 EntryList '}' ';'
77         ;
78
79 ChareName:      Id
80         ;
81
82 Id      :       IDENTIFIER
83         ;
84
85 EntryList:      Entry
86         |       EntryList Entry
87         ;
88
89 OptionalMessagePtr
90         :       /* empty */
91                 {
92                         $$ = NULL;
93                 }
94         |       MessageName '*'
95         ;
96
97 OptionalThreaded
98         :       /* empty */
99                 { $$ = FALSE; }
100         |       THREADED
101                 { $$ = TRUE; }
102         ;
103
104 Entry   :       OptionalThreaded OptionalMessagePtr ENTRY EntryName '(' OptionalMessagePtr ')' ';'
105                 {
106                         thismodule->chares->AddEntry($4, $6, $1, $2) ;
107                         delete $4; delete $6;
108                 }
109         ;
110
111 EntryName:      Id
112         ;
113
114 Message :       OptionalExtern MESSAGE MessageName ';'
115                 {
116                         Message *m = new Message($3, 0, $1) ;
117                         delete $3;
118                         thismodule->AddMessage(m) ;
119                 }
120         ;
121
122 MessageName:    Id
123         ;
124
125 ReadOnly:       READONLY SimpleType ReadOnlyName ';'
126                 {
127                         ReadOnly *r = new ReadOnly($3, $2, 0) ;
128                         delete $2;
129                         thismodule->AddReadOnly(r) ;
130                 }
131         |       READONLY PtrType ReadOnlyName ';'
132                 {
133                         ReadOnly *r = new ReadOnly($3, $2, 1) ;
134                         delete $2;
135                         thismodule->AddReadOnly(r) ;
136                 }
137         ;
138
139 SimpleType:     Id
140         ;
141
142 PtrType :       Id '*'
143                 {
144                         $$ = strcat(strcpy(new char[2+strlen($1)], $1), "*");
145                         delete $1;
146                 }
147         ;
148
149 ReadOnlyName:   Id
150         ;
151
152 Table   :       TABLE TableName ';'
153                 {
154                         Table *t = new Table($2) ;
155                         delete $2;
156                         thismodule->AddTable(t) ;
157                 }
158         ;
159
160 TableName:      Id
161         ;
162
163 %%
164
165 int yyerror(char *mesg)
166 {
167         cout << "Syntax error at line " << lineno << ": " << mesg << endl;
168         return 0;
169 }
170