public static ADFunctionCall fce_call(string fceName = "")
        {
            STRecord fceRecord = null;
            var      result    = new ADFunctionCall();

            fceRecord = STSearch(fceName);

            if (MainFSM.GetNextToken().Type != TokenType.leftRBType)
            {
                SyntaxError("Byl ocekavan znak \'(\' pri volani funkce.");
            }

            var argumentsList = new List <IADExpression>();

            while (MainFSM.PeekNextToken().Type != TokenType.rightRBType)
            {
                argumentsList.Add(PrecedenceSyntaxAnalysis.Precedence(TokenType.rightRBType));

                if (MainFSM.PeekNextToken().Type == TokenType.comType)
                {
                    MainFSM.GetNextToken();
                }
            }

            result.Arguments = argumentsList;
            result.STRecord  = fceRecord;


            if (MainFSM.GetNextToken().Type != TokenType.rightRBType)
            {
                SyntaxError("Byl ocekavan znak \')\' pri volani funkce.");
            }

            return(result);
        }
        public static IADNode WhileLoop()
        {
            MainFSM.GetNextToken();

            if (MainFSM.GetNextToken().Type != TokenType.leftRBType)
            {
                ParserFunctions.SyntaxError("Byl ocekavan znak \'(\'");
            }

            var result = new ADWhileLoop();

            result.Condition = PrecedenceSyntaxAnalysis.Precedence(TokenType.rightRBType);

            if (MainFSM.GetNextToken().Type != TokenType.rightRBType)
            {
                ParserFunctions.SyntaxError("Byl ocekavan znak \')\'");
            }

            if (MainFSM.GetNextToken().Type != TokenType.leftCBType)
            {
                ParserFunctions.SyntaxError("Byl ocekavan znak \'{\'");
            }

            ParserFunctions.STablesStack.Push(new STable());
            result.Body = ParserFunctions.statement_list();

            if (MainFSM.GetNextToken().Type != TokenType.rightCBType)
            {
                ParserFunctions.SyntaxError("Byl ocekavan znak \'}\'");
            }

            ParserFunctions.STablesStack.Pop();

            return(result);
        }
        public static void global_decl_type(ADVariable variable)
        {
            if (MainFSM.PeekNextToken().Type == TokenType.leftABType) // Pokud je dalsi token leva hranata zavorka
            {
                MainFSM.GetNextToken();                               // Sezeru levou hranatou zavorku
                // Zavolam precedencni syntakticky analyzator na vyhodnoceni cisla
                var expression = PrecedenceSyntaxAnalysis.Precedence(TokenType.rightABType);

                variable.ArrayDimensions.Add(new ADArrayDimension()
                {
                    ValuesCount = expression
                });
                // Dalsi token musi byt prava hranata zavorka, jinak jde o syntaktickou chybu
                if (MainFSM.GetNextToken().Type != TokenType.rightABType)
                {
                    SyntaxError("Byl ocekavan znak /']/'");
                }

                global_decl_type(variable); // Znovu rekurzivne zavolam tuto metodu
            }

            var nextToken = MainFSM.PeekNextToken();

            if (nextToken.Type == TokenType.comType || nextToken.Type == TokenType.semiType || nextToken.Type == TokenType.asgnType)
            {
                return;
            }
            else
            {
                SyntaxError("Byl ocekavan znak \';\' nebo \',\'");
            }
        }
        /// <summary>
        /// Metoda, ktera priradi promenne (poli) hodnotu/y
        /// </summary>
        /// <param name="variable"></param>
        public static void global_assign_value(ADVariable variable)
        {
            // Pokud hodnota zacina na slozenou zavorku '{'
            if (MainFSM.PeekNextToken().Type == TokenType.leftCBType)
            {
                // Pokud slo o pole, je to chyba
                // TODO
                if (variable.Type == ADVariable.VarType.array)
                {
                    SyntaxError("Nelze priradit polozky do j*z deklarovaneho pole s pevnym poctem znaku.");
                }

                MainFSM.GetNextToken(); // Sezeru '{'
                global_array_item(variable);

                if (MainFSM.GetNextToken().Type != TokenType.rightCBType)
                {
                    SyntaxError("Byl ocekavan znak \'}\'");
                }
            }
            // Pokud to neni prirazeni hodnot do pole, prirazuji hodnotu do promenne
            else
            {
                var expression = PrecedenceSyntaxAnalysis.Precedence(TokenType.semiType, true);
                variable.Value = expression;
            }
        }
        public static ADVariableAssignment IDAssign(bool dereference)
        {
            var token = MainFSM.GetNextToken();

            if (token.Type != TokenType.idType)
            {
                ParserFunctions.SyntaxError("Byla ocekavana promenna.");
            }

            var record = ParserFunctions.STSearch(token.Attribute);

            if (record == null)
            {
                ParserFunctions.SemanticError($"Promenna {token.Attribute} nebyla deklarovana");
            }

            var asgnOperator = MainFSM.GetNextToken();

            if (!IsAssignOperator(asgnOperator.Type))
            {
                ParserFunctions.SyntaxError("Byl ocekavan prirazovaci operator");
            }

            var assign = new ADVariableAssignment()
            {
                Dereference = dereference, STRecord = record, AssignOperator = asgnOperator.Type
            };

            bool nextDereference = false;

            if (MainFSM.PeekNextToken().Type == TokenType.starType)
            {
                nextDereference = true;
                MainFSM.GetNextToken();
            }

            if (MainFSM.PeekNextToken().Type == TokenType.idType)
            {
                if (IsAssignOperator(MainFSM.PeekNextToken(2).Type))
                {
                    assign.Expression = IDAssign(nextDereference);
                }
                else
                {
                    assign.Expression = PrecedenceSyntaxAnalysis.Precedence(TokenType.semiType);
                }
            }
            else
            {
                assign.Expression = PrecedenceSyntaxAnalysis.Precedence(TokenType.semiType);
            }

            return(assign);
        }
        public void ComputeIndexes()
        {
            MainFSM.GetNextToken();
            var newIndex = PrecedenceSyntaxAnalysis.Precedence(TokenType.rightABType);

            MainFSM.GetNextToken();

            Indexes.Add(newIndex);

            if (MainFSM.PeekNextToken().Type == TokenType.leftABType)
            {
                ComputeIndexes();
            }
        }
        public static void global_array_item(ADVariable variable)
        {
            // Pokud neni promenna klasifikovana jako pole, vytvorim z nej pole
            if (variable.ArrayDimensions.Count == 0)
            {
                variable.ArrayDimensions.Add(new ADArrayDimension());
                variable.Type = ADVariable.VarType.array;
            }

            var expression = PrecedenceSyntaxAnalysis.Precedence(TokenType.rightCBType);

            variable.ArrayDimensions[0].Values.Add(expression);

            next_global_array_item(variable);
        }
        public static IADNode Return()
        {
            if (MainFSM.GetNextToken().Type != TokenType.returnType)
            {
                ParserFunctions.SyntaxError("Bylo ocekavano klicove slovo \'return\'");
            }

            var result = PrecedenceSyntaxAnalysis.Precedence(TokenType.semiType);

            if (MainFSM.GetNextToken().Type != TokenType.semiType)
            {
                ParserFunctions.SyntaxError("Byl ocekavan znak \';\'");
            }

            return(new ADReturn {
                Expression = result
            });
        }
