EOS 2  1.1.0
Einfache Objektbasierte Sprache
EosParser.java
gehe zur Dokumentation dieser Datei
1 package de.lathanda.eos.interpreter.parser.de;
2 
3 import java.util.TreeSet;
4 
5 import de.lathanda.eos.baseparser.BasicParser;
6 import de.lathanda.eos.baseparser.CompilerError;
7 import de.lathanda.eos.baseparser.Program;
8 import de.lathanda.eos.baseparser.exceptions.TranslationException;
9 import de.lathanda.eos.vm.ErrorInformation;
10 import de.lathanda.eos.vm.Marker;
11 
12 public class EosParser implements BasicParser {
13  Parser parser;
14  StringCharStream scs;
15  public EosParser(String source) {
16  scs = new StringCharStream(source);
17  ParserTokenManager tokenmanager = new ParserTokenManager(scs);
18  parser = new Parser(tokenmanager);
19  }
20  @Override
21  public void parse(Program program, String path) throws TranslationException {
22  try {
23  parser.Parse(program, path);
24  } catch (ParseException pe) {
25  throw new TranslationException(handleParseException(pe));
26  } catch (TokenMgrError ex) {
27  throw new TranslationException(new CompilerError("Token.Error", ex.getLocalizedMessage()));
28  } catch (NumberFormatException nfe) {
29  throw new TranslationException(new CompilerError("Number.Error", nfe.getLocalizedMessage()));
30  } catch (RuntimeException re) {
31  throw new TranslationException(new CompilerError("Generic.Error", re.getLocalizedMessage()));
32  } catch (Throwable t) {
33  throw new TranslationException(new CompilerError("UnknownError", t.getLocalizedMessage()));
34  }
35  }
36  private ErrorInformation handleParseException(ParseException pe) {
37  if (pe.expectedTokenSequences == null) {
38  return new CompilerError("Compile.Error", pe.getLocalizedMessage());
39  }
40  StringBuilder expected = new StringBuilder();
41  StringBuilder encountered = new StringBuilder();
42  int maxSize = 0;
43  int item = 1;
44  for (int[] expectedTokenSequence : pe.expectedTokenSequences) {
45  expected.append("\n").append(item++).append(") ");
46  if (maxSize < expectedTokenSequence.length) {
47  maxSize = expectedTokenSequence.length;
48  }
49  for (int j = 0; j < expectedTokenSequence.length; j++) {
50  expected.append(unescape(pe.tokenImage[expectedTokenSequence[j]])).append(' ');
51  }
52  if (expectedTokenSequence[expectedTokenSequence.length - 1] != 0) {
53  expected.append("...");
54  }
55  }
56  Token tok = pe.currentToken.next;
57  TreeSet<String> alreadyUsed = new TreeSet<>();
58  for (int i = 0; i < maxSize; i++) {
59  if (!alreadyUsed.add(pe.tokenImage[i])) {
60  continue;
61  }
62  if (i != 0) {
63  encountered.append(" ");
64  }
65  if (tok.kind == ParserConstants.EOF) {
66  encountered.append(pe.tokenImage[0]);
67  break;
68  }
69 
70  encountered.append(unescape(pe.tokenImage[tok.kind]));
71  tok = tok.next;
72 
73  }
74  Token token = pe.currentToken;
75  return new CompilerError(new Marker(token.beginColumn, token.beginLine, token.endColumn, token.endLine), "Parser.Error", encountered, expected,
76  token.endLine);
77  }
78  private String unescape(String text) {
79  int i = text.indexOf("\\u");
80  if (i == -1) {
81  return text;
82  }
83 
84  StringBuilder sb = new StringBuilder();
85  int a = 0;
86  while (i != -1) {
87  sb.append(text.substring(a, i));
88  a = i + 6;
89  sb.append((char) Integer.parseInt(text.substring(i + 2, a), 16));
90  i = text.indexOf("\\u", a);
91  }
92  sb.append(text.substring(a));
93  return sb.toString();
94  }
95  @Override
96  public int getLine(int pos) {
97  return scs.getLine(pos);
98  }
99 
100 }
void parse(Program program, String path)
Definition: EosParser.java:21
final void Parse(Program program, String path)
Definition: Parser.java:58
Impressum