ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/OpenMD/branches/development/src/mdParser/MDParser.g
Revision: 1731
Committed: Thu May 31 12:25:30 2012 UTC (12 years, 11 months ago) by gezelter
File size: 10966 byte(s)
Log Message:
Reorganized source directories, added RNEMD and flucQ blocks for
options parsing.

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

Properties

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