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 }