@ /* "CodeWorker": a scripting language for parsing and generating text. Copyright (C) 1996-1997, 1999-2002 Cédric Lemaire This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA To contact the author: codeworker@free.fr */ function hashcode(sText) { local iLength = lengthString(sText); local j = 0; local iResult; while inf(j, iLength) { set iResult = mod(add(mult(iResult, 31), charToInt(charAt(sText, j))), 20000000); increment(j); } return iResult; } if getMarkupKey() == "include files" { foreach i in project.procedureList { if !i.mode { @#include "Grf@transformUnderscores(i.name)@.h" @ } } } else if getMarkupKey() == "getParsingFunctionRegister()" { foreach i in project.procedureList { local iResult = hashcode(i.name); @ if (_register.find("@i.name@") != _register.end()) throw UtlException("DtaScript::getParsingFunctionRegister('@i.name@') already exists"); _register["@i.name@"] = @iResult@; @ } } else if getMarkupKey() == "parseKeyword()" { foreach i in project.procedureList { local iResult = hashcode(i.name); @ case @iResult@: parse@transformUnderscores(i.name)@(block, script, pMethodCaller);break; @ } } else if getMarkupKey() == "parseKeyword()::deprecated" { foreach i in project.procedureList if existVariable(i.deprecated) { @ } else if (sCommand == "@i.deprecated.name@") { std::string sErrorMessage = "warning: procedure '@i.deprecated.name@' has been deprecated since version @i.deprecated.version@ -> replace it by procedure '@i.name@'" + CGRuntime::endl(); sErrorMessage += UtlTrace::getTraceStack(); if (DtaProject::getInstance().addWarning(sErrorMessage) == 1) CGRuntime::traceLine(sErrorMessage); parse@transformUnderscores(i.name)@(block, script, pMethodCaller); bSuccess = true; @ } } else if getMarkupKey() == "parsing" { foreach i in project.procedureList { if i.mode == "parse" { @void DtaScript::parse@transformUnderscores(i.name)@(GrfBlock& /*block*/, ScpStream& script, ExprScriptVariable* /*pMethodCaller*/) { throw UtlException(script, "command \"@i.name@\" must be used into design format files only"); } @ } else if i.mode == "generate" { @void DtaScript::parse@transformUnderscores(i.name)@(GrfBlock& /*block*/, ScpStream& script, ExprScriptVariable* /*pMethodCaller*/) { throw UtlException(script, "command \"@i.name@\" must be used into pattern files only"); } @ } else { @void DtaScript::parse@transformUnderscores(i.name)@(GrfBlock& block, ScpStream& script, ExprScriptVariable* pMethodCaller) { Grf@transformUnderscores(i.name)@* p@transformUnderscores(i.name)@ = new Grf@transformUnderscores(i.name)@; if (requiresParsingInformation()) p@transformUnderscores(i.name)@->setParsingInformation(getFilenamePtr(), script); block.add(p@transformUnderscores(i.name)@); script.skipEmpty(); if (!script.isEqualTo('(')) throw UtlException(script, "syntax error: '(' expected"); script.skipEmpty(); @ local bSecondParameter; local bDefaultParameters; foreach j in i.parameterList { if !bDefaultParameters && j.default { bDefaultParameters = true; @ do { @ incrementIndentLevel(); } if !first(j) { if bDefaultParameters { @ if (@ if !bSecondParameter { set bSecondParameter = true; @pMethodCaller != NULL) { if (script.peekChar() == ')') break; } else { if (!script.isEqualTo(',')) break; } @ } else { @!script.isEqualTo(',')) break; @ } } else { @ if (@ if !bSecondParameter { set bSecondParameter = true; @(pMethodCaller == NULL) && @ } @!script.isEqualTo(',')) throw UtlException(script, "syntax error: ',' expected"); @ } @ script.skipEmpty(); @ } @ @ if j.type == "treexpr" { @{ CGQuietOutput quiet; @ } if j.first() { @if (pMethodCaller == NULL) @ if bDefaultParameters { @{ if (script.peekChar() != ')') @ } } @p@transformUnderscores(i.name)@->set@transformUnderscores(j.name)@(@ switch(j.type) { case "int": case "bool": case "double": case "string": case "ulong": case "ushort": @parseExpression(block, script)@ break; case "doubleref": case "boolref": case "stringref": case "stringlist": case "tree": case "treeref": case "treexpr": @parseVariableExpression(block, script)@ break; case "iterator": @parseIndexExpression(block, script)@ break; case "script": @parseScriptFileExpression(block, script, DtaScriptFactory::@ switch(j.type.script) { case "BNF": {@BNF_SCRIPT@} break; case "free": {@FREE_SCRIPT@} break; case "pattern": {@PATTERN_SCRIPT@} break; case "translate": {@TRANSLATE_SCRIPT@} break; } @)@ break; } if j.first() && bDefaultParameters { @); } @ } else { @); @ } if j.type == "treexpr" { @ @ } if j.first() { @ else p@transformUnderscores(i.name)@->set@transformUnderscores(j.name)@(pMethodCaller); @ } else { @ script.skipEmpty(); @ } if j.type == "treexpr" { @ } @ } } if bDefaultParameters { decrementIndentLevel(); @ } while (false); p@transformUnderscores(i.name)@->populateDefaultParameters(); @ } @ if (!script.isEqualTo(')')) throw UtlException(script, "syntax error: ')' expected"); script.skipEmpty(); if (!script.isEqualTo(';')) throw UtlException(script, "syntax error: ';' expected"); } @ } } } @