ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libBASS/BASSyacc.y
Revision: 957
Committed: Mon Jan 19 16:08:21 2004 UTC (20 years, 6 months ago) by gezelter
File size: 6736 byte(s)
Log Message:
BASS changes to add RigidBodies and LJrcut

File Contents

# User Rev Content
1 mmeineke 377
2     /* define some general tokens */
3    
4     %token MOLECULE ATOM BOND BEND TORSION POSITION MEMBERS CONSTRAINT
5 gezelter 957 %token COMPONENT START_INDEX DEFINED ORIENTATION ZCONSTRAINT RIGIDBODY
6 mmeineke 377
7     /* more advanced tokens */
8    
9     %union {
10     int i_val; /* integer value */
11     double d_val; /* double value */
12     char * s_ptr; /* string pointer */
13     struct node_tag* node_ptr; /* pointer to the statement node tree */
14     }
15    
16     %token <i_val> INTEGER
17     %token <i_val> ARRAY_INDEX
18    
19     %token <d_val> DOUBLE
20    
21     %token <s_ptr> IDENTIFIER
22     %token <s_ptr> QUOTED_STRING
23    
24     %type <node_ptr> stmt
25     %type <node_ptr> stmt_list
26     %type <node_ptr> assignment
27     %type <node_ptr> member
28     %type <node_ptr> constraint
29     %type <node_ptr> orientation
30     %type <node_ptr> position
31     %type <node_ptr> block
32     %type <node_ptr> molecule_block
33     %type <node_ptr> atom_block
34     %type <node_ptr> bond_block
35     %type <node_ptr> bend_block
36     %type <node_ptr> torsion_block
37     %type <node_ptr> component_block
38 mmeineke 675 %type <node_ptr> zconstraint_block
39 gezelter 957 %type <node_ptr> rigidbody_block
40 mmeineke 377
41    
42     %{
43     #include <stdlib.h>
44     #include <stdio.h>
45     #include <string.h>
46    
47 mmeineke 854 #include "node_list.h"
48     #include "make_nodes.h"
49     #include "parse_tree.h"
50     #include "simError.h"
51 mmeineke 377 #ifdef IS_MPI
52     #define __is_lex__
53 mmeineke 854 #include "mpiBASS.h"
54 mmeineke 377 #endif
55    
56     extern int yylineno;
57    
58     struct filename_list{
59     char my_name[300];
60     struct filename_list* next;
61     };
62     extern struct filename_list* yyfile_name;
63    
64     extern void change_in_file( FILE* in_file );
65     extern void yacc_model( char* file_name );
66     extern void kill_lists(void);
67    
68     /* top of the node list */
69    
70     struct node_tag* head_node;
71     struct node_tag* current_node;
72    
73     %}
74    
75     %%
76    
77     program:
78     commands
79     ;
80    
81     commands: /* NULL */
82     | commands stmt {
83     current_node->next_stmt = $2;
84     $2->prev_stmt = current_node;
85     current_node = $2;
86     }
87     ;
88    
89     stmt:
90     assignment { $$ = $1; }
91     | member { $$ = $1; }
92     | constraint { $$ = $1; }
93     | orientation { $$ = $1; }
94     | position { $$ = $1; }
95     | block { $$ = $1; }
96     ;
97    
98     assignment:
99     IDENTIFIER '=' INTEGER ';'
100     { $$ = assign_i( $1, $3 ); }
101     | IDENTIFIER '=' DOUBLE ';'
102     { $$ = assign_d( $1, $3 ); }
103     | IDENTIFIER '=' IDENTIFIER ';'
104     { $$ = assign_s( $1, $3 ); }
105     | IDENTIFIER '=' QUOTED_STRING ';'
106     { $$ = assign_s( $1, $3 ); }
107     ;
108    
109     member:
110     MEMBERS '(' INTEGER ',' INTEGER ')' ';'
111     { $$ = members_2( $3, $5 ); }
112     | MEMBERS '(' INTEGER ',' INTEGER ',' INTEGER ')' ';'
113     { $$ = members_3( $3, $5, $7 ); }
114     | MEMBERS '(' INTEGER ',' INTEGER ',' INTEGER ',' INTEGER ')' ';'
115     { $$ = members_4( $3, $5, $7, $9 ); }
116     ;
117    
118     constraint:
119     CONSTRAINT '(' INTEGER ')' ';'
120     { $$ = constraint( (double)$3 ); }
121     | CONSTRAINT '(' DOUBLE ')' ';'
122     { $$ = constraint( $3 ); }
123     ;
124    
125     orientation:
126     ORIENTATION '(' DOUBLE ',' DOUBLE ',' DOUBLE ')' ';'
127     { $$ = orientation( $3, $5, $7 ); }
128     | ORIENTATION '(' INTEGER ',' DOUBLE ',' DOUBLE ')' ';'
129     { $$ = orientation( (double)$3, $5, $7 ); }
130     | ORIENTATION '(' DOUBLE ',' INTEGER ',' DOUBLE ')' ';'
131     { $$ = orientation( $3, (double)$5, $7 ); }
132     | ORIENTATION '(' DOUBLE ',' DOUBLE ',' INTEGER ')' ';'
133     { $$ = orientation( $3, $5, (double)$7 ); }
134     | ORIENTATION '(' INTEGER ',' INTEGER ',' INTEGER ')' ';'
135     { $$ = orientation( (double)$3, (double)$5, (double)$7 ); }
136     | ORIENTATION '(' DOUBLE ',' INTEGER ',' INTEGER ')' ';'
137     { $$ = orientation( $3, (double)$5, (double)$7 ); }
138     | ORIENTATION '(' INTEGER ',' DOUBLE ',' INTEGER ')' ';'
139     { $$ = orientation( (double)$3, $5, (double)$7 ); }
140     | ORIENTATION '(' INTEGER ',' INTEGER ',' DOUBLE ')' ';'
141     { $$ = orientation( (double)$3, (double)$5, $7 ); }
142     ;
143    
144     position:
145     POSITION '(' DOUBLE ',' DOUBLE ',' DOUBLE ')' ';'
146     { $$ = position( $3, $5, $7 ); }
147     | POSITION '(' INTEGER ',' DOUBLE ',' DOUBLE ')' ';'
148     { $$ = position( (double)$3, $5, $7 ); }
149     | POSITION '(' DOUBLE ',' INTEGER ',' DOUBLE ')' ';'
150     { $$ = position( $3, (double)$5, $7 ); }
151     | POSITION '(' DOUBLE ',' DOUBLE ',' INTEGER ')' ';'
152     { $$ = position( $3, $5, (double)$7 ); }
153     | POSITION '(' INTEGER ',' INTEGER ',' INTEGER ')' ';'
154     { $$ = position( (double)$3, (double)$5, (double)$7 ); }
155     | POSITION '(' DOUBLE ',' INTEGER ',' INTEGER ')' ';'
156     { $$ = position( $3, (double)$5, (double)$7 ); }
157     | POSITION '(' INTEGER ',' DOUBLE ',' INTEGER ')' ';'
158     { $$ = position( (double)$3, $5, (double)$7 ); }
159     | POSITION '(' INTEGER ',' INTEGER ',' DOUBLE ')' ';'
160     { $$ = position( (double)$3, (double)$5, $7 ); }
161     ;
162    
163     block:
164     molecule_block { $$ = $1; }
165     | atom_block { $$ = $1; }
166     | bond_block { $$ = $1; }
167     | bend_block { $$ = $1; }
168     | torsion_block { $$ = $1; }
169 mmeineke 675 | zconstraint_block { $$ = $1; }
170 gezelter 957 | rigidbody_block { $$ = $1; }
171 mmeineke 377 | component_block { $$ = $1; }
172     ;
173    
174     molecule_block:
175     MOLECULE '{' stmt_list '}'
176     { $$ = molecule_blk( $3 ); }
177     ;
178    
179     atom_block:
180     ATOM ARRAY_INDEX '{' stmt_list '}'
181     { $$ = atom_blk( $2, $4 ); }
182     ;
183    
184     bond_block:
185     BOND ARRAY_INDEX '{' stmt_list '}'
186     { $$ = bond_blk( $2, $4 ); }
187     ;
188    
189     bend_block:
190     BEND ARRAY_INDEX '{' stmt_list '}'
191     { $$ = bend_blk( $2, $4 ); }
192     ;
193    
194     torsion_block:
195     TORSION ARRAY_INDEX '{' stmt_list '}'
196     { $$ = torsion_blk( $2, $4 ); }
197     ;
198 mmeineke 675
199     zconstraint_block:
200     ZCONSTRAINT ARRAY_INDEX '{' stmt_list '}'
201     { $$ = zconstraint_blk( $2, $4 ); }
202     ;
203 gezelter 957
204     rigidbody_block:
205     RIGIDBODY ARRAY_INDEX '{' stmt_list '}'
206     { $$ = rigidbody_blk( $2, $4 ); }
207     ;
208 mmeineke 377
209     component_block:
210     COMPONENT '{' stmt_list '}'
211     { $$ = component_blk( $3 ); }
212     ;
213 mmeineke 675
214 mmeineke 377 stmt_list:
215     stmt { $$ = $1; }
216     | stmt_list stmt {
217     $1->next_stmt = $2;
218     $2->prev_stmt = $1;
219     $$ = $2;
220     }
221     ;
222    
223     %%
224    
225     int yyerror( char *err_msg ){
226    
227     sprintf( painCave.errMsg, "yacc parse error in %s at line %d: %s\n",
228     yyfile_name->my_name, yylineno, err_msg );
229     painCave.isFatal = 1;
230     simError();
231     return 0;
232     }
233    
234     void yacc_BASS( char* file_name ){
235    
236     FILE* in_file;
237    
238     head_node = (struct node_tag* )malloc( sizeof( node ) );
239    
240     head_node->type = GLOBAL_HEAD;
241     head_node->index =0;
242     head_node->next_stmt = NULL;
243     head_node->prev_stmt = NULL;
244     head_node->stmt_list = NULL;
245    
246     current_node = head_node;
247    
248     in_file = fopen( file_name, "r" );
249     if( in_file == NULL ){
250     sprintf( painCave.errMsg, "yacc error: couldn't open file =>%s\n",
251     file_name );
252     painCave.isFatal = 1;
253     simError();
254     }
255    
256     yyfile_name =
257     (struct filename_list*)malloc( sizeof( struct filename_list ) );
258     yyfile_name->next = NULL;
259     strcpy( yyfile_name->my_name, file_name );
260     change_in_file( in_file );
261    
262     yyparse();
263    
264     #ifdef IS_MPI
265     strcpy( checkPointMsg, "yyParse successful." );
266     MPIcheckPoint();
267     painCave.isEventLoop = 1;
268     #endif // is_mpi
269    
270     fclose( in_file );
271     kill_lists();
272    
273     pt_me( head_node );
274    
275     #ifdef IS_MPI
276     painCave.isEventLoop = 0;
277     #endif // is_mpi
278    
279     kill_tree( head_node );
280     head_node = NULL;
281     }