1 package de.lathanda.eos.baseparser;
3 import java.util.ArrayList;
4 import java.util.LinkedList;
5 import java.util.TreeMap;
7 import de.lathanda.eos.baseparser.exceptions.DoubleClassDeclarationException;
8 import de.lathanda.eos.baseparser.exceptions.TranslationException;
9 import de.lathanda.eos.vm.AbstractMachine;
10 import de.lathanda.eos.vm.Command;
11 import de.lathanda.eos.vm.DebugPoint;
12 import de.lathanda.eos.vm.ErrorInformation;
13 import de.lathanda.eos.vm.MProcedure;
14 import de.lathanda.eos.vm.Machine;
15 import de.lathanda.eos.vm.Marker;
16 import de.lathanda.eos.vm.PrettyPrinter;
17 import de.lathanda.eos.vm.ReservedVariables;
18 import de.lathanda.eos.vm.commands.CreateVariable;
27 private final String defaultWindowName;
28 private final boolean lockProperties;
29 private final static TreeMap<String, Type> guessTable =
new TreeMap<>();
31 private final LinkedList<SubRoutine> sub;
32 private final TreeMap<String, UserClass> userclass;
33 private final LinkedList<MarkedNode> nodeList;
34 private final LinkedList<InfoToken> tokenList;
36 private final String source;
41 this(org.parserFactory, org.defaultWindowName, org.lockProperties);
44 this.defaultWindowName = defaultWindowName;
45 this.lockProperties = lockProperties;
46 this.parserFactory = parserFactory;
51 sub =
new LinkedList<>();
52 userclass =
new TreeMap<>();
53 env =
new Environment(
this, defaultWindowName, lockProperties);
54 nodeList =
new LinkedList<>();
55 tokenList =
new LinkedList<>();
58 public Program(String source,
ParserFactory parserFactory, String defaultWindowName,
boolean lockProperties) {
59 this.defaultWindowName = defaultWindowName;
60 this.lockProperties = lockProperties;
61 this.parserFactory = parserFactory;
66 sub =
new LinkedList<>();
67 userclass =
new TreeMap<>();
68 env =
new Environment(
this, defaultWindowName, lockProperties);
69 nodeList =
new LinkedList<>();
70 tokenList =
new LinkedList<>();
76 parser.
parse(
this, path);
96 tokenList.add(sourceToken);
118 this.program.
append(subprogram.program);
119 this.sub.addAll(subprogram.sub);
120 this.userclass.putAll(subprogram.userclass);
121 this.nodeList.addAll(subprogram.nodeList);
126 LinkedList<ProgramUnit> temp =
new LinkedList<>();
127 sub.forEach(s -> temp.add(s));
139 for (
UserClass uc : userclass.values()) {
142 for (
UserClass uc : userclass.values()) {
143 uc.checkCyclicStorage();
150 for (
UserClass uc : userclass.values()) {
151 uc.resolveNamesAndTypes(env);
158 if (s.getGlobalAccess()) {
163 s.resolveNamesAndTypes(
null, env);
167 for (
UserClass uc : userclass.values()) {
170 ArrayList<Command> ops =
new ArrayList<>();
178 ops =
new ArrayList<>();
195 type = seekTypeSemantical(position);
197 type = useBestGuess(position);
202 private Type seekTypeSemantical(
int position) {
205 if (node.getMarker().getEndPosition() < position) {
214 if (target ==
null) {
215 return Type.getUnknown();
221 private Type useBestGuess(
int position) {
223 for (
int i = Math.min(position, source.length()); i-- > 0;) {
224 if (Character.isWhitespace(source.charAt(i))) {
229 String name = source.substring(start, position).trim();
230 if (guessTable.containsKey(name)) {
231 return guessTable.get(name);
233 return Type.getUnknown();
239 guessTable.put(name, type);
255 StringBuilder res =
new StringBuilder();
256 res.append(
"program\n");
258 res.append(
"endprogram\n");
262 for (
UserClass uc : userclass.values()) {
266 return res.toString();
270 prettyPrinter.
newline(position, level);
283 }
catch (Exception e) {
295 LinkedList<AutoCompleteInformation> classInfos =
new LinkedList<>();
297 for (
UserClass uc : userclass.values()) {
298 classInfos.add(uc.getAutoComplete());
306 UserClass uc = userclass.getOrDefault(name.toLowerCase(),
null);
311 userclass.put(name.toLowerCase(), uc);
322 UserClass uc = userclass.getOrDefault(name.toLowerCase(),
null);
325 userclass.put(name.toLowerCase(), uc);
LinkedList< ErrorInformation > getErrors()
final void setMarker(Marker cr)
synchronized int getLine(int pos)
AutoCompleteType seekType(int position)
ProgramSequence getProgram()
synchronized void parse(String path)
void merge(Program subprogram, Marker marker)
static void addGuess(String name, Type type)
LinkedList< AutoCompleteInformation > getClassAutoCompletes()
Program(String source, ParserFactory parserFactory, String defaultWindowName, boolean lockProperties)
AbstractMachine getMachine()
UserClass createUserClass(String name)
LinkedList< ErrorInformation > getErrors()
void addNode(MarkedNode node)
Program(ParserFactory parserFactory, String defaultWindowName, boolean lockProperties)
LinkedList< InfoToken > getTokenList()
LinkedList< MarkedNode > getNodeList()
LinkedList< ProgramUnit > getSubPrograms()
void prettyPrinterNewline(int position, int level)
Type getTypeByName(String name)
void addToken(SourceToken sourceToken)
void resolveNamesAndTypes(Expression with, Environment env)
void compile(ArrayList< Command > ops, boolean autoWindow)
static String createUserFunctionSignature(String name, Type[] parameters)
static SystemType getInstanceByName(String name)
static SystemType getClassType()
static SystemType getWindow()
LinkedList< AutoCompleteInformation > getAutoCompletes()
void newline(int position, int level)
void parse(Program program, String path)
BasicParser createParser(String source)