Example #1
0
        public void Condition()
        {
            TokenTypeValue t = E();

            if (t.DataType != DataTypeDefinition.TYPE_BOOL)
            {
                scanner.LogErrorToken(new Token(TokenCategory.Symbol, TokenTypeDefinition.TK_REPEAT, ""));
            }
        }
Example #2
0
        public TokenTypeValue E()
        {
            TokenTypeValue t1 = T();

            while (scanner.CurrentToken.TokenTypeDefinition == TokenTypeDefinition.TK_PLUS ||
                   scanner.CurrentToken.TokenTypeDefinition == TokenTypeDefinition.TK_MINUS)
            {
                TokenTypeDefinition operation = scanner.CurrentToken.TokenTypeDefinition;
                scanner.Match(operation);

                TokenTypeValue t2 = T();

                t1 = Generate(t1, t2, operation);
            }

            return(t1);
        }
Example #3
0
        public TokenTypeValue T()
        {
            TokenTypeValue t1 = M();

            while (scanner.CurrentToken.TokenTypeDefinition == TokenTypeDefinition.TK_SLASH ||
                   scanner.CurrentToken.TokenTypeDefinition == TokenTypeDefinition.TK_STAR)
            {
                TokenTypeDefinition operation = scanner.CurrentToken.TokenTypeDefinition;
                scanner.Match(operation);

                TokenTypeValue t2 = M();

                t1 = Generate(t1, t2, operation);
            }

            return(t1);
        }
Example #4
0
        //ARITHMETIC HEADACHE

        public TokenTypeValue M()
        {
            TokenTypeValue t1 = F();

            while (scanner.CurrentToken.TokenTypeDefinition == TokenTypeDefinition.TK_EQUAL ||
                   scanner.CurrentToken.TokenTypeDefinition == TokenTypeDefinition.TK_NOTEQ ||
                   scanner.CurrentToken.TokenTypeDefinition == TokenTypeDefinition.TK_GTEQ ||
                   scanner.CurrentToken.TokenTypeDefinition == TokenTypeDefinition.TK_GREATER ||
                   scanner.CurrentToken.TokenTypeDefinition == TokenTypeDefinition.TK_LESS ||
                   scanner.CurrentToken.TokenTypeDefinition == TokenTypeDefinition.TK_LTEQ)
            {
                TokenTypeDefinition operation = scanner.CurrentToken.TokenTypeDefinition;
                scanner.Match(operation);

                TokenTypeValue t2 = F();

                t1 = Generate(t1, t2, operation);
            }

            return(t1);
        }
