@
/* "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) @
			}
			@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.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");
}

@
		}
	}
}
@