1 /********************************************************************************
2 *
3 * Copyright (c) 2008 Fujitsu Services Ltd.
4 *
5 * Author: Nick Battle
6 *
7 * This file is part of VDMJ.
8 *
9 * VDMJ is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * VDMJ is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with VDMJ. If not, see <http://www.gnu.org/licenses/>.
21 *
22 ******************************************************************************/
23
24 package org.overturetool.vdmj.expressions;
25
26 import org.overturetool.vdmj.lex.LexLocation;
27 import org.overturetool.vdmj.runtime.Context;
28 import org.overturetool.vdmj.runtime.ValueException;
29 import org.overturetool.vdmj.typechecker.Environment;
30 import org.overturetool.vdmj.typechecker.NameScope;
31 import org.overturetool.vdmj.types.NaturalType;
32 import org.overturetool.vdmj.types.SetType;
33 import org.overturetool.vdmj.types.Type;
34 import org.overturetool.vdmj.types.TypeList;
35 import org.overturetool.vdmj.values.IntegerValue;
36 import org.overturetool.vdmj.values.SetValue;
37 import org.overturetool.vdmj.values.Value;
38 import org.overturetool.vdmj.values.ValueList;
39 import org.overturetool.vdmj.values.ValueSet;
40
41 public class IndicesExpression extends UnaryExpression
42 {
43 private static final long serialVersionUID = 1L;
44
45 public IndicesExpression(LexLocation location, Expression exp)
46 {
47 super(location, exp);
48 }
49
50 @Override
51 public String toString()
52 {
53 return "(inds " + exp + ")";
54 }
55
56 @Override
57 public Type typeCheck(Environment env, TypeList qualifiers, NameScope scope)
58 {
59 Type etype = exp.typeCheck(env, null, scope);
60
61 if (!etype.isSeq())
62 {
63 report(3109, "Argument to 'inds' is not a sequence");
64 detail("Actual type", etype);
65 }
66
67 return new SetType(location, new NaturalType(location));
68 }
69
70 @Override
71 public Value eval(Context ctxt)
72 {
73 breakpoint.check(location, ctxt);
74
75 try
76 {
77 ValueList seq = exp.eval(ctxt).seqValue(ctxt);
78 ValueSet result = new ValueSet();
79
80 for (int i=1; i<= seq.size(); i++)
81 {
82 result.add(new IntegerValue(i));
83 }
84
85 return new SetValue(result);
86 }
87 catch (ValueException e)
88 {
89 return abort(e);
90 }
91 }
92
93 @Override
94 public String kind()
95 {
96 return "inds";
97 }
98 }