}
public ParameterListDeclaration parseParameters(TemplateParser parser, Tag tag)
{
ParameterListDeclaration parameters = new ParameterListDeclaration();
String params = tag.getValue("params");
if (params != null) {
ExpressionParser p = new ExpressionParser(parser, parser.getLocation(), params);
p.parseParameterListDeclaration(parameters);
} else {
parameters.open();
int n = tag.getLength();
for(int i=0; i<n; i++) {
String name = tag.getName(i);
if (name.equalsIgnoreCase("param")) {
String param = tag.getValue(i);
Expression defaultexpr = null;
if ((i<n-1) && tag.getName(i+1).equalsIgnoreCase("default")) {
String def = tag.getValue(i+1);
defaultexpr = Grammar.parseExpression(def, getLocation(), parser);
i++;
} else {
if (parameters.hasDefaultValues()) {
parser.error(getLocation(), "Parameters with default values must appear last");
defaultexpr = null;
}
}
if (Grammar.isValidIdentifier(param)) {
if (parameters.isDeclared(param)) {
parser.error(getLocation(), "Entity '"+param+"' is already declared");
} else {
parameters.add(param, defaultexpr);
}
} else {
parser.error(getLocation(), "Parameter name '"+param+"' is invalid");
}
}
}
String rest = tag.getValue("rest");
if (rest != null) {
rest = rest.trim();
if (!Grammar.isValidIdentifier(rest)) {
parser.error(getLocation(), "Parameter '" + rest + "' is invalid");
} else {
if (parameters.isDeclared(rest)) {
parser.error(getLocation(), "Entity '"+rest+"' is already declared");
} else {
parameters.add(PARAMETER_REST, rest, Any.EMPTY_TUPLE, null);
}
}
}
parameters.close();
}
return parameters;
}