Ejemplo n.º 1
0
        public NablaAssembler(Stream code, string name = null)
        {
            Console.WriteLine("Cargando código en memoria...");

            an = new AssemblyName(name ?? Guid.NewGuid().ToString());
#if NET48
            ab = AssemblyBuilder.DefineDynamicAssembly(an, AssemblyBuilderAccess.RunAndSave);
            mb = ab.DefineDynamicModule(an.Name, $"{an.Name}.exe");
#endif
            nv = new NablaVisitor(ref mb);

            var lexer              = new VoltaScanner(CharStreams.fromStream(code));
            var tokens             = new CommonTokenStream(lexer);
            var parser             = new VoltaParser(tokens);
            var tree               = parser.program();
            var contextualAnalysis = new ContextualAnalysis();
            contextualAnalysis.Visit(tree);

            Console.WriteLine("Ensamblando código...");

            nv.Visit(tree);

            nv.rootType.CreateType();
#if NET48
            ab.SetEntryPoint(nv.mainMethod);
#endif

            Console.WriteLine("Código ensamblado correctamente.");
        }
Ejemplo n.º 2
0
        public static Tuple <IParseTree, List <VoltaCompilerError> > Check(string text)
        {
            ICharStream              charStream    = CharStreams.fromstring(text);
            VoltaScanner             scanner       = new VoltaScanner(charStream);
            ITokenStream             tokens        = new CommonTokenStream(scanner);
            VoltaParser              parser        = new VoltaParser(tokens);
            VoltaParserErrorListener errorListener = new VoltaParserErrorListener();

            parser.RemoveErrorListeners();
            parser.AddErrorListener(errorListener);
            IParseTree         tree = parser.program();
            ContextualAnalysis contextualAnalysis = new ContextualAnalysis();

            List <VoltaCompilerError> errors = new List <VoltaCompilerError>();

            errors.AddRange(errorListener.Errors);
            {
                contextualAnalysis.Visit(tree);
                errors.AddRange(contextualAnalysis.Errors);
            }

            return(new Tuple <IParseTree, List <VoltaCompilerError> >(tree, errors));
        }