20 #region Private Variables
24 private List<String> sourceCode;
29 #region Private Methods
31 private void Scan(
string scriptName)
34 Scanner scanner = manager.Scanner;
35 sourceCode = scanner.
Scan(scriptName);
38 Dictionary<string, bool> included =
new Dictionary<string, bool>();
40 for (
int i = 0; i < sourceCode.Count; i++)
43 string line = sourceCode[i];
45 Lexer lexer =
new Lexer(
new List<string> { line });
47 List<Token> tokenStream =
null;
58 if (tokenStream.Count == 0)
61 if (tokenStream[0].Type !=
TokenType.Include)
64 if (tokenStream.Count < 2)
67 if (tokenStream[1].Type !=
TokenType.String)
68 throw new ParserException(
"Nach einem 'include' Befehl wird ein String (Pfad) erwartet.");
70 if (tokenStream.Count < 3)
71 throw new ParserException(
"Semicolon ';' am Ende eines 'include' Statement erwartet.");
73 if (tokenStream[2].Type !=
TokenType.SemiColon)
74 throw new ParserException(
"Semicolon ';' am Ende eines 'include' Statement erwartet.");
76 if (tokenStream.Count > 3)
77 throw new ParserException(
"Es wird nichts nach dem Semicolon ';' am Ende eines 'include' Statement erwartet.");
79 string include = (string)tokenStream[1].Lexeme;
81 sourceCode.RemoveAt(i);
83 if (included.ContainsKey(include))
87 sourceCode.InsertRange(i, scanner.
Scan(include));
90 included[include] =
true;
100 #region Public Methods
112 return int.Parse(st.
Lexeme, CultureInfo.InvariantCulture);
116 return float.Parse(st.
Lexeme, CultureInfo.InvariantCulture);
120 return double.Parse(st.
Lexeme, CultureInfo.InvariantCulture);
124 return bool.Parse(st.
Lexeme);
129 if (st.
Lexeme.Length == 1)
133 if (st.
Lexeme.Length >= 3 &&
140 throw new FormatException($
"Ungültiges Char-Lexeme: '{st.Lexeme}'");
151 if (st.
Lexeme.Length >= 2 &&
165 private static object ConvertLexeme(
TokenType type,
string lexemeStr)
171 if (lexemeStr ==
null)
177 return int.Parse(lexemeStr, CultureInfo.InvariantCulture);
180 return float.Parse(lexemeStr, CultureInfo.InvariantCulture);
183 return double.Parse(lexemeStr, CultureInfo.InvariantCulture);
186 return bool.Parse(lexemeStr);
190 if (lexemeStr.Length == 1)
194 if (lexemeStr.Length >= 3 &&
195 lexemeStr[0] ==
'\'' &&
196 lexemeStr[^1] ==
'\'')
201 throw new FormatException($
"Ungültiges Char-Lexeme: '{lexemeStr}'");
205 if (lexemeStr.Length >= 2 &&
206 lexemeStr[0] ==
'"' &&
207 lexemeStr[^1] ==
'"')
209 return lexemeStr.Substring(1, lexemeStr.Length - 2);
222 this.manager = manager;
224 this.scriptName = scriptName;
233 List<Token> tokenStream = lexer.
GetTokens();
237 parser.DebugMode = this.manager.
Debug;
239 executable = parser.
Parse();
244 Optimizer optimizer =
new Optimizer(executable);
246 optimizer.OptimizerInfo =
false;
248 optimizer.Optimize();
254 catch (Exception exception)
264 this.manager = manager;
266 this.scriptName = scriptName;
271 List<Token> tokenStream =
null;
274 tokenStream =
new List<Token>();
275 using (var fs =
new FileStream(scriptName, FileMode.Open, FileAccess.Read))
276 using (var br =
new BinaryReader(fs))
278 int count = br.ReadInt32();
280 for (
int i = 0; i < count; i++)
282 var typeInt = br.ReadInt32();
283 var lexemeStr = br.ReadString();
284 var line = br.ReadInt32();
285 var column = br.ReadInt32();
289 object lexeme = ConvertLexeme(type, lexemeStr);
291 tokenStream.Add(
new Token(type, lexeme, line, column, text));
297 string json = File.ReadAllText(scriptName, Encoding.UTF8);
299 var serializableTokens = JsonSerializer.Deserialize<List<SerializableToken>>(json);
302 tokenStream = serializableTokens
303 .Select(st =>
new Token(
314 parser.DebugMode = this.manager.
Debug;
316 executable = parser.
Parse();
322 Optimizer optimizer =
new Optimizer(executable);
324 optimizer.OptimizerInfo =
false;
326 optimizer.Optimize();
332 catch (Exception exception)
349 List<Token> tokenStream = lexer.
GetTokens();
351 using (var fs =
new FileStream(fileName, FileMode.Create, FileAccess.Write))
352 using (var bw =
new BinaryWriter(fs))
355 bw.Write(tokenStream.Count);
357 foreach (var t
in tokenStream)
359 bw.Write((
int)t.Type);
360 bw.Write(t.Lexeme?.ToString() ??
"");
368 catch (Exception exception)
384 List<Token> tokenStream = lexer.
GetTokens();
389 Lexeme = t.Lexeme?.ToString(),
395 var options =
new JsonSerializerOptions
400 string json = JsonSerializer.Serialize(serializableTokens, options);
403 File.WriteAllText(fileName, json, Encoding.UTF8);
406 catch (Exception exception)
414 return executable.FunctionExists(
"main");
419 #region Public Properties
423 get {
return manager; }
428 get {
return scriptName; }
433 get {
return sourceCode.AsReadOnly(); }
440 StringBuilder sb =
new StringBuilder();
441 foreach (
string line
in sourceCode)
446 return sb.ToString();
452 get {
return executable; }
457 get {
return executable.ScriptMemory; }
470 get {
return executable.MainFunction; }