Example #5
0
        public TokenTypeValue Generate(TokenTypeValue t1, TokenTypeValue t2, TokenTypeDefinition operation)
        {
            TokenTypeValue tokenFound = new TokenTypeValue(DataTypeDefinition.TYPE_VOID, null);

            #region plus
            if (operation == TokenTypeDefinition.TK_PLUS)
            {
                if (t1.DataType == t2.DataType)
                {
                    tokenFound.DataType = t1.DataType;
                    if (t1.DataType == DataTypeDefinition.TYPE_INT)
                    {
                        GenerateOperation(OperationTypeDefinition.op_add);
                    }
                    else if (t1.DataType == DataTypeDefinition.TYPE_FLOAT)
                    {
                        GenerateOperation(OperationTypeDefinition.op_fadd);
                    }
                }
                else
                {
                    tokenFound.DataType = DataTypeDefinition.TYPE_FLOAT;
                    if (t1.DataType == DataTypeDefinition.TYPE_FLOAT)
                    {
                        GenerateOperation(OperationTypeDefinition.op_exch);
                        GenerateOperation(OperationTypeDefinition.op_fcon);
                        GenerateOperation(OperationTypeDefinition.op_exch);
                        GenerateOperation(OperationTypeDefinition.op_fadd);
                    }
                    else
                    {
                        GenerateOperation(OperationTypeDefinition.op_fcon);
                        GenerateOperation(OperationTypeDefinition.op_fadd);
                    }
                }
            }
            #endregion

            #region minus
            if (operation == TokenTypeDefinition.TK_MINUS)
            {
                if (t1.DataType == t2.DataType)
                {
                    tokenFound.DataType = t1.DataType;
                    if (t1.DataType == DataTypeDefinition.TYPE_INT)
                    {
                        GenerateOperation(OperationTypeDefinition.op_sub);
                    }
                    else if (t1.DataType == DataTypeDefinition.TYPE_FLOAT)
                    {
                        GenerateOperation(OperationTypeDefinition.op_sub);
                    }
                }
                else
                {
                    tokenFound.DataType = DataTypeDefinition.TYPE_FLOAT;
                    if (t1.DataType == DataTypeDefinition.TYPE_FLOAT)
                    {
                        GenerateOperation(OperationTypeDefinition.op_exch);
                        GenerateOperation(OperationTypeDefinition.op_fcon);
                        GenerateOperation(OperationTypeDefinition.op_exch);
                        GenerateOperation(OperationTypeDefinition.op_sub);
                    }
                    else
                    {
                        GenerateOperation(OperationTypeDefinition.op_fcon);
                        GenerateOperation(OperationTypeDefinition.op_sub);
                    }
                }
            }
            #endregion

            #region star_multiply
            if (operation == TokenTypeDefinition.TK_STAR)
            {
                if (t1.DataType == t2.DataType)
                {
                    tokenFound.DataType = t1.DataType;
                    if (t1.DataType == DataTypeDefinition.TYPE_INT)
                    {
                        GenerateOperation(OperationTypeDefinition.op_mul);
                    }
                    else if (t1.DataType == DataTypeDefinition.TYPE_FLOAT)
                    {
                        GenerateOperation(OperationTypeDefinition.op_fmul);
                    }
                }
                else
                {
                    tokenFound.DataType = DataTypeDefinition.TYPE_FLOAT;
                    if (t1.DataType == DataTypeDefinition.TYPE_FLOAT)
                    {
                        GenerateOperation(OperationTypeDefinition.op_exch);
                        GenerateOperation(OperationTypeDefinition.op_fcon);
                        GenerateOperation(OperationTypeDefinition.op_exch);
                        GenerateOperation(OperationTypeDefinition.op_fmul);
                    }
                    else
                    {
                        GenerateOperation(OperationTypeDefinition.op_fcon);
                        GenerateOperation(OperationTypeDefinition.op_fmul);
                    }
                }
            }
            #endregion

            #region divide_slash
            if (operation == TokenTypeDefinition.TK_SLASH)
            {
                if (t1.DataType == t2.DataType)
                {
                    tokenFound.DataType = t1.DataType;
                    if (t1.DataType == DataTypeDefinition.TYPE_INT)
                    {
                        GenerateOperation(OperationTypeDefinition.op_div);
                    }
                    else if (t1.DataType == DataTypeDefinition.TYPE_FLOAT)
                    {
                        GenerateOperation(OperationTypeDefinition.op_fdiv);
                    }
                }
                else
                {
                    tokenFound.DataType = DataTypeDefinition.TYPE_FLOAT;
                    if (t1.DataType == DataTypeDefinition.TYPE_FLOAT)
                    {
                        GenerateOperation(OperationTypeDefinition.op_exch);
                        GenerateOperation(OperationTypeDefinition.op_fcon);
                        GenerateOperation(OperationTypeDefinition.op_exch);
                        GenerateOperation(OperationTypeDefinition.op_fdiv);
                    }
                    else
                    {
                        GenerateOperation(OperationTypeDefinition.op_fcon);
                        GenerateOperation(OperationTypeDefinition.op_fdiv);
                    }
                }
            }
            #endregion



            #region relational operators
            if (operation == TokenTypeDefinition.TK_EQUAL ||
                operation == TokenTypeDefinition.TK_NOTEQ ||
                operation == TokenTypeDefinition.TK_GTEQ ||
                operation == TokenTypeDefinition.TK_GREATER ||
                operation == TokenTypeDefinition.TK_LESS ||
                operation == TokenTypeDefinition.TK_LTEQ)
            {
                tokenFound.DataType = DataTypeDefinition.TYPE_BOOL;

                if (t1.DataType != t2.DataType)
                {
                    if (t1.DataType == DataTypeDefinition.TYPE_FLOAT && t2.DataType == DataTypeDefinition.TYPE_INT)
                    {
                        GenerateOperation(OperationTypeDefinition.op_fcon);
                    }
                    else if (t1.DataType == DataTypeDefinition.TYPE_INT && t2.DataType == DataTypeDefinition.TYPE_FLOAT)
                    {
                        GenerateOperation(OperationTypeDefinition.op_exch);
                        GenerateOperation(OperationTypeDefinition.op_fcon);
                        GenerateOperation(OperationTypeDefinition.op_exch);
                    }
                    else
                    {
                        scanner.LogErrorToken(new Token(TokenCategory.Identifier, TokenTypeDefinition.TK_DATATYPEMISMATCH, ""));
                    }
                }

                switch (operation)
                {
                case TokenTypeDefinition.TK_EQUAL:
                {
                    GenerateOperation(OperationTypeDefinition.op_eql);
                    break;
                }

                case TokenTypeDefinition.TK_NOTEQ:
                {
                    GenerateOperation(OperationTypeDefinition.op_neq);
                    break;
                }

                case TokenTypeDefinition.TK_GTEQ:
                {
                    GenerateOperation(OperationTypeDefinition.op_geq);
                    break;
                }

                case TokenTypeDefinition.TK_GREATER:
                {
                    GenerateOperation(OperationTypeDefinition.op_gtr);
                    break;
                }

                case TokenTypeDefinition.TK_LESS:
                {
                    GenerateOperation(OperationTypeDefinition.op_lss);
                    break;
                }

                case TokenTypeDefinition.TK_LTEQ:
                {
                    GenerateOperation(OperationTypeDefinition.op_leq);
                    break;
                }
                }
            }
            #endregion

            return(tokenFound);
        }
