ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/mdParser/MDParser.g
Revision: 1776
Committed: Thu Aug 9 15:52:59 2012 UTC (12 years, 8 months ago) by gezelter
File size: 11242 byte(s)
Log Message:
Fixes to mdParser to handle vector assignments, fixes for VelocityVerletIntegrator deleting rnemd_ when it doesn't exist yet.

File Contents

# User Rev Content
1 tim 770 header
2     {
3    
4     #include "antlr/CharScanner.hpp"
5     #include "utils/StringUtils.hpp"
6     #include "mdParser/FilenameObserver.hpp"
7     }
8    
9     options
10     {
11     language = "Cpp";
12     }
13    
14     class MDParser extends Parser;
15    
16     options
17     {
18     k = 3;
19     exportVocab = MD;
20     buildAST = true;
21     codeGenMakeSwitchThreshold = 2;
22     codeGenBitsetTestThreshold = 3;
23    
24     }
25    
26     tokens
27     {
28     COMPONENT = "component";
29     MOLECULE = "molecule";
30     ZCONSTRAINT = "zconstraint";
31 cli2 1360 RESTRAINT = "restraint";
32 tim 770 ATOM = "atom";
33     BOND = "bond";
34     BEND = "bend";
35     TORSION = "torsion";
36 cli2 1275 INVERSION = "inversion";
37 tim 770 RIGIDBODY = "rigidBody";
38     CUTOFFGROUP = "cutoffGroup";
39     FRAGMENT = "fragment";
40     MEMBERS = "members";
41 cli2 1275 CENTER = "center";
42 tim 770 POSITION = "position";
43     ORIENTATION = "orientation";
44 gezelter 1731 FLUCQ = "flucQ";
45     RNEMD = "RNEMD";
46 gezelter 1746 MINIMIZER = "minimizer";
47 tim 770 ENDBLOCK;
48     }
49    
50    
51     mdfile : (statement)*
52     ;
53    
54     statement : assignment
55 gezelter 1731 | componentblock
56     | moleculeblock
57     | zconstraintblock
58     | restraintblock
59     | flucqblock
60     | rnemdblock
61 gezelter 1746 | minimizerblock
62 gezelter 1731 ;
63    
64 tim 770 assignment : ID ASSIGNEQUAL^ constant SEMICOLON!
65     ;
66    
67 tim 814 constant : intConst
68 gezelter 1776 | floatConst
69     | vectorConst
70 tim 770 | ID
71     | StringLiteral
72     ;
73    
74     componentblock : COMPONENT^ LCURLY! (assignment)* RCURLY {#RCURLY->setType(ENDBLOCK);}
75     ;
76    
77     zconstraintblock : ZCONSTRAINT^ LCURLY! (assignment)* RCURLY {#RCURLY->setType(ENDBLOCK);}
78     ;
79 cli2 1360
80     restraintblock : RESTRAINT^ LCURLY! (assignment)* RCURLY {#RCURLY->setType(ENDBLOCK);}
81     ;
82 gezelter 1731
83     flucqblock : FLUCQ^ LCURLY! (assignment)* RCURLY {#RCURLY->setType(ENDBLOCK);}
84     ;
85    
86     rnemdblock : RNEMD^ LCURLY! (assignment)* RCURLY {#RCURLY->setType(ENDBLOCK);}
87     ;
88 gezelter 1746
89     minimizerblock : MINIMIZER^ LCURLY! (assignment)* RCURLY {#RCURLY->setType(ENDBLOCK);}
90     ;
91 tim 770
92     moleculeblock : MOLECULE^ LCURLY! (moleculestatement)* RCURLY {#RCURLY->setType(ENDBLOCK);}
93     ;
94    
95     moleculestatement : assignment
96     | atomblock
97     | bondblock
98     | bendblock
99     | torsionblock
100 gezelter 1277 | inversionblock
101 tim 770 | rigidbodyblock
102     | cutoffgroupblock
103     | fragmentblock
104     ;
105    
106     atomblock : ATOM^ LBRACKET! intConst RBRACKET! LCURLY! (atomstatement)* RCURLY {#RCURLY->setType(ENDBLOCK);}
107     ;
108    
109     atomstatement : assignment
110 tim 814 | POSITION^ LPAREN! doubleNumberTuple RPAREN! SEMICOLON!
111     | ORIENTATION^ LPAREN! doubleNumberTuple RPAREN! SEMICOLON!
112 tim 770 ;
113    
114    
115     bondblock : BOND^ (LBRACKET! intConst! RBRACKET!)? LCURLY!(bondstatement)* RCURLY {#RCURLY->setType(ENDBLOCK);}
116     ;
117    
118     bondstatement : assignment
119     | MEMBERS^ LPAREN! inttuple RPAREN! SEMICOLON!
120     ;
121    
122     bendblock : BEND^ (LBRACKET! intConst! RBRACKET!)? LCURLY! (bendstatement)* RCURLY {#RCURLY->setType(ENDBLOCK);}
123     ;
124    
125     bendstatement : assignment
126     | MEMBERS^ LPAREN! inttuple RPAREN! SEMICOLON!
127     ;
128    
129     torsionblock : TORSION^ (LBRACKET! intConst! RBRACKET!)? LCURLY!(torsionstatement)* RCURLY {#RCURLY->setType(ENDBLOCK);}
130     ;
131    
132     torsionstatement : assignment
133     | MEMBERS^ LPAREN! inttuple RPAREN! SEMICOLON!
134     ;
135    
136 cli2 1275 inversionblock : INVERSION^ (LBRACKET! intConst! RBRACKET!)? LCURLY!(inversionstatement)* RCURLY {#RCURLY->setType(ENDBLOCK);}
137     ;
138    
139     inversionstatement : assignment
140     | CENTER^ LPAREN! intConst RPAREN! SEMICOLON!
141     ;
142    
143 tim 770 rigidbodyblock : RIGIDBODY^ LBRACKET! intConst RBRACKET! LCURLY!(rigidbodystatement)* RCURLY {#RCURLY->setType(ENDBLOCK);}
144     ;
145    
146     rigidbodystatement : assignment
147     | MEMBERS^ LPAREN! inttuple RPAREN! SEMICOLON!
148     ;
149    
150     cutoffgroupblock : CUTOFFGROUP^ (LBRACKET! intConst! RBRACKET!)? LCURLY! (cutoffgroupstatement)* RCURLY {#RCURLY->setType(ENDBLOCK);}
151     ;
152    
153     cutoffgroupstatement : assignment
154     | MEMBERS^ LPAREN! inttuple RPAREN! SEMICOLON!
155     ;
156    
157     fragmentblock : FRAGMENT^ LBRACKET! intConst RBRACKET! LCURLY! (fragmentstatement)* RCURLY {#RCURLY->setType(ENDBLOCK);}
158     ;
159    
160     fragmentstatement : assignment
161     ;
162    
163    
164    
165 tim 814 doubleNumberTuple : doubleNumber (COMMA! doubleNumber)*
166 tim 770 ;
167    
168     inttuple : intConst (COMMA! intConst)*
169     ;
170    
171     protected
172     intConst
173 tim 814 : NUM_INT | NUM_LONG
174 tim 770 ;
175    
176     protected
177 tim 814 doubleNumber :
178 tim 770 (intConst | floatConst)
179     ;
180    
181     protected
182     floatConst
183     :
184 tim 814 NUM_FLOAT | NUM_DOUBLE
185 tim 770 ;
186    
187 gezelter 1776 protected
188     vectorConst
189     :
190     LPAREN^ doubleNumber COMMA doubleNumber COMMA doubleNumber RPAREN
191     ;
192 tim 770
193     class MDLexer extends Lexer;
194    
195     options
196     {
197     k = 3;
198     exportVocab = MD;
199     testLiterals = false;
200     }
201    
202     tokens {
203     DOT;
204     }
205    
206     {
207    
208    
209     int deferredLineCount;
210     FilenameObserver* observer;
211    
212     public:
213     void setObserver(FilenameObserver* osv) {observer = osv;}
214     void initDeferredLineCount() { deferredLineCount = 0;}
215     void deferredNewline() {
216     deferredLineCount++;
217     }
218    
219    
220     virtual void newline() {
221     for (;deferredLineCount>0;deferredLineCount--) {
222     CharScanner::newline();
223     }
224     CharScanner::newline();
225     }
226    
227     }
228    
229    
230     // Operators:
231    
232     ASSIGNEQUAL : '=' ;
233     COLON : ':' ;
234     COMMA : ',' ;
235     QUESTIONMARK : '?' ;
236     SEMICOLON : ';' ;
237    
238     LPAREN : '(' ;
239     RPAREN : ')' ;
240     LBRACKET : '[' ;
241     RBRACKET : ']' ;
242     LCURLY : '{' ;
243     RCURLY : '}' ;
244    
245     Whitespace
246     :
247     ( // whitespace ignored
248     (' ' |'\t' | '\f')
249     | // handle newlines
250     ( '\r' '\n' // MS
251     | '\r' // Mac
252     | '\n' // Unix
253     ) { newline(); }
254     | // handle continuation lines
255     ( '\\' '\r' '\n' // MS
256     | '\\' '\r' // Mac
257     | '\\' '\n' // Unix
258     ) {printf("CPP_parser.g continuation line detected\n");
259     deferredNewline();}
260     )
261     {_ttype = ANTLR_USE_NAMESPACE(antlr)Token::SKIP;}
262     ;
263    
264     Comment
265     :
266     "/*"
267     ( {LA(2) != '/'}? '*'
268     | EndOfLine {deferredNewline();}
269     | ~('*'| '\r' | '\n')
270     )*
271     "*/" {_ttype = ANTLR_USE_NAMESPACE(antlr)Token::SKIP;}
272     ;
273    
274     CPPComment
275     :
276     "//" (~('\n' | '\r'))* EndOfLine
277     {_ttype = ANTLR_USE_NAMESPACE(antlr)Token::SKIP; newline();}
278     ;
279    
280     PREPROC_DIRECTIVE
281     options{paraphrase = "a line directive";}
282     :
283     '#' LineDirective
284     {_ttype = ANTLR_USE_NAMESPACE(antlr)Token::SKIP; newline();}
285     ;
286    
287     protected
288     LineDirective
289     :
290     {
291     deferredLineCount = 0;
292     }
293     ("line")? // this would be for if the directive started "#line"
294     (Space)+
295 gezelter 1390 n:Decimal { setLine(OpenMD::lexi_cast<int>(n->getText()) - 1); }
296 tim 770 (Space)+
297     (sl:StringLiteral) {std::string filename = sl->getText().substr(1,sl->getText().length()-2); observer->notify(filename);}
298     ((Space)+ Decimal)* // To support cpp flags (GNU)
299     EndOfLine
300     ;
301    
302     protected
303     Space
304     :
305     (' '|'\t'|'\f')
306     ;
307    
308    
309     // Literals:
310    
311     /*
312     * Note that we do NOT handle tri-graphs nor multi-byte sequences.
313     */
314    
315     /*
316     * Note that we can't have empty character constants (even though we
317     * can have empty strings :-).
318     */
319     CharLiteral
320     :
321     '\'' (Escape | ~('\'')) '\''
322     ;
323    
324     /*
325     * Can't have raw imbedded newlines in string constants. Strict reading of
326     * the standard gives odd dichotomy between newlines & carriage returns.
327     * Go figure.
328     */
329     StringLiteral
330     :
331     '"'
332     ( Escape
333     |
334     ( "\\\r\n" // MS
335     | "\\\r" // MAC
336     | "\\\n" // Unix
337     ) {deferredNewline();}
338     |
339     ~('"'|'\r'|'\n'|'\\')
340     )*
341     '"'
342     ;
343    
344     protected
345     EndOfLine
346     :
347     ( options{generateAmbigWarnings = false;}:
348     "\r\n" // MS
349     | '\r' // Mac
350     | '\n' // Unix
351     )
352     ;
353    
354     /*
355     * Handle the various escape sequences.
356     *
357     * Note carefully that these numeric escape *sequences* are *not* of the
358     * same form as the C language numeric *constants*.
359     *
360     * There is no such thing as a binary numeric escape sequence.
361     *
362     * Octal escape sequences are either 1, 2, or 3 octal digits exactly.
363     *
364     * There is no such thing as a decimal escape sequence.
365     *
366     * Hexadecimal escape sequences are begun with a leading \x and continue
367     * until a non-hexadecimal character is found.
368     *
369     * No real handling of tri-graph sequences, yet.
370     */
371    
372     protected
373     Escape
374     :
375     '\\'
376     ( options{warnWhenFollowAmbig=false;}:
377     'a'
378     | 'b'
379     | 'f'
380     | 'n'
381     | 'r'
382     | 't'
383     | 'v'
384     | '"'
385     | '\''
386     | '\\'
387     | '?'
388     | ('0'..'3') (options{warnWhenFollowAmbig=false;}: Digit (options{warnWhenFollowAmbig=false;}: Digit)? )?
389     | ('4'..'7') (options{warnWhenFollowAmbig=false;}: Digit)?
390     | 'x' (options{warnWhenFollowAmbig=false;}: Digit | 'a'..'f' | 'A'..'F')+
391     )
392     ;
393    
394    
395     protected
396 tim 814 Vocabulary
397     :
398     '\3'..'\377'
399     ;
400    
401    
402     ID
403     options {testLiterals = true;}
404     :
405     ('a'..'z'|'A'..'Z'|'_')
406     ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*
407     ;
408    
409    
410     protected
411 tim 770 Digit
412     :
413     '0'..'9'
414     ;
415    
416     protected
417     Decimal
418     :
419     ('0'..'9')+
420     ;
421    
422 tim 814 // hexadecimal digit (again, note it's protected!)
423 tim 770 protected
424 tim 814 HEX_DIGIT
425     : ('0'..'9'|'A'..'F'|'a'..'f')
426     ;
427 tim 770
428    
429 tim 814 // a numeric literal
430     NUM_INT
431     {
432     bool isDecimal = false;
433     ANTLR_USE_NAMESPACE(antlr)RefToken t = ANTLR_USE_NAMESPACE(antlr)nullToken;
434     }
435     : ('+' | '-')?
436     (
437     '.' {_ttype = DOT;}
438     ( ('0'..'9')+ (EXPONENT)? (f1:FLOAT_SUFFIX {t=f1;})?
439     {
440     if ( t &&
441     (t->getText().find('f') != ANTLR_USE_NAMESPACE(std)string::npos ||
442     t->getText().find('F') != ANTLR_USE_NAMESPACE(std)string::npos ) ) {
443     _ttype = NUM_FLOAT;
444     }
445     else {
446     _ttype = NUM_DOUBLE; // assume double
447     }
448     }
449     )?
450 tim 770
451 tim 814 | ( '0' {isDecimal = true;} // special case for just '0'
452     ( ('x'|'X')
453     ( // hex
454     // the 'e'|'E' and float suffix stuff look
455     // like hex digits, hence the (...)+ doesn't
456     // know when to stop: ambig. ANTLR resolves
457     // it correctly by matching immediately. It
458     // is therefor ok to hush warning.
459     options {
460     warnWhenFollowAmbig=false;
461     }
462     : HEX_DIGIT
463     )+
464     | //float or double with leading zero
465     (('0'..'9')+ ('.'|EXPONENT|FLOAT_SUFFIX)) => ('0'..'9')+
466     | ('0'..'7')+ // octal
467     )?
468     | ('1'..'9') ('0'..'9')* {isDecimal=true;} // non-zero decimal
469     )
470     ( ('l'|'L') { _ttype = NUM_LONG; }
471    
472     // only check to see if it's a float if looks like decimal so far
473     | {isDecimal}?
474     ( '.' ('0'..'9')* (EXPONENT)? (f2:FLOAT_SUFFIX {t=f2;})?
475     | EXPONENT (f3:FLOAT_SUFFIX {t=f3;})?
476     | f4:FLOAT_SUFFIX {t=f4;}
477     )
478     {
479     if ( t &&
480     (t->getText().find('f') != ANTLR_USE_NAMESPACE(std)string::npos ||
481     t->getText().find('F') != ANTLR_USE_NAMESPACE(std)string::npos ) ) {
482     _ttype = NUM_FLOAT;
483     }
484     else {
485     _ttype = NUM_DOUBLE; // assume double
486     }
487     }
488     )?
489     )
490     ;
491    
492     // a couple protected methods to assist in matching floating point numbers
493 tim 770 protected
494 tim 814 EXPONENT
495 gezelter 848 : ('e'|'E'|'d'|'D') ('+'|'-')? ('0'..'9')+
496 tim 814 ;
497 tim 770
498     protected
499 tim 814 FLOAT_SUFFIX
500     : 'f'|'F'|'d'|'D'
501     ;

Properties

Name Value
svn:executable *
svn:keywords Author Id Revision Date