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);
        }
Esempio n. 2
0
        public static void PrintVariableAssignment(ADVariableAssignment asgn, string tab)
        {
            Console.WriteLine($"{tab}|- Assign:");

            if (asgn.STRecord != null)
            {
                Console.WriteLine($"{tab}|\tName: {asgn.STRecord.Name}");
            }


            Console.WriteLine($"{tab}|\tOperator: {asgn.AssignOperator}");

            if (asgn.Expression != null)
            {
                Console.WriteLine($"{tab}|\tExpression:");
                PrintExpression(asgn.Expression, tab + "\t\t");
            }

            if (asgn.Dereference)
            {
                Console.WriteLine($"{tab}|\tType: Dereference");
            }
        }