EOS 2  1.1.0
Einfache Objektbasierte Sprache
Declaration.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.DebugPoint;
5 import de.lathanda.eos.vm.ReservedVariables;
6 import de.lathanda.eos.vm.commands.CreateVariable;
7 import de.lathanda.eos.vm.commands.LoadVariable;
8 import java.util.ArrayList;
9 import java.util.LinkedList;
10 import java.util.List;
11 
17 public class Declaration extends Node {
18  protected final List<String> names;
19  protected Type vartype;
20 
21  public Declaration() {
22  this.names = new LinkedList<>();
23  this.type = Type.getVoid();
24  this.vartype = Type.getUnknown();
25  }
26 
27  public void addName(String name) {
28  names.add(name.toLowerCase());
29  }
30 
31  public List<String> getNames() {
32  return names;
33  }
34 
35  public void setType(Type vartype) {
36  this.vartype = vartype;
37  names.stream().forEach((name) -> Program.addGuess(name, vartype));
38  }
39 
40  @Override
41  public void compile(ArrayList<Command> ops, boolean autoWindow) throws Exception {
42  ops.add(new DebugPoint(marker));
43  for (String name : names) {
44  if (autoWindow && vartype.inherits(SystemType.getFigure()) && !vartype.isAbstract()) {
45  ops.add(new CreateVariable(name, vartype.getMType()));
46  ops.add(new LoadVariable(name));
48  SystemType.getAddFigureMethod().compile(ops, null, autoWindow);
49  } else {
50  ops.add(new CreateVariable(name, vartype.getMType()));
51  }
52  }
53  ;
54  }
55 
56  @Override
57  public void resolveNamesAndTypes(Expression with, Environment env) {
58  names.stream().forEach((name) -> {
59  if (env.isVariableDefined(name)) {
60  env.addError(marker, "DoubleVariableDefinition", name);
61  } else {
62  env.setVariableType(name.toLowerCase(), vartype);
63  }
64  });
65 
66  if (vartype.isUnknown()) {
67  env.addError(marker, "UnknownType", vartype);
68  } else if (vartype == SystemType.getWindow()) {
69  // a window variable was found, this information is used to
70  // determine if automatic window has to be generated
71  env.setWindowExists();
72  } else if (vartype.inherits(SystemType.getFigure())) {
73  // a figure variable was found, this information is used to
74  // determine if automatic window has to be generated
75  env.setFigureExists();
76  }
77  }
78 
79  @Override
80  public String toString() {
81  StringBuilder res = new StringBuilder();
82  boolean first = true;
83  for (String name : names) {
84  if (first) {
85  res.append(name);
86  } else {
87  res.append(",").append(name);
88  first = false;
89  }
90  }
91  res.append(":").append(vartype);
92  return res.toString();
93  }
94 
95  @Override
96  public String getLabel() {
97  StringBuilder text = new StringBuilder();
98  boolean first = true;
99  for (String name : names) {
100  if (first) {
101  text.append(name);
102  first = false;
103  } else {
104  text.append(", ").append(name);
105  }
106  }
107  text.append(":").append(vartype);
108  return text.toString();
109  }
110 }
void compile(ArrayList< Command > ops, boolean autoWindow)
void resolveNamesAndTypes(Expression with, Environment env)
void addError(Marker marker, String errorId, Object... data)
static void addGuess(String name, Type type)
Definition: Program.java:237
static MethodType getAddFigureMethod()
boolean inherits(Type b)
Definition: Type.java:163
static SystemType getVoid()
Definition: Type.java:76
static SystemType getUnknown()
Definition: Type.java:80
abstract boolean isAbstract()
void compile(ArrayList< Command > ops, Expression target, boolean autowindow)
Impressum