private Environment(AbsMachine machine)
 {
     this.parent        = null;
     parameters         = new Dictionary <string, AbsType>();
     locals             = new Dictionary <string, AbsType>();
     SentencaImperativa = false;
     this.machine       = machine;
     // O CodeAddress é inicializado pela ação semântica @MainCode
     this.returnvalue = null;
 }
        public Environment(Environment parent)
        {
            this.parent  = parent;
            this.machine = parent.machine;

            EntryPoint();

            parameters         = new Dictionary <string, AbsType>();
            locals             = new Dictionary <string, AbsType>();
            SentencaImperativa = false;
            this.returnvalue   = null;
        }
 public ProcType(Environment env, AbsMachine machine) : base(EnumType.PROC)
 {
     Env = new Environment(env);
 }
 public FuncType(Environment env, AbsMachine machine) : base(EnumType.FUNC)
 {
     Env = new Environment(env);
 }
        public bool Parse(string text)
        {
            Scanner    lex     = new Scanner();
            Semantic   sem     = new Semantic();
            AbsMachine machine = new AbsMachine();

            text += "#";

            int         pos = 0;
            Stack <Tag> stk = new Stack <Tag>();

            // Tabela de Símbolos Principal
            Environment simbolTable = Environment.root;

            // Local para introduzir símbolos globais
            // ....

            Token previous = null;

            Token current = lex.NextToken(text, simbolTable, ref pos);

            // Console.WriteLine(current.ToString());

            PushRHS(stk, RHS[0]);

            while (true)
            {
                Tag A = stk.Pop();

                if (A.IsVariable())
                {
                    int rule = M[(int)A][(int)current.TAG];

                    if (rule == -1)
                    {
                        line = lex.ErrorLine;
                        return(false);
                    }

                    PushRHS(stk, RHS[rule]);

                    // Attributes adjustment
                    switch (rule)
                    {
                    // 2.	<identifier_list'> ::= @Echo .
                    case 2:
                        stk.ElementAt <Tag>(0).Inherited[0] = A.Inherited[0];
                        break;

                    // 3.	<identifier_list'> ::= ',' 'idnew' @InsertList <identifier_list'> .
                    case 3:
                        stk.ElementAt <Tag>(2).Inherited[0] = A.Inherited[0];
                        break;

                    // 33.	<variable'> ::= @Echo .
                    case 33:
                        stk.ElementAt <Tag>(0).Inherited[0] = A.Inherited[0];
                        break;

                    // 34.	<variable'> ::= '[' <simple_expression> @Indexed ']' .
                    case 34:
                        stk.ElementAt <Tag>(2).Inherited[1] = A.Inherited[0];
                        break;

                    // 39.	<expression_list'> ::= @EndActualPar .
                    case 39:
                        stk.ElementAt <Tag>(0).Inherited[0] = A.Inherited[0];
                        break;

                    // 40.	<expression_list'> ::= ',' <expression> @NextActualPar <expression_list'> .
                    case 40:
                        stk.ElementAt <Tag>(2).Inherited[1] = A.Inherited[0];
                        break;

                    // 42.	<expression'> ::= @Echo .
                    case 42:
                        stk.ElementAt <Tag>(0).Inherited[0] = A.Inherited[0];
                        break;

                    // 43.	<expression'> ::= 'relop' @RelOp <simple_expression> @Rel .
                    case 43:
                        stk.ElementAt <Tag>(3).Inherited[2] = A.Inherited[0];
                        break;

                    // 45.	<simple_expression'> ::= @Echo  .
                    case 45:
                        stk.ElementAt <Tag>(0).Inherited[0] = A.Inherited[0];
                        break;

                    // 46.	<simple_expression'> ::= 'addop' @AddOp <term> @Add <simple_expression'> .
                    case 46:
                        stk.ElementAt <Tag>(3).Inherited[2] = A.Inherited[0];
                        break;

                    // 48.	<term'> ::= @Echo .
                    case 48:
                        stk.ElementAt <Tag>(0).Inherited[0] = A.Inherited[0];
                        break;

                    case 49:
                        // 49.	<term'> ::= 'mulop' @MulOp <factor> @Mul <term'> .
                        stk.ElementAt <Tag>(3).Inherited[2] = A.Inherited[0];
                        break;

                    // 57.	<varexp> ::= @Echo .
                    case 57:
                        stk.ElementAt <Tag>(0).Inherited[0] = A.Inherited[0];
                        break;

                    // 58.	<varexp> ::= '[' <simple_expression> @FromArray ']' .
                    case 58:
                        stk.ElementAt <Tag>(2).Inherited[1] = A.Inherited[0];
                        break;

                    default:
                        break;
                    }
                }
                else if (A.IsTerminal())
                {
                    if (A != current.TAG)
                    {
                        line = lex.ErrorLine;
                        return(false);
                    }

                    if (A == Tag.vtSharp)
                    {
                        return(true);
                    }

                    // pop
                    previous = current;
                    current  = lex.NextToken(text, simbolTable, ref pos);

                    // Console.WriteLine(current.ToString());

                    if (current == Token.UNKNOW)
                    {
                        line = lex.ErrorLine;
                        return(false);
                    }
                }
                else
                {
                    sem.Execute(A, stk, previous, ref simbolTable);
                }
            }
        }