Exemple #9
0
        static void Main(string[] args)
        {
            PrecedenceSyntaxAnalysis.LoadPrecTable();

            string input      = string.Empty;
            string sourceCode = string.Empty;

            while ((input = Console.ReadLine()) != null)
            {
                sourceCode += input + Environment.NewLine;
            }

            MainFSM.SourceCode = sourceCode;
            MainFSM.Index      = 0;
            MainFSM.RowCounter = 0;

            var adTree = new ADTree();

            ParserFunctions.prog(adTree);

            AssemblyCompiler.Compile(adTree);
        }
        public static void ArrayValuesDeclaration(ADVariable array, int dimensionIndex)
        {
            if (array.ArrayDimensions.Count > 0 && array.ArrayDimensions.Count < (dimensionIndex + 1))
            {
                ParserFunctions.SemanticError("Dane pole nema tolik dimenzi.");
            }

            array.Type = ADVariable.VarType.array;

            if (MainFSM.GetNextToken().Type == TokenType.leftCBType)
            {
                while (MainFSM.PeekNextToken().Type != TokenType.rightCBType)
                {
                    array.ArrayDimensions[dimensionIndex].Values.Add
                    (
                        PrecedenceSyntaxAnalysis.Precedence(TokenType.rightCBType)
                    );

                    if (MainFSM.PeekNextToken().Type == TokenType.comType)
                    {
                        MainFSM.GetNextToken();
                    }
                }

                if (MainFSM.GetNextToken().Type != TokenType.rightCBType)
                {
                    ParserFunctions.SyntaxError("Byl ocekavan znak \'}\'");
                }

                if (MainFSM.PeekNextToken().Type == TokenType.comType)
                {
                    ArrayValuesDeclaration(array, dimensionIndex++);
                }
            }
            else
            {
                ParserFunctions.SyntaxError("Byl ocekavan znak \'{\'");
            }
        }
