ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/mdParser/MDTreeParser.g
Revision: 2513
Committed: Fri Dec 16 02:57:00 2005 UTC (18 years, 7 months ago) by tim
File size: 9546 byte(s)
Log Message:
replace grammar for numerical parsing

File Contents

# User Rev Content
1 tim 2469 header
2     {
3     #include <stack>
4     #include "io/Globals.hpp"
5     #include "utils/StringUtils.hpp"
6     using namespace std;
7     using namespace oopse;
8     }
9     options
10     {
11     language = "Cpp";
12     }
13    
14     class MDTreeParser extends TreeParser;
15    
16     options
17     {
18     k = 3;
19     importVocab = MD;
20     }
21     {
22     public:
23     Globals* walkTree(ANTLR_USE_NAMESPACE(antlr)RefAST tree)
24     {
25     currConf = new Globals;
26     blockStack.push(currConf);
27     mdfile(tree);
28     return currConf;
29     }
30     private:
31     Globals* currConf;
32     stack<DataHolder*> blockStack;
33     }
34     mdfile : (statement)* {blockStack.top()->validate(); blockStack.pop();}
35     ;
36    
37     statement : assignment
38     | componentblock
39     | moleculeblock
40     | zconstraintblock
41     ;
42    
43    
44     assignment : #(ASSIGNEQUAL id:ID constant[#id]) //{blockStack.top()->assign(#ID->getText(),);}
45     ;
46    
47 tim 2513 constant [ANTLR_USE_NAMESPACE(antlr)RefAST id]
48     {
49     int ival;
50     double dval;
51     }
52     : ival=intConst {blockStack.top()->assign(id->getText(), ival);}
53     | dval=floatConst {blockStack.top()->assign(id->getText(), dval);}
54 tim 2469 | str1:ID {blockStack.top()->assign(id->getText(), str1->getText());}
55     | str2:StringLiteral { std::string s = str2->getText();
56     s = s.substr(1, s.length()-2);
57     blockStack.top()->assign(id->getText(),s);
58     }
59     ;
60    
61    
62     componentblock : #(COMPONENT {Component* currComponet = new Component(); blockStack.push(currComponet);}
63     (assignment)*
64     ENDBLOCK ) {blockStack.top()->validate();blockStack.pop(); currConf->addComponent(currComponet);}
65     ;
66    
67     zconstraintblock : #(ZCONSTRAINT {ZConsStamp* currZConsStamp = new ZConsStamp(); blockStack.push(currZConsStamp);}
68     (assignment)*
69     ENDBLOCK ) {blockStack.top()->validate();blockStack.pop(); currConf->addZConsStamp(currZConsStamp);}
70     ;
71    
72     moleculeblock : #(MOLECULE {MoleculeStamp* currMoleculeStamp = new MoleculeStamp(); blockStack.push(currMoleculeStamp);}
73     (moleculestatement)*
74     ENDBLOCK ) {blockStack.top()->validate(); blockStack.pop(); currConf->addMoleculeStamp(currMoleculeStamp);}
75     ;
76    
77     moleculestatement : assignment
78     | atomblock
79     | bondblock
80     | bendblock
81     | torsionblock
82     | rigidbodyblock
83     | cutoffgroupblock
84     | fragmentblock
85     ;
86    
87     atomblock
88     {
89     int index;
90     }
91     : #(ATOM index=intConst {AtomStamp* currAtomStamp = new AtomStamp(index); blockStack.push(currAtomStamp);}
92     (atomstatement)*
93     ENDBLOCK ) {
94     blockStack.top()->validate();
95     blockStack.pop();
96     MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
97     currMoleculeStamp->addAtomStamp(currAtomStamp);
98     }
99     ;
100    
101     atomstatement
102     {
103     vector<double> dvec;
104     AtomStamp* currAtomStamp = static_cast<AtomStamp*>(blockStack.top());
105    
106     }
107     : assignment
108 tim 2513 | #(POSITION dvec=doubleNumberTuple) {currAtomStamp->setPosition(dvec);}
109     | #(ORIENTATION dvec=doubleNumberTuple) {currAtomStamp->setOrientation(dvec);}
110 tim 2469 ;
111    
112    
113     bondblock : #(BOND {BondStamp* currBondStamp = new BondStamp(); blockStack.push(currBondStamp);}
114     (bondstatement)*
115     ENDBLOCK ) {
116     blockStack.pop();
117     MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
118     currMoleculeStamp->addBondStamp(currBondStamp);
119     }
120     ;
121    
122     bondstatement
123     {
124     vector<int> ivec;
125     BondStamp* currBondStamp = static_cast<BondStamp*>(blockStack.top());
126     }
127     : assignment
128     | #(MEMBERS ivec=inttuple) {currBondStamp->setMembers(ivec);}
129     ;
130    
131     bendblock : #(BEND {BendStamp* currBendStamp = new BendStamp(); blockStack.push(currBendStamp);}
132     (bendstatement)*
133     ENDBLOCK) {
134     blockStack.top()->validate();
135     blockStack.pop();
136     MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
137     currMoleculeStamp->addBendStamp(currBendStamp);
138     }
139     ;
140    
141     bendstatement
142     {
143     vector<int> ivec;
144     BendStamp* currBendStamp = static_cast<BendStamp*>(blockStack.top());
145     }
146     : assignment
147     | #(MEMBERS ivec=inttuple) {currBendStamp->setMembers(ivec);}
148     ;
149    
150     torsionblock : #(TORSION {TorsionStamp* currTorsionStamp = new TorsionStamp(); blockStack.push(currTorsionStamp);}
151     (torsionstatement)*
152     ENDBLOCK ) {
153     blockStack.top()->validate();
154     blockStack.pop();
155     MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
156     currMoleculeStamp->addTorsionStamp(currTorsionStamp);
157     }
158     ;
159    
160     torsionstatement
161     {
162     vector<int> ivec;
163     TorsionStamp* currTorsionStamp = static_cast<TorsionStamp*>(blockStack.top());
164     }
165     : assignment
166     | #(MEMBERS ivec=inttuple) {currTorsionStamp->setMembers(ivec);}
167     ;
168    
169     rigidbodyblock
170     {
171     int index;
172     }
173     : #(RIGIDBODY index=intConst {RigidBodyStamp* currRigidBodyStamp = new RigidBodyStamp(index); blockStack.push(currRigidBodyStamp);}
174     (rigidbodystatement)*
175     ENDBLOCK ) {
176     blockStack.top()->validate();
177     blockStack.pop();
178     MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
179     currMoleculeStamp->addRigidBodyStamp(currRigidBodyStamp);
180     }
181     ;
182    
183     rigidbodystatement
184     {
185     vector<int> ivec;
186     RigidBodyStamp* currRigidBodyStamp = static_cast<RigidBodyStamp*>(blockStack.top());
187     }
188     : assignment
189     | #(MEMBERS ivec=inttuple) {currRigidBodyStamp->setMembers(ivec);}
190     ;
191    
192     cutoffgroupblock : #(CUTOFFGROUP {CutoffGroupStamp* currCutoffGroupStamp = new CutoffGroupStamp(); blockStack.push(currCutoffGroupStamp);}
193     (cutoffgroupstatement)*
194     ENDBLOCK ) {
195     blockStack.top()->validate();
196     blockStack.pop();
197     MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
198     currMoleculeStamp->addCutoffGroupStamp(currCutoffGroupStamp);
199     }
200     ;
201    
202     cutoffgroupstatement
203     {
204     vector<int> ivec;
205     CutoffGroupStamp* currCutoffGroupStamp = static_cast<CutoffGroupStamp*>(blockStack.top());
206     }
207     : assignment
208     | #(MEMBERS ivec=inttuple) {currCutoffGroupStamp->setMembers(ivec);}
209     ;
210    
211     fragmentblock {int ival;}
212     : #(FRAGMENT ival=intConst {FragmentStamp* currFragmentStamp = new FragmentStamp(ival); blockStack.push(currFragmentStamp);}
213     (fragmentstatement)*
214     ENDBLOCK) {
215     blockStack.top()->validate();
216     blockStack.pop();
217     MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
218     currMoleculeStamp->addFragmentStamp(currFragmentStamp);
219     }
220     ;
221    
222     fragmentstatement : assignment
223     ;
224    
225    
226    
227 tim 2513 doubleNumberTuple returns [vector<double> dvec]
228 tim 2469 {
229     double dval;
230     }
231 tim 2513 : (dval=doubleNumber {dvec.push_back(dval);})+
232 tim 2469 ;
233    
234     inttuple returns [vector<int> ivec]
235     {
236     int ival;
237     }
238     : (ival=intConst {ivec.push_back(ival);})+
239     ;
240    
241     protected
242     intConst returns [int ival]
243 tim 2513 : i1:NUM_INT {ival = lexi_cast<int>(i1->getText());}
244     | i2:NUM_LONG {ival = lexi_cast<int>(i2->getText());}
245 tim 2469 ;
246    
247     protected
248 tim 2513 doubleNumber returns [double dval]
249 tim 2509 :
250     ic:intConst {dval = lexi_cast<double>(ic->getText());}
251 tim 2469 | fc:floatConst {dval = lexi_cast<double>(fc->getText());}
252 tim 2509
253 tim 2469 ;
254    
255     protected
256     floatConst returns [double dval]
257 tim 2513 : d1:NUM_FLOAT {dval = lexi_cast<double>(d1->getText());}
258     | d2:NUM_DOUBLE {dval = lexi_cast<double>(d2->getText());}
259 tim 2469 ;
260 tim 2509

Properties

Name Value
svn:executable *