ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libBASS/BASSyacc.y
Revision: 1153
Committed: Tue May 11 04:21:52 2004 UTC (20 years, 2 months ago) by gezelter
File size: 5100 byte(s)
Log Message:
BASS changes for adding CutoffGroups to molecules.  Also restructured
the plethora of cutoff radii into one cutoffRadius and one
switchingRadius.  Also removed the useMolecularCutoffs keyword

File Contents

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