Пример #1
0
        public override Type VisitVar_stmt(BRAQParser.Var_stmtContext context) //var a (=...)?
        {
            var assigner = this.local_def_to_assignment[context];

            result_box.local_defs.Add(context);

            Type t = assigner.Accept(this);

            locals_type[context] = t;

            return(type_dict[context] = typeof(void));
        }
Пример #2
0
        public override int VisitVar_node(BRAQParser.Var_nodeContext context)
        {
            if (variable_to_declaration.ContainsKey(context.id_name))
            {
                BRAQParser.Var_stmtContext declaration_point = variable_to_declaration[context.id_name];
                int var_id = Array.IndexOf(locals, declaration_point);
                il.Emit(OpCodes.Ldloc, var_id);
                return(0);
            }

            int n = current_method.arguments.IndexOf(
                current_method.arguments.First(x => x.a == context.id_name.Text)
                );

            il.Emit(OpCodes.Ldarg, n);

            return(0);
        }
Пример #3
0
        private bool TryResolve(IToken variable_token, out BRAQParser.Var_stmtContext definition_point)
        {
            if (local_scope.ContainsKey(variable_token.Text))
            {
                definition_point = local_scope[variable_token.Text];
                return(true);
            }
            if (outer_scope.ContainsKey(variable_token.Text))
            {
                definition_point = outer_scope[variable_token.Text];
                return(true);
            }

            /*
             * Console.WriteLine($"unknown variable {variable_token.Text} [Line {variable_token.Line}]");
             * throw new UnknownVariableException();*/
            definition_point = null;
            return(false);
        }
Пример #4
0
        public override int VisitVar_stmt(BRAQParser.Var_stmtContext context)
        {
            if (context.assignee != null)
            {
                context.assignee.Accept(this);

                var target_token = context.id_name;

                var assignment_point = variable_to_declaration[target_token];
                int var_id           = Array.IndexOf(locals, assignment_point);
                if (var_id == -1)
                {
                    throw new Exception();
                }
                //Console.WriteLine(var_id);
                //Console.WriteLine(_varList[0]);
                il.Emit(OpCodes.Stloc, var_id);
            }
            return(0);
        }
Пример #5
0
        public override int VisitVar_stmt(BRAQParser.Var_stmtContext context)
        {
            if (local_scope.ContainsKey(context.id_name.Text))
            {
                Console.WriteLine($"redeclared local variable {context.id_name.Text} [Line {context.id_name.Line}]");
                throw new RedeclaredVariableException();
            }



            assigned[context] = false;
            local_scope[context.id_name.Text] = context;

            if (context.assignee != null)
            {
                context.assignee.Accept(this);
                assigned[context]  = true;
                assigners[context] = context.assignee;
            }

            declaration[context.id_name] = context;
            return(0);
        }
Пример #6
0
 /// <summary>
 /// Visit a parse tree produced by <see cref="BRAQParser.var_stmt"/>.
 /// <para>
 /// The default implementation returns the result of calling <see cref="AbstractParseTreeVisitor{Result}.VisitChildren(IRuleNode)"/>
 /// on <paramref name="context"/>.
 /// </para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 /// <return>The visitor result.</return>
 public virtual Result VisitVar_stmt([NotNull] BRAQParser.Var_stmtContext context)
 {
     return(VisitChildren(context));
 }
Пример #7
0
 /// <summary>
 /// Exit a parse tree produced by <see cref="BRAQParser.var_stmt"/>.
 /// <para>The default implementation does nothing.</para>
 /// </summary>
 /// <param name="context">The parse tree.</param>
 public virtual void ExitVar_stmt([NotNull] BRAQParser.Var_stmtContext context)
 {
 }