ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-4/src/mdParser/MDTreeParser.g
Revision: 2509
Committed: Wed Dec 14 18:02:28 2005 UTC (18 years, 7 months ago) by tim
File size: 10180 byte(s)
Log Message:
fix a nasty negative integer parsing problem by refining the grammar

File Contents

# Content
1 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 constant [ANTLR_USE_NAMESPACE(antlr)RefAST id]
48 : signedIntOrFloat[#id]
49 | str1:ID {blockStack.top()->assign(id->getText(), str1->getText());}
50 | str2:StringLiteral { std::string s = str2->getText();
51 s = s.substr(1, s.length()-2);
52 blockStack.top()->assign(id->getText(),s);
53 }
54 ;
55
56 signedIntOrFloat [ANTLR_USE_NAMESPACE(antlr)RefAST id]
57 {
58 int ival;
59 double dval;
60 }
61 : #(MINUS (icMinus:intConst {ival = lexi_cast<int>(icMinus->getText()); ival = -ival; blockStack.top()->assign(id->getText(), ival);}
62 | fcMinus:floatConst) {dval = lexi_cast<double>(fcMinus->getText());dval = -dval; blockStack.top()->assign(id->getText(), dval);}
63 )
64 | (ic:intConst {ival = lexi_cast<int>(ic->getText()); blockStack.top()->assign(id->getText(), ival);}
65 | fc:floatConst {dval = lexi_cast<double>(fc->getText()); blockStack.top()->assign(id->getText(), dval);}
66 )
67 ;
68
69 componentblock : #(COMPONENT {Component* currComponet = new Component(); blockStack.push(currComponet);}
70 (assignment)*
71 ENDBLOCK ) {blockStack.top()->validate();blockStack.pop(); currConf->addComponent(currComponet);}
72 ;
73
74 zconstraintblock : #(ZCONSTRAINT {ZConsStamp* currZConsStamp = new ZConsStamp(); blockStack.push(currZConsStamp);}
75 (assignment)*
76 ENDBLOCK ) {blockStack.top()->validate();blockStack.pop(); currConf->addZConsStamp(currZConsStamp);}
77 ;
78
79 moleculeblock : #(MOLECULE {MoleculeStamp* currMoleculeStamp = new MoleculeStamp(); blockStack.push(currMoleculeStamp);}
80 (moleculestatement)*
81 ENDBLOCK ) {blockStack.top()->validate(); blockStack.pop(); currConf->addMoleculeStamp(currMoleculeStamp);}
82 ;
83
84 moleculestatement : assignment
85 | atomblock
86 | bondblock
87 | bendblock
88 | torsionblock
89 | rigidbodyblock
90 | cutoffgroupblock
91 | fragmentblock
92 ;
93
94 atomblock
95 {
96 int index;
97 }
98 : #(ATOM index=intConst {AtomStamp* currAtomStamp = new AtomStamp(index); blockStack.push(currAtomStamp);}
99 (atomstatement)*
100 ENDBLOCK ) {
101 blockStack.top()->validate();
102 blockStack.pop();
103 MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
104 currMoleculeStamp->addAtomStamp(currAtomStamp);
105 }
106 ;
107
108 atomstatement
109 {
110 vector<double> dvec;
111 AtomStamp* currAtomStamp = static_cast<AtomStamp*>(blockStack.top());
112
113 }
114 : assignment
115 | #(POSITION dvec=signedNumberTuple) {currAtomStamp->setPosition(dvec);}
116 | #(ORIENTATION dvec=signedNumberTuple) {currAtomStamp->setOrientation(dvec);}
117 ;
118
119
120 bondblock : #(BOND {BondStamp* currBondStamp = new BondStamp(); blockStack.push(currBondStamp);}
121 (bondstatement)*
122 ENDBLOCK ) {
123 blockStack.pop();
124 MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
125 currMoleculeStamp->addBondStamp(currBondStamp);
126 }
127 ;
128
129 bondstatement
130 {
131 vector<int> ivec;
132 BondStamp* currBondStamp = static_cast<BondStamp*>(blockStack.top());
133 }
134 : assignment
135 | #(MEMBERS ivec=inttuple) {currBondStamp->setMembers(ivec);}
136 ;
137
138 bendblock : #(BEND {BendStamp* currBendStamp = new BendStamp(); blockStack.push(currBendStamp);}
139 (bendstatement)*
140 ENDBLOCK) {
141 blockStack.top()->validate();
142 blockStack.pop();
143 MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
144 currMoleculeStamp->addBendStamp(currBendStamp);
145 }
146 ;
147
148 bendstatement
149 {
150 vector<int> ivec;
151 BendStamp* currBendStamp = static_cast<BendStamp*>(blockStack.top());
152 }
153 : assignment
154 | #(MEMBERS ivec=inttuple) {currBendStamp->setMembers(ivec);}
155 ;
156
157 torsionblock : #(TORSION {TorsionStamp* currTorsionStamp = new TorsionStamp(); blockStack.push(currTorsionStamp);}
158 (torsionstatement)*
159 ENDBLOCK ) {
160 blockStack.top()->validate();
161 blockStack.pop();
162 MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
163 currMoleculeStamp->addTorsionStamp(currTorsionStamp);
164 }
165 ;
166
167 torsionstatement
168 {
169 vector<int> ivec;
170 TorsionStamp* currTorsionStamp = static_cast<TorsionStamp*>(blockStack.top());
171 }
172 : assignment
173 | #(MEMBERS ivec=inttuple) {currTorsionStamp->setMembers(ivec);}
174 ;
175
176 rigidbodyblock
177 {
178 int index;
179 }
180 : #(RIGIDBODY index=intConst {RigidBodyStamp* currRigidBodyStamp = new RigidBodyStamp(index); blockStack.push(currRigidBodyStamp);}
181 (rigidbodystatement)*
182 ENDBLOCK ) {
183 blockStack.top()->validate();
184 blockStack.pop();
185 MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
186 currMoleculeStamp->addRigidBodyStamp(currRigidBodyStamp);
187 }
188 ;
189
190 rigidbodystatement
191 {
192 vector<int> ivec;
193 RigidBodyStamp* currRigidBodyStamp = static_cast<RigidBodyStamp*>(blockStack.top());
194 }
195 : assignment
196 | #(MEMBERS ivec=inttuple) {currRigidBodyStamp->setMembers(ivec);}
197 ;
198
199 cutoffgroupblock : #(CUTOFFGROUP {CutoffGroupStamp* currCutoffGroupStamp = new CutoffGroupStamp(); blockStack.push(currCutoffGroupStamp);}
200 (cutoffgroupstatement)*
201 ENDBLOCK ) {
202 blockStack.top()->validate();
203 blockStack.pop();
204 MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
205 currMoleculeStamp->addCutoffGroupStamp(currCutoffGroupStamp);
206 }
207 ;
208
209 cutoffgroupstatement
210 {
211 vector<int> ivec;
212 CutoffGroupStamp* currCutoffGroupStamp = static_cast<CutoffGroupStamp*>(blockStack.top());
213 }
214 : assignment
215 | #(MEMBERS ivec=inttuple) {currCutoffGroupStamp->setMembers(ivec);}
216 ;
217
218 fragmentblock {int ival;}
219 : #(FRAGMENT ival=intConst {FragmentStamp* currFragmentStamp = new FragmentStamp(ival); blockStack.push(currFragmentStamp);}
220 (fragmentstatement)*
221 ENDBLOCK) {
222 blockStack.top()->validate();
223 blockStack.pop();
224 MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
225 currMoleculeStamp->addFragmentStamp(currFragmentStamp);
226 }
227 ;
228
229 fragmentstatement : assignment
230 ;
231
232
233
234 signedNumberTuple returns [vector<double> dvec]
235 {
236 double dval;
237 }
238 : (dval=signedNumber {dvec.push_back(dval);})+
239 ;
240
241 inttuple returns [vector<int> ivec]
242 {
243 int ival;
244 }
245 : (ival=intConst {ivec.push_back(ival);})+
246 ;
247
248 protected
249 intConst returns [int ival]
250 : oival:OCTALINT {ival = lexi_cast<int>(oival->getText());}
251 | dival:DECIMALINT {ival = lexi_cast<int>(dival->getText());}
252 | hival:HEXADECIMALINT {ival = lexi_cast<int>(hival->getText());}
253 ;
254
255 protected
256 signedNumber returns [double dval]
257 :
258 ic:intConst {dval = lexi_cast<double>(ic->getText());}
259 | fc:floatConst {dval = lexi_cast<double>(fc->getText());}
260
261 ;
262
263 protected
264 floatConst returns [double dval]
265 : d1:FLOATONE {dval = lexi_cast<double>(d1->getText());}
266 | d2:FLOATTWO {dval = lexi_cast<double>(d2->getText());}
267 ;
268

Properties

Name Value
svn:executable *