--- trunk/src/mdParser/MDTreeParser.g 2005/12/14 18:02:28 810 +++ trunk/src/mdParser/MDTreeParser.g 2008/07/14 12:35:58 1277 @@ -15,7 +15,7 @@ options options { - k = 3; + k = 1; importVocab = MD; } { @@ -44,8 +44,13 @@ assignment : #(ASSIGNEQUAL id:ID constant[#id]) //{bl assignment : #(ASSIGNEQUAL id:ID constant[#id]) //{blockStack.top()->assign(#ID->getText(),);} ; -constant [ANTLR_USE_NAMESPACE(antlr)RefAST id] - : signedIntOrFloat[#id] +constant [ANTLR_USE_NAMESPACE(antlr)RefAST id] +{ + int ival; + RealType dval; +} + : ival=intConst {blockStack.top()->assign(id->getText(), ival);} + | dval=floatConst {blockStack.top()->assign(id->getText(), dval);} | str1:ID {blockStack.top()->assign(id->getText(), str1->getText());} | str2:StringLiteral { std::string s = str2->getText(); s = s.substr(1, s.length()-2); @@ -53,18 +58,6 @@ constant [ANTLR_USE_NAMESPACE(antlr)RefAST id] } ; -signedIntOrFloat [ANTLR_USE_NAMESPACE(antlr)RefAST id] -{ - int ival; - double dval; -} - : #(MINUS (icMinus:intConst {ival = lexi_cast(icMinus->getText()); ival = -ival; blockStack.top()->assign(id->getText(), ival);} - | fcMinus:floatConst) {dval = lexi_cast(fcMinus->getText());dval = -dval; blockStack.top()->assign(id->getText(), dval);} - ) - | (ic:intConst {ival = lexi_cast(ic->getText()); blockStack.top()->assign(id->getText(), ival);} - | fc:floatConst {dval = lexi_cast(fc->getText()); blockStack.top()->assign(id->getText(), dval);} - ) - ; componentblock : #(COMPONENT {Component* currComponet = new Component(); blockStack.push(currComponet);} (assignment)* @@ -86,6 +79,7 @@ moleculestatement : assignment | bondblock | bendblock | torsionblock + | inversionblock | rigidbodyblock | cutoffgroupblock | fragmentblock @@ -107,13 +101,13 @@ atomstatement atomstatement { -vector dvec; +vector dvec; AtomStamp* currAtomStamp = static_cast(blockStack.top()); } : assignment - | #(POSITION dvec=signedNumberTuple) {currAtomStamp->setPosition(dvec);} - | #(ORIENTATION dvec=signedNumberTuple) {currAtomStamp->setOrientation(dvec);} + | #(POSITION dvec=doubleNumberTuple) {currAtomStamp->setPosition(dvec);} + | #(ORIENTATION dvec=doubleNumberTuple) {currAtomStamp->setOrientation(dvec);} ; @@ -171,6 +165,25 @@ torsionstatement } : assignment | #(MEMBERS ivec=inttuple) {currTorsionStamp->setMembers(ivec);} + ; + +inversionblock : #(INVERSION {InversionStamp* currInversionStamp = new InversionStamp(); blockStack.push(currInversionStamp);} + (inversionstatement)* + ENDBLOCK ) { + blockStack.top()->validate(); + blockStack.pop(); + MoleculeStamp* currMoleculeStamp = static_cast(blockStack.top()); + currMoleculeStamp->addInversionStamp(currInversionStamp); + } + ; + +inversionstatement +{ + int icent; + InversionStamp* currInversionStamp = static_cast(blockStack.top()); +} + : assignment + | #(CENTER icent=intConst) {currInversionStamp->setCenter(icent);} ; rigidbodyblock @@ -231,11 +244,11 @@ fragmentstatement : assignment -signedNumberTuple returns [vector dvec] +doubleNumberTuple returns [vector dvec] { - double dval; + RealType dval; } - : (dval=signedNumber {dvec.push_back(dval);})+ + : (dval=doubleNumber {dvec.push_back(dval);})+ ; inttuple returns [vector ivec] @@ -247,22 +260,21 @@ intConst returns [int ival] protected intConst returns [int ival] - : oival:OCTALINT {ival = lexi_cast(oival->getText());} - | dival:DECIMALINT {ival = lexi_cast(dival->getText());} - | hival:HEXADECIMALINT {ival = lexi_cast(hival->getText());} + : i1:NUM_INT {ival = lexi_cast(i1->getText());} + | i2:NUM_LONG {ival = lexi_cast(i2->getText());} ; protected -signedNumber returns [double dval] +doubleNumber returns [RealType dval] : - ic:intConst {dval = lexi_cast(ic->getText());} - | fc:floatConst {dval = lexi_cast(fc->getText());} + ic:intConst {dval = lexi_cast(ic->getText());} + | fc:floatConst {dval = lexi_cast(fc->getText());} ; protected -floatConst returns [double dval] - : d1:FLOATONE {dval = lexi_cast(d1->getText());} - | d2:FLOATTWO {dval = lexi_cast(d2->getText());} +floatConst returns [RealType dval] + : d1:NUM_FLOAT {dval = lexi_cast(d1->getText());} + | d2:NUM_DOUBLE {dval = lexi_cast(d2->getText());} ;