ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/mdParser/MDParser.g
Revision: 1746
Committed: Wed Jun 6 02:18:54 2012 UTC (12 years, 11 months ago) by gezelter
File size: 11111 byte(s)
Log Message:
added a minimizer parsing block

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

Properties

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