private void String() { while (Peek() != '"' && !IsEof()) { if (Peek() == '\n') { this.line++; } Advance(); } if (IsEof()) { // Log exception; return; } var svalue = System.Text.Encoding.Default.GetString(Memcopy(fileData, start + 1, current - 1)); Lexeme s = new Lexeme(LexemeType.STRING, this.line, this.column); s.AddToken(svalue.ToString()); this.lexemes.Add(s); Advance(); }
internal void AddSymbol(char symbol, Int64 type) { var lex = new Lexeme(type, this.line, this.column); lex.AddToken(symbol); this.lexemes.Add(lex); }
internal void Number() { while (IsNumber(Peek())) { Advance(); } var svalue = System.Text.Encoding.Default.GetString(Memcopy(fileData, start, current)); Lexeme number = new Lexeme(LexemeType.NUMBER, this.line, this.column); number.AddToken(svalue); this.lexemes.Add(number); }
internal void Identifier() { while (IsLetterOrDigit(Peek()) || Peek() == '_') { Advance(); } var svalue = Encoding.Default.GetString(Memcopy(fileData, start, current)); Lexeme identifier = new Lexeme(LexemeType.IDENTIFIER, this.line, this.column); identifier.AddToken(svalue); TryGetKeyWord(identifier); this.lexemes.Add(identifier); }
private Expression Equality() { Expression expr = Comparison(); while (Match(LexemeType.BANG_EQUAL) || Match(LexemeType.EQUAL_EQUAL)) { Lexeme op = Previous(); // Bug - I need to consume the second operator when doing comparisions. // Hack I need to figure out a better way to do this. Lexeme secondOp = Advance(); if (secondOp.LexemeType == LexemeType.EQUAL) { op.AddToken(secondOp); op.LexemeType = LexemeType.EQUAL_EQUAL; } // see what it is? maybe update the lexeme? Expression right = Comparison(); expr = new Expression.Binary(expr, op, right); } return(expr); }
internal void CSharpExec() { while (Peek() != '}' && !IsEof()) { Advance(); } var svalue = Encoding.Default.GetString(Memcopy(fileData, start + 2, current)); var execText = @" using System; using System.Diagnostics; namespace JukaCSharp { public class MyClass { // Main Method public static string Main() { " + svalue + @" } } }"; var syntaxTree = CSharpSyntaxTree.ParseText(execText); string assemblyName = Path.GetRandomFileName(); MetadataReference[] references = new MetadataReference[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location), MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location) }; CSharpCompilation compilation = CSharpCompilation.Create( assemblyName, syntaxTrees: new[] { syntaxTree }, references: references, options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); using (var ms = new MemoryStream()) { EmitResult result = compilation.Emit(ms); if (!result.Success) { IEnumerable <Diagnostic> failures = result.Diagnostics.Where(diagnostic => diagnostic.IsWarningAsError || diagnostic.Severity == DiagnosticSeverity.Error); foreach (Diagnostic diagnostic in failures) { Console.Error.WriteLine("{0}: {1}", diagnostic.Id, diagnostic.GetMessage()); } } else { ms.Seek(0, SeekOrigin.Begin); Assembly assembly = Assembly.Load(ms.ToArray()); Type type = assembly.GetType("JukaCSharp.MyClass"); object obj = Activator.CreateInstance(type); Object Csharpres = type.InvokeMember("Main", BindingFlags.Default | BindingFlags.InvokeMethod, null, obj, new object[] { }); Lexeme s = new Lexeme(LexemeType.STRING, this.line, this.column); s.AddToken(Csharpres.ToString()); this.lexemes.Add(s); } } Advance(); }