private Parameter ParseParameter(int position, HashSet<string> names) {
Token t = PeekToken();
Parameter parameter = null;
switch (t.Kind) {
case TokenKind.LeftParenthesis: // sublist
NextToken();
Expression ret = ParseSublist(names);
Eat(TokenKind.RightParenthesis);
TupleExpression tret = ret as TupleExpression;
NameExpression nameRet;
if (tret != null) {
parameter = new SublistParameter(position, tret);
} else if ((nameRet = ret as NameExpression) != null) {
parameter = new Parameter(nameRet.Name);
} else {
ReportSyntaxError(_lookahead);
}
if (parameter != null) {
parameter.SetLoc(_globalParent, ret.IndexSpan);
}
break;
case TokenKind.Name: // identifier
NextToken();
string name = FixName((string)t.Value);
parameter = new Parameter(name);
CompleteParameterName(parameter, name, names);
break;
default:
ReportSyntaxError(_lookahead);
break;
}
return parameter;
}