Beispiel #1
0
        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();
        }
Beispiel #2
0
        internal void AddSymbol(char symbol, Int64 type)
        {
            var lex = new Lexeme(type, this.line, this.column);

            lex.AddToken(symbol);
            this.lexemes.Add(lex);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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();
        }