OpenMD 3.2
Molecular Dynamics in the Open
Loading...
Searching...
No Matches
OMDTreeVisitor.hpp
1
2// ANTLR v4 Visitor for OpenMD Tree Parsing
3// Converted from ANTLR v2 MDTreeParser.g
4// This uses the Visitor pattern instead of tree walking
5
6#ifndef OMDTREEVISITOR_HPP
7#define OMDTREEVISITOR_HPP
8
9#include <stack>
10#include <vector>
11#include "io/Globals.hpp"
12#include "utils/StringUtils.hpp"
13#include "OMDBaseVisitor.h"
14
15using namespace std;
16using namespace OpenMD;
17
18class OMDTreeVisitor : public OMDBaseVisitor {
19private:
20 Globals* currConf;
21 stack<DataHolder*> blockStack;
22
23public:
24 OMDTreeVisitor() : currConf(nullptr) {}
25
26 Globals* walkTree(antlr4::tree::ParseTree* tree) {
27 currConf = new Globals;
28 blockStack.push(currConf);
29 visit(tree);
30 return currConf;
31 }
32
33 // Visit mdfile - top level
34 virtual antlrcpp::Any visitOmdfile(OMDParser::OmdfileContext *ctx) override {
35 visitChildren(ctx);
36 blockStack.top()->validate();
37 blockStack.pop();
38 return nullptr;
39 }
40
41 // Visit assignment
42 virtual antlrcpp::Any visitAssignment(OMDParser::AssignmentContext *ctx) override {
43 std::string id = ctx->ID()->getText();
44 visitConstant(ctx->constant(), id);
45 return nullptr;
46 }
47
48 // Helper method to handle constants
49 void visitConstant(OMDParser::ConstantContext *ctx, const std::string& id) {
50 if (ctx->intConst()) {
51 int ival = getIntConst(ctx->intConst());
52 blockStack.top()->assign(id, ival);
53 } else if (ctx->floatConst()) {
54 RealType dval = getFloatConst(ctx->floatConst());
55 blockStack.top()->assign(id, dval);
56 } else if (ctx->TRUE()) {
57 blockStack.top()->assign(id, true);
58 } else if (ctx->FALSE()) {
59 blockStack.top()->assign(id, false);
60 } else if (ctx->ID()) {
61 std::string str = ctx->ID()->getText();
62 blockStack.top()->assign(id, str);
63 } else if (ctx->StringLiteral()) {
64 std::string s = ctx->StringLiteral()->getText();
65 s = s.substr(1, s.length()-2);
66 blockStack.top()->assign(id, s);
67 } else if (ctx->vectorConst()) {
68 std::vector<RealType> dvec = getDoubleNumberTuple(
69 ctx->vectorConst()->doubleNumberTuple());
70 blockStack.top()->assign(id, dvec);
71 }
72 }
73
74 // Component block
75 virtual antlrcpp::Any visitComponentblock(OMDParser::ComponentblockContext *ctx) override {
76 Component* currComponent = new Component();
77 blockStack.push(currComponent);
78
79 visitChildren(ctx);
80
81 blockStack.top()->validate();
82 blockStack.pop();
83 currConf->addComponent(currComponent);
84 return nullptr;
85 }
86
87 // ZConstraint block
88 virtual antlrcpp::Any visitZconstraintblock(OMDParser::ZconstraintblockContext *ctx) override {
89 ZConsStamp* currZConsStamp = new ZConsStamp();
90 blockStack.push(currZConsStamp);
91
92 visitChildren(ctx);
93
94 blockStack.top()->validate();
95 blockStack.pop();
96 currConf->addZConsStamp(currZConsStamp);
97 return nullptr;
98 }
99
100 // Restraint block
101 virtual antlrcpp::Any visitRestraintblock(OMDParser::RestraintblockContext *ctx) override {
102 RestraintStamp* currRestraintStamp = new RestraintStamp();
103 blockStack.push(currRestraintStamp);
104
105 visitChildren(ctx);
106
107 blockStack.top()->validate();
108 blockStack.pop();
109 currConf->addRestraintStamp(currRestraintStamp);
110 return nullptr;
111 }
112
113 // FlucQ block
114 virtual antlrcpp::Any visitFlucqblock(OMDParser::FlucqblockContext *ctx) override {
115 FluctuatingChargeParameters* flucQpars = new FluctuatingChargeParameters();
116 blockStack.push(flucQpars);
117
118 visitChildren(ctx);
119
120 blockStack.top()->validate();
121 blockStack.pop();
122 currConf->addFluctuatingChargeParameters(flucQpars);
123 return nullptr;
124 }
125
126 // RNEMD block
127 virtual antlrcpp::Any visitRnemdblock(OMDParser::RnemdblockContext *ctx) override {
128 RNEMD::RNEMDParameters* rnemdPars = new RNEMD::RNEMDParameters();
129 blockStack.push(rnemdPars);
130
131 visitChildren(ctx);
132
133 blockStack.top()->validate();
134 blockStack.pop();
135 currConf->addRNEMDParameters(rnemdPars);
136 return nullptr;
137 }
138
139 // Light block
140 virtual antlrcpp::Any visitLightblock(OMDParser::LightblockContext *ctx) override {
141 Perturbations::LightParameters* lightPars = new Perturbations::LightParameters();
142 blockStack.push(lightPars);
143
144 visitChildren(ctx);
145
146 blockStack.top()->validate();
147 blockStack.pop();
148 currConf->addLightParameters(lightPars);
149 return nullptr;
150 }
151
152 // VelocityField block
153 virtual antlrcpp::Any visitVelocityfieldblock(OMDParser::VelocityfieldblockContext *ctx) override {
154 Perturbations::VelocityFieldParameters* vfPars = new Perturbations::VelocityFieldParameters();
155 blockStack.push(vfPars);
156
157 visitChildren(ctx);
158
159 blockStack.top()->validate();
160 blockStack.pop();
161 currConf->addVelocityFieldParameters(vfPars);
162 return nullptr;
163 }
164
165 // Minimizer block
166 virtual antlrcpp::Any visitMinimizerblock(OMDParser::MinimizerblockContext *ctx) override {
167 MinimizerParameters* minimizerPars = new MinimizerParameters();
168 blockStack.push(minimizerPars);
169
170 visitChildren(ctx);
171
172 blockStack.top()->validate();
173 blockStack.pop();
174 currConf->addMinimizerParameters(minimizerPars);
175 return nullptr;
176 }
177
178 // Molecule block
179 virtual antlrcpp::Any visitMoleculeblock(OMDParser::MoleculeblockContext *ctx) override {
180 MoleculeStamp* currMoleculeStamp = new MoleculeStamp();
181 blockStack.push(currMoleculeStamp);
182 visitChildren(ctx);
183
184 blockStack.top()->validate();
185 blockStack.pop();
186 currConf->addMoleculeStamp(currMoleculeStamp);
187 return nullptr;
188 }
189
190 // Sequence string
191 virtual antlrcpp::Any visitSequencestring(OMDParser::SequencestringContext *ctx) override {
192 std::string id = "sequence";
193 visitConstant(ctx->constant(), id);
194 return nullptr;
195 }
196
197 // Fragment block
198 virtual antlrcpp::Any visitFragmentblock(OMDParser::FragmentblockContext *ctx) override {
199 FragmentStamp* currFragmentStamp = new FragmentStamp();
200 blockStack.push(currFragmentStamp);
201
202 visitChildren(ctx);
203
204 blockStack.top()->validate();
205 blockStack.pop();
206 currConf->addFragmentStamp(currFragmentStamp);
207 return nullptr;
208 }
209
210 // Atom block
211 virtual antlrcpp::Any visitAtomblock(OMDParser::AtomblockContext *ctx) override {
212 int index = getIntConst(ctx->intConst());
213 AtomStamp* currAtomStamp = new AtomStamp(index);
214 blockStack.push(currAtomStamp);
215
216 visitChildren(ctx);
217
218 blockStack.top()->validate();
219 blockStack.pop();
220 MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
221 currMoleculeStamp->addAtomStamp(currAtomStamp);
222 return nullptr;
223 }
224
225 // Atom statement
226 virtual antlrcpp::Any visitAtomstatement(OMDParser::AtomstatementContext *ctx) override {
227 AtomStamp* currAtomStamp = static_cast<AtomStamp*>(blockStack.top());
228
229 if (ctx->assignment()) {
230 visitAssignment(ctx->assignment());
231 }
232 else if (ctx->POSITION()) {
233 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
234 currAtomStamp->setPosition(dvec);
235 }
236 else if (ctx->ORIENTATION()) {
237 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
238 currAtomStamp->setOrientation(dvec);
239 }
240 else if (ctx->CHARGE()) {
241 RealType rval = getFloatConst(ctx->floatConst());
242 currAtomStamp->overrideCharge(rval);
243 }
244 return nullptr;
245 }
246
247 // Bond block
248 virtual antlrcpp::Any visitBondblock(OMDParser::BondblockContext *ctx) override {
249 BondStamp* currBondStamp = new BondStamp();
250 blockStack.push(currBondStamp);
251
252 visitChildren(ctx);
253
254 blockStack.top()->validate();
255 blockStack.pop();
256 MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
257 currMoleculeStamp->addBondStamp(currBondStamp);
258 return nullptr;
259 }
260
261 // Bond statement
262 virtual antlrcpp::Any visitBondstatement(OMDParser::BondstatementContext *ctx) override {
263 BondStamp* currBondStamp = static_cast<BondStamp*>(blockStack.top());
264
265 if (ctx->assignment()) {
266 visitAssignment(ctx->assignment());
267 }
268 else if (ctx->MEMBERS()) {
269 std::vector<int> ivec = getIntTuple(ctx->inttuple());
270 currBondStamp->setMembers(ivec);
271 }
272 else if (ctx->FIXED()) {
273 RealType rval = getFloatConst(ctx->floatConst());
274 currBondStamp->overrideType("Fixed", rval);
275 }
276 else if (ctx->HARMONIC()) {
277 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
278 currBondStamp->overrideType("Harmonic", dvec);
279 }
280 else if (ctx->CUBIC()) {
281 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
282 currBondStamp->overrideType("Cubic", dvec);
283 }
284 else if (ctx->QUARTIC()) {
285 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
286 currBondStamp->overrideType("Quartic", dvec);
287 }
288 else if (ctx->POLYNOMIAL()) {
289 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
290 currBondStamp->overrideType("Polynomial", dvec);
291 }
292 else if (ctx->MORSE()) {
293 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
294 currBondStamp->overrideType("Morse", dvec);
295 }
296 return nullptr;
297 }
298
299 // Bend block
300 virtual antlrcpp::Any visitBendblock(OMDParser::BendblockContext *ctx) override {
301 BendStamp* currBendStamp = new BendStamp();
302 blockStack.push(currBendStamp);
303
304 visitChildren(ctx);
305
306 blockStack.top()->validate();
307 blockStack.pop();
308 MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
309 currMoleculeStamp->addBendStamp(currBendStamp);
310 return nullptr;
311 }
312
313 // Bend statement
314 virtual antlrcpp::Any visitBendstatement(OMDParser::BendstatementContext *ctx) override {
315 BendStamp* currBendStamp = static_cast<BendStamp*>(blockStack.top());
316
317 if (ctx->assignment()) {
318 visitAssignment(ctx->assignment());
319 }
320 else if (ctx->MEMBERS()) {
321 std::vector<int> ivec = getIntTuple(ctx->inttuple());
322 currBendStamp->setMembers(ivec);
323 }
324 else if (ctx->HARMONIC()) {
325 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
326 currBendStamp->overrideType("Harmonic", dvec);
327 }
328 else if (ctx->GHOSTBEND()) {
329 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
330 currBendStamp->overrideType("GhostBend", dvec);
331 }
332 else if (ctx->UREYBRADLEY()) {
333 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
334 currBendStamp->overrideType("UreyBradley", dvec);
335 }
336 else if (ctx->CUBIC()) {
337 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
338 currBendStamp->overrideType("Cubic", dvec);
339 }
340 else if (ctx->QUARTIC()) {
341 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
342 currBendStamp->overrideType("Quartic", dvec);
343 }
344 else if (ctx->POLYNOMIAL()) {
345 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
346 currBendStamp->overrideType("Polynomial", dvec);
347 }
348 else if (ctx->COSINE()) {
349 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
350 currBendStamp->overrideType("Cosine", dvec);
351 }
352 return nullptr;
353 }
354
355 // Torsion block
356 virtual antlrcpp::Any visitTorsionblock(OMDParser::TorsionblockContext *ctx) override {
357 TorsionStamp* currTorsionStamp = new TorsionStamp();
358 blockStack.push(currTorsionStamp);
359
360 visitChildren(ctx);
361
362 blockStack.top()->validate();
363 blockStack.pop();
364 MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
365 currMoleculeStamp->addTorsionStamp(currTorsionStamp);
366 return nullptr;
367 }
368
369 // Torsion statement
370 virtual antlrcpp::Any visitTorsionstatement(OMDParser::TorsionstatementContext *ctx) override {
371 TorsionStamp* currTorsionStamp = static_cast<TorsionStamp*>(blockStack.top());
372
373 if (ctx->assignment()) {
374 visitAssignment(ctx->assignment());
375 }
376 else if (ctx->MEMBERS()) {
377 std::vector<int> ivec = getIntTuple(ctx->inttuple());
378 currTorsionStamp->setMembers(ivec);
379 }
380 else if (ctx->GHOSTTORSION()) {
381 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
382 currTorsionStamp->overrideType("GhostTorsion", dvec);
383 }
384 else if (ctx->CUBIC()) {
385 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
386 currTorsionStamp->overrideType("Cubic", dvec);
387 }
388 else if (ctx->QUARTIC()) {
389 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
390 currTorsionStamp->overrideType("Quartic", dvec);
391 }
392 else if (ctx->POLYNOMIAL()) {
393 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
394 currTorsionStamp->overrideType("Polynomial", dvec);
395 }
396 else if (ctx->CHARMM()) {
397 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
398 currTorsionStamp->overrideType("Charmm", dvec);
399 }
400 else if (ctx->OPLS()) {
401 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
402 currTorsionStamp->overrideType("Opls", dvec);
403 }
404 else if (ctx->TRAPPE()) {
405 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
406 currTorsionStamp->overrideType("Trappe", dvec);
407 }
408 else if (ctx->HARMONIC()) {
409 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
410 currTorsionStamp->overrideType("Harmonic", dvec);
411 }
412 return nullptr;
413 }
414
415 // Inversion block
416 virtual antlrcpp::Any visitInversionblock(OMDParser::InversionblockContext *ctx) override {
417 InversionStamp* currInversionStamp = new InversionStamp();
418 blockStack.push(currInversionStamp);
419
420 visitChildren(ctx);
421
422 blockStack.top()->validate();
423 blockStack.pop();
424 MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
425 currMoleculeStamp->addInversionStamp(currInversionStamp);
426 return nullptr;
427 }
428
429 // Inversion statement
430 virtual antlrcpp::Any visitInversionstatement(OMDParser::InversionstatementContext *ctx) override {
431 InversionStamp* currInversionStamp = static_cast<InversionStamp*>(blockStack.top());
432
433 if (ctx->assignment()) {
434 visitAssignment(ctx->assignment());
435 }
436 else if (ctx->CENTER()) {
437 int icent = getIntConst(ctx->intConst());
438 currInversionStamp->setCenter(icent);
439 }
440 else if (ctx->SATELLITES()) {
441 std::vector<int> ivec = getIntTuple(ctx->inttuple());
442 currInversionStamp->setSatellites(ivec);
443 }
444 else if (ctx->AMBERIMPROPER()) {
445 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
446 currInversionStamp->overrideType("AmberImproper", dvec);
447 }
448 else if (ctx->IMPROPERCOSINE()) {
449 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
450 currInversionStamp->overrideType("ImproperCosine", dvec);
451 }
452 else if (ctx->HARMONIC()) {
453 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
454 currInversionStamp->overrideType("Harmonic", dvec);
455 }
456 else if (ctx->CENTRALATOMHEIGHT()) {
457 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
458 currInversionStamp->overrideType("CentralAtomHeight", dvec);
459 }
460 else if (ctx->DREIDING()) {
461 std::vector<RealType> dvec = getDoubleNumberTuple(ctx->doubleNumberTuple());
462 currInversionStamp->overrideType("Dreiding", dvec);
463 }
464 return nullptr;
465 }
466
467 // Rigid body block
468 virtual antlrcpp::Any visitRigidbodyblock(OMDParser::RigidbodyblockContext *ctx) override {
469 int index = getIntConst(ctx->intConst());
470 RigidBodyStamp* currRigidBodyStamp = new RigidBodyStamp(index);
471 blockStack.push(currRigidBodyStamp);
472
473 visitChildren(ctx);
474
475 blockStack.top()->validate();
476 blockStack.pop();
477 MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
478 currMoleculeStamp->addRigidBodyStamp(currRigidBodyStamp);
479 return nullptr;
480 }
481
482 // Rigid body statement
483 virtual antlrcpp::Any visitRigidbodystatement(OMDParser::RigidbodystatementContext *ctx) override {
484 RigidBodyStamp* currRigidBodyStamp = static_cast<RigidBodyStamp*>(blockStack.top());
485
486 if (ctx->assignment()) {
487 visitAssignment(ctx->assignment());
488 }
489 else if (ctx->MEMBERS()) {
490 std::vector<int> ivec = getIntTuple(ctx->inttuple());
491 currRigidBodyStamp->setMembers(ivec);
492 }
493 return nullptr;
494 }
495
496 // Cutoff group block
497 virtual antlrcpp::Any visitCutoffgroupblock(OMDParser::CutoffgroupblockContext *ctx) override {
498 CutoffGroupStamp* currCutoffGroupStamp = new CutoffGroupStamp();
499 blockStack.push(currCutoffGroupStamp);
500
501 visitChildren(ctx);
502
503 blockStack.top()->validate();
504 blockStack.pop();
505 MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
506 currMoleculeStamp->addCutoffGroupStamp(currCutoffGroupStamp);
507 return nullptr;
508 }
509
510 // Cutoff group statement
511 virtual antlrcpp::Any visitCutoffgroupstatement(OMDParser::CutoffgroupstatementContext *ctx) override {
512 CutoffGroupStamp* currCutoffGroupStamp = static_cast<CutoffGroupStamp*>(blockStack.top());
513
514 if (ctx->assignment()) {
515 visitAssignment(ctx->assignment());
516 }
517 else if (ctx->MEMBERS()) {
518 std::vector<int> ivec = getIntTuple(ctx->inttuple());
519 currCutoffGroupStamp->setMembers(ivec);
520 }
521 return nullptr;
522 }
523
524 // Constraint block
525 virtual antlrcpp::Any visitConstraintblock(OMDParser::ConstraintblockContext *ctx) override {
526 ConstraintStamp* currConstraintStamp = new ConstraintStamp();
527 blockStack.push(currConstraintStamp);
528
529 visitChildren(ctx);
530
531 blockStack.pop();
532 MoleculeStamp* currMoleculeStamp = static_cast<MoleculeStamp*>(blockStack.top());
533 currMoleculeStamp->addConstraintStamp(currConstraintStamp);
534 return nullptr;
535 }
536
537 // Constraint statement
538 virtual antlrcpp::Any visitConstraintstatement(OMDParser::ConstraintstatementContext *ctx) override {
539 ConstraintStamp* currConstraintStamp = static_cast<ConstraintStamp*>(blockStack.top());
540
541 if (ctx->assignment()) {
542 visitAssignment(ctx->assignment());
543 }
544 else if (ctx->MEMBERS()) {
545 std::vector<int> ivec = getIntTuple(ctx->inttuple());
546 currConstraintStamp->setMembers(ivec);
547 }
548 return nullptr;
549 }
550
551 // Nodes block
552 virtual antlrcpp::Any visitNodesblock(OMDParser::NodesblockContext *ctx) override {
553 NodesStamp* currNodesStamp = new NodesStamp();
554 blockStack.push(currNodesStamp);
555
556 visitChildren(ctx);
557
558 blockStack.top()->validate();
559 blockStack.pop();
560 FragmentStamp* currFragmentStamp = static_cast<FragmentStamp*>(blockStack.top());
561 currFragmentStamp->addNodesStamp(currNodesStamp);
562 return nullptr;
563 }
564
565 // Nodes statement
566 virtual antlrcpp::Any visitNodesstatement(OMDParser::NodesstatementContext *ctx) override {
567 NodesStamp* currNodesStamp = static_cast<NodesStamp*>(blockStack.top());
568
569 if (ctx->assignment()) {
570 visitAssignment(ctx->assignment());
571 }
572 else if (ctx->MEMBERS()) {
573 std::vector<int> ivec = getIntTuple(ctx->inttuple());
574 currNodesStamp->setMembers(ivec);
575 }
576 return nullptr;
577 }
578
579private:
580 // Helper methods to extract values from parse tree
581
582 int getIntConst(OMDParser::IntConstContext *ctx) {
583 if (ctx->NUM_INT()) {
584 return lexi_cast<int>(ctx->NUM_INT()->getText());
585 } else if (ctx->NUM_LONG()) {
586 return lexi_cast<int>(ctx->NUM_LONG()->getText());
587 }
588 return 0;
589 }
590
591 RealType getFloatConst(OMDParser::FloatConstContext *ctx) {
592 if (ctx->NUM_FLOAT()) {
593 return lexi_cast<RealType>(ctx->NUM_FLOAT()->getText());
594 } else if (ctx->NUM_DOUBLE()) {
595 return lexi_cast<RealType>(ctx->NUM_DOUBLE()->getText());
596 }
597 return 0.0;
598 }
599
600 RealType getDoubleNumber(OMDParser::DoubleNumberContext *ctx) {
601 if (ctx->intConst()) {
602 return static_cast<RealType>(getIntConst(ctx->intConst()));
603 } else if (ctx->floatConst()) {
604 return getFloatConst(ctx->floatConst());
605 }
606 return 0.0;
607 }
608
609 std::vector<RealType> getDoubleNumberTuple(OMDParser::DoubleNumberTupleContext *ctx) {
610 std::vector<RealType> dvec;
611 for (auto dn : ctx->doubleNumber()) {
612 dvec.push_back(getDoubleNumber(dn));
613 }
614 return dvec;
615 }
616
617 std::vector<int> getIntTuple(OMDParser::InttupleContext *ctx) {
618 std::vector<int> ivec;
619 for (auto ic : ctx->intConst()) {
620 ivec.push_back(getIntConst(ic));
621 }
622 return ivec;
623 }
624};
625
626#endif // OMDTREEVISITOR_HPP
This class provides an empty implementation of OMDVisitor, which can be extended to create a visitor ...
virtual antlrcpp::Any visitOmdfile(OMDParser::OmdfileContext *ctx) override
Visit parse trees produced by OMDParser.
This basic Periodic Table class was originally taken from the data.cpp file in OpenBabel.