View Javadoc

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  }