Exemple #11
0
        public static IADExpression value()
        {
            var token = MainFSM.PeekNextToken();

            if (token.Type == TokenType.idType)
            {
                if (MainFSM.PeekNextToken(2).Type == TokenType.leftRBType)
                {
                    return(fce_call());
                }
                else
                {
                    var symbol = STSearch(MainFSM.PeekNextToken().Attribute);
                    if (symbol == null)
                    {
                        SemanticError($"Promenna {token.Attribute} nebyla deklarovana.");
                    }

                    return(new ADVariable()
                    {
                        Name = symbol.Name, STRecord = symbol
                    });
                }
            }
            else
            {
                if (token.Type == TokenType.decNumberType ||
                    token.Type == TokenType.hexNumberType ||
                    token.Type == TokenType.octNumberType)
                {
                    return(PrecedenceSyntaxAnalysis.Precedence(TokenType.rightABType));
                }
            }

            return(null);
        }
        public static IADNode statement()
        {
            var     nextToken = MainFSM.PeekNextToken();
            IADNode result    = null;

            switch (nextToken.Type)
            {
            case TokenType.longType:
                var list = new ADVariableDeclarations();
                StatementHelpers.VariableDeclaration(ref list);

                list.Variables.Reverse();
                result = list;
                break;

            case TokenType.starType:
                result = new ADStatementExpression {
                    Expression = PrecedenceSyntaxAnalysis.Precedence(TokenType.semiType)
                };

                if (MainFSM.GetNextToken().Type != TokenType.semiType)
                {
                    SyntaxError("Byl ocekavan znak \';\'");
                }

                break;

            case TokenType.idType:
            case TokenType.incrType:
            case TokenType.decrType:
                if (MainFSM.PeekNextToken(2).Type == TokenType.leftRBType)
                {
                    var fceToken = MainFSM.GetNextToken();

                    result = fce_call(fceToken.Attribute);

                    if (MainFSM.GetNextToken().Type != TokenType.semiType)
                    {
                        SyntaxError("Byl ocekavan znak \';\'");
                    }
                }
                else
                {
                    result = new ADStatementExpression {
                        Expression = PrecedenceSyntaxAnalysis.Precedence(TokenType.semiType)
                    };

                    if (MainFSM.GetNextToken().Type != TokenType.semiType)
                    {
                        SyntaxError("Byl ocekavan znak \';\'");
                    }
                }
                break;

            case TokenType.ifType:
                result = StatementHelpers.Condition();
                break;

            case TokenType.forType:
                result = StatementHelpers.ForLoop();
                break;

            case TokenType.whileType:
                result = StatementHelpers.WhileLoop();
                break;

            case TokenType.doType:
                result = StatementHelpers.DoWhileLoop();
                break;

            case TokenType.returnType:
                result = StatementHelpers.Return();
                break;

            case TokenType.breakType:
                result = StatementHelpers.Break();
                break;

            case TokenType.continueType:
                result = StatementHelpers.Continue();
                break;

            case TokenType.leftCBType:
                result = StatementHelpers.InnerStatements();
                break;

            default:
                SyntaxError("Byl ocekavan jeden z nasledujici klicovych slov nebo znaku: long, *, identifikator, if, for, while, do, return, break, continue");
                break;
            }
            return(result);
        }
        public static void VariableDeclaration(ref ADVariableDeclarations list, bool recursive = false)
        {
            if (!recursive)
            {
                if (MainFSM.GetNextToken().Type != TokenType.longType)
                {
                    ParserFunctions.SyntaxError("Bylo ocekavano klicove slovo \'long\'");
                }
            }

            var token = MainFSM.GetNextToken();

            if (token.Type != TokenType.idType)
            {
                ParserFunctions.SyntaxError("Byl ocekavan identifikator");
            }

            if (ParserFunctions.STSearch(token.Attribute, true) != null)
            {
                ParserFunctions.SemanticError($"Promenna {token.Attribute} byla j*z deklarovana");
            }

            var newRecord = new STRecord()
            {
                Name   = token.Attribute,
                Access = STAccess.local
            };

            ParserFunctions.STablesStack.Peek().Records.Add(newRecord);

            var variableDeclaration = new ADVariable()
            {
                Name     = token.Attribute,
                STRecord = newRecord,
                Type     = ADVariable.VarType.variable
            };

            ParserFunctions.decl_type(variableDeclaration);


            if (MainFSM.PeekNextToken().Type == TokenType.comType)
            {
                MainFSM.GetNextToken();
                VariableDeclaration(ref list, true);
            }

            if (MainFSM.PeekNextToken().Type == TokenType.semiType)
            {
                list.Variables.Add(variableDeclaration);

                if (!recursive)
                {
                    MainFSM.GetNextToken();
                }
                return;
            }

            if (MainFSM.GetNextToken().Type != TokenType.asgnType)
            {
                ParserFunctions.SyntaxError("Byl ocekavan znak \';\' nebo \'=\'");
            }

            if (MainFSM.PeekNextToken().Type == TokenType.leftCBType)
            {
                variableDeclaration.STRecord.Type = STType.array;

                if (variableDeclaration.ArrayDimensions.Count == 0)
                {
                    variableDeclaration.ArrayDimensions.Add(new ADArrayDimension());
                }
                ArrayValuesDeclaration(variableDeclaration, 0);
            }
            else
            {
                variableDeclaration.STRecord.Type = STType.variable;

                variableDeclaration.Value = PrecedenceSyntaxAnalysis.Precedence(TokenType.semiType, true);
            }

            if (MainFSM.PeekNextToken().Type == TokenType.comType)
            {
                MainFSM.GetNextToken();
                VariableDeclaration(ref list, true);
            }

            if (!recursive)
            {
                if (MainFSM.GetNextToken().Type != TokenType.semiType)
                {
                    ParserFunctions.SyntaxError("Byl ocekavan znak \';\'");
                }
            }

            list.Variables.Add(variableDeclaration);
        }