Example #6
0
        public TokenTypeValue F()
        {
            TokenTypeValue tokenFound = new TokenTypeValue(DataTypeDefinition.TYPE_VOID, null);

            switch (scanner.CurrentToken.TokenTypeDefinition)
            {
            case TokenTypeDefinition.TK_ID:
            {
                SymbolBase searchedSymVar = SymbolTable.FirstOrDefault(p => p.Name == scanner.CurrentToken.Value);
                if (searchedSymVar != null)
                {
                    //get the type of variable
                    if (searchedSymVar.GetType() == typeof(SymbolVariable))
                    {
                        SymbolVariable symVar = (SymbolVariable)searchedSymVar;
                        tokenFound           = new TokenTypeValue(symVar.DataTypeDefinition, symVar.Address);
                        tokenFound.isAddress = true;
                        switch (symVar.DataTypeDefinition)
                        {
                        case DataTypeDefinition.TYPE_BOOL:
                        case DataTypeDefinition.TYPE_CHAR:
                        {
                            GenerateOperation(OperationTypeDefinition.op_fetch);             //does a push of the value onto the stack
                            gen4(symVar.Address);
                            break;
                        }

                        case DataTypeDefinition.TYPE_INT:
                        {
                            GenerateOperation(OperationTypeDefinition.op_fetchi);
                            gen4(symVar.Address);
                            break;
                        }

                        case DataTypeDefinition.TYPE_FLOAT:
                        {
                            GenerateOperation(OperationTypeDefinition.op_fetchf);
                            gen4(symVar.Address);
                            break;
                        }
                        }
                    }
                    else if (searchedSymVar.GetType() == typeof(SymbolProcedure))
                    {
                        //store where to return to in the stack before the parameters
                        GenerateOperation(OperationTypeDefinition.op_pushi);
                        int hole = ip;
                        gen4(0);

                        int             count  = 0;
                        SymbolProcedure symVar = (SymbolProcedure)searchedSymVar;
                        scanner.Match(TokenTypeDefinition.TK_ID);
                        scanner.Match(TokenTypeDefinition.TK_LBRACE);

                        while (scanner.CurrentToken.TokenTypeDefinition != TokenTypeDefinition.TK_RBRACE && scanner.ErrorLog.Count == 0)
                        {
                            count++;
                            switch (scanner.CurrentToken.TokenTypeDefinition)
                            {
                            case TokenTypeDefinition.TK_BOOLLIT:
                            case TokenTypeDefinition.TK_CHARLIT:
                            {
                                GenerateOperation(OperationTypeDefinition.op_push);             //does a push of the value onto the stack
                                gen1(scanner.CurrentToken.Value[0]);
                                break;
                            }

                            case TokenTypeDefinition.TK_INTLIT:
                            {
                                GenerateOperation(OperationTypeDefinition.op_pushi);
                                gen4(Convert.ToInt32(scanner.CurrentToken.Value));
                                break;
                            }

                            case TokenTypeDefinition.TK_REALLIT:
                            {
                                GenerateOperation(OperationTypeDefinition.op_pushf);
                                gen8(Convert.ToSingle(scanner.CurrentToken.Value));
                                break;
                            }
                            }
                            scanner.Match(scanner.CurrentToken.TokenTypeDefinition);
                            if (scanner.CurrentToken.TokenTypeDefinition == TokenTypeDefinition.TK_COMMA)
                            {
                                scanner.Match(scanner.CurrentToken.TokenTypeDefinition);
                            }
                        }
                        gen_Address(ip, hole);         //push where to return to the bottom of the parameters
                        scanner.Match(TokenTypeDefinition.TK_SEMI);

                        if (count != symVar.Arguments.Count)
                        {
                            scanner.LogErrorToken(new Token(TokenCategory.Literal, TokenTypeDefinition.TK_INVALID_NUMBER_OF_ARGUMENTS, ""));
                        }
                    }
                }
                break;
            }

            case TokenTypeDefinition.TK_INTLIT:
            {
                GenerateOperation(OperationTypeDefinition.op_pushi);
                gen4(Convert.ToInt32(scanner.CurrentToken.Value));
                tokenFound = new TokenTypeValue(DataTypeDefinition.TYPE_INT, Convert.ToInt32(scanner.CurrentToken.Value));

                break;
            }

            case TokenTypeDefinition.TK_REALLIT:
            {
                GenerateOperation(OperationTypeDefinition.op_pushf);
                gen8(Convert.ToInt32(scanner.CurrentToken.Value));
                tokenFound = new TokenTypeValue(DataTypeDefinition.TYPE_FLOAT, Convert.ToSingle(scanner.CurrentToken.Value));
                break;
            }

            case TokenTypeDefinition.TK_BOOLLIT:
            {
                GenerateOperation(OperationTypeDefinition.op_push);
                gen1(Convert.ToBoolean(scanner.CurrentToken.Value) ? '1' : '0');
                tokenFound = new TokenTypeValue(DataTypeDefinition.TYPE_BOOL, Convert.ToBoolean(scanner.CurrentToken.Value));
                break;
            }

            case TokenTypeDefinition.TK_CHARLIT:
            {
                GenerateOperation(OperationTypeDefinition.op_push);
                gen1(scanner.CurrentToken.Value[0]);
                tokenFound = new TokenTypeValue(DataTypeDefinition.TYPE_CHAR, scanner.CurrentToken.Value);
                break;
            }
            }
            scanner.Advance();
            return(tokenFound);
        }