EOS 2  1.1.0
Einfache Objektbasierte Sprache
SubRoutine.java
gehe zur Dokumentation dieser Datei
1 package de.lathanda.eos.baseparser;
2 
3 import de.lathanda.eos.vm.Command;
4 import de.lathanda.eos.vm.ReservedVariables;
5 import de.lathanda.eos.vm.commands.CreateVariable;
6 import de.lathanda.eos.vm.commands.LoadVariable;
7 import de.lathanda.eos.vm.commands.StoreVariable;
8 
9 import java.util.ArrayList;
10 
17 public class SubRoutine extends Node implements ProgramUnit {
18  private final String name;
19  private final Sequence sequence;
20  private final Parameters parameters;
21  private final Type returnType;
22  private final boolean globalAccess;
23  private MethodType methodType;
24 
25  public SubRoutine(String name, Parameters parameters, Sequence sequence, Type returnType, boolean globalAccess) {
26  this.name = name;
27  this.parameters = (parameters != null) ? parameters : new Parameters();
28  this.sequence = sequence;
29  this.returnType = (returnType == null) ? Type.getVoid() : returnType;
30  this.globalAccess = globalAccess;
31  }
32 
33  @Override
34  public String getName() {
35  return name;
36  }
37 
38  @Override
39  public Sequence getSequence() {
40  return sequence;
41  }
42 
43  @Override
44  public void compile(ArrayList<Command> ops, boolean autoWindow) throws Exception {
45  for (Parameter p : parameters.getParameters()) {
46  ops.add(new CreateVariable(p.getName().toLowerCase(), p.getType().getMType()));
47  ops.add(new StoreVariable(p.getName().toLowerCase()));
48  }
49  if (returnType != null && !returnType.isVoid()) {
50  ops.add(new CreateVariable(ReservedVariables.RESULT, returnType.getMType()));
51  }
52 
53  sequence.compile(ops, autoWindow);
54  if (returnType != null && !returnType.isVoid()) {
56  }
57  }
58 
59  @Override
60  public void resolveNamesAndTypes(Expression with, Environment env) {
61  if (parameters != null) {
62  parameters.registerParameters(env);
63  }
64  if (returnType != null && !returnType.isVoid()) {
65  env.setVariableType("1x", returnType);
66  }
67  sequence.resolveNamesAndTypes(with, env);
68  }
69 
70  public void registerSub(Environment env) {
71  createMethodType(env);
72  if (env.isFunctionDefined(name, (parameters == null) ? 0 : parameters.size())) {
73  env.addError(marker, "DoubleMethodDefinition", name, (parameters == null) ? 0 : parameters.size());
74  } else {
75  if (parameters != null) {
76  env.setFunctionSignature(name.toLowerCase(), parameters.size(), methodType);
77  } else {
78  env.setFunctionSignature(name.toLowerCase(), 0, methodType);
79  }
80  }
81  }
82 
84  if (methodType == null) {
85  createMethodType(env);
86  }
87  return methodType;
88  }
89 
90  private void createMethodType(Environment env) {
91  if (methodType != null) {
92  return;
93  }
94  Type[] para;
95  if (parameters != null) {
96  para = parameters.getTypes();
97  } else {
98  para = new Type[] {};
99  }
100  if (returnType != null && returnType.isUnknown()) {
101  env.addError(marker, "UnknownType", returnType);
102  }
103  methodType = new UserFunctionType(name, para, returnType);
104  }
105 
106  public boolean getGlobalAccess() {
107  return globalAccess;
108  }
109 
110  @Override
111  public String getLabel() {
112  return name;
113  }
114 
115  public Type[] getParameterTypes() {
116  return parameters.getTypes();
117  }
118 }
void setVariableType(String name, Type type)
void setFunctionSignature(String name, int args, MethodType methodType)
boolean isFunctionDefined(String name, int args)
void addError(Marker marker, String errorId, Object... data)
void registerParameters(Environment env)
Definition: Parameters.java:43
void resolveNamesAndTypes(Expression with, Environment env)
Definition: Sequence.java:67
void compile(ArrayList< Command > ops, boolean autoWindow)
Definition: Sequence.java:53
void registerSub(Environment env)
Definition: SubRoutine.java:70
MethodType getMethodType(Environment env)
Definition: SubRoutine.java:83
void compile(ArrayList< Command > ops, boolean autoWindow)
Definition: SubRoutine.java:44
void resolveNamesAndTypes(Expression with, Environment env)
Definition: SubRoutine.java:60
SubRoutine(String name, Parameters parameters, Sequence sequence, Type returnType, boolean globalAccess)
Definition: SubRoutine.java:25
static SystemType getVoid()
Definition: Type.java:76
Impressum