Пример #1
0
        //TODO TESTS
        private static FunctionNode FuncExecute(ListController <TokenModel> lc)
        {
            var name = lc.GetNext();

            CheckEqual(TryGetNext(lc, "( expected"), "(", "( expected");
            var funcs = (List <FuncModel>)FuncTable.Funcs.Where(model => model.Name == name.Text);
            var args  = new List <VarModel>();

            var flag      = true;
            var checkNext = TryGetNext(lc, ") or variable expected");

            if (checkNext.Text == ")")
            {
                flag = false;
                lc.SetBack();
            }

            while (flag)
            {
                var next = TryGetNext(lc, ") or variable expected");

                if (VarTable.Contains(next.Text))
                {
                    args.Add(VarTable.Get(next.Text));
                    var afterVar = TryGetNext(lc, ") or , expected");
                    if (afterVar.Text == ",")
                    {
                        continue;
                    }

                    if (next.Text == ")")
                    {
                        lc.SetBack();
                        break;
                    }
                }

                throw new ParseException($"Unexpected token {next.Text}", next);
            }

            var closingNest  = lc.GetNext();
            var suitableFunc = funcs.FirstOrDefault(model => model.ArgsType.Count == args.Count);

            if (suitableFunc == null)
            {
                throw new ParseException($"Cannot invoke function {name.Text} with {args.Count} arguments", name);
            }

            return(new FunctionNode {
                FuncName = suitableFunc, Args = args
            });
        }
Пример #2
0
        //TODO TESTS
        private static void Command(ListController <TokenModel> lc)
        {
            var beg = lc.GetNext();

            if (TypesTools.IsType(beg.Text))
            {
                lc.SetBack();
                Initialization(lc);
            }
            else if (VarTable.Contains(beg.Text))
            {
                lc.SetBack();
                var node = VariableAssign(lc);
                Commands.Add(node);
            }
            else if (FuncTable.Contains(beg.Text))
            {
                lc.SetBack();
                var node = FuncExecute(lc);
                Commands.Add(node);
            }
            else
            {
                throw new ParseException($"Cannot resolve '{beg.Text}'", beg);
            }

            //todo lately var = Arithmetic Expression
            //todo more lately type func
        }
Пример #3
0
        //TODO TESTS
        private static void Initialization(ListController <TokenModel> lc)
        {
            var type = lc.GetNext();
            var name = TryGetNext(lc, "Variable name expected");

            if (!Constants.Alphabet.Contains(name.Text[0]))
            {
                throw new ParseException("Unexpected token", name);
            }

            if (VarTable.Contains(name.Text) || FuncTable.Contains(name.Text))
            {
                throw new ParseException("Member with the same name is already declared", name);
            }

            VarTable.Add(name.Text, type.Text);
        }
Пример #4
0
        //TODO TESTS
        private static AssingNode VariableAssign(ListController <TokenModel> lc)
        {
            var variableToken = lc.GetNext();

            CheckEqual(TryGetNext(lc, "= expected"), "=", "= expected");
            var func     = TryGetNext(lc, "Expression expected");
            var res      = new AssingNode();
            var variable = VarTable.Get(variableToken.Text);

            res.Left = variable;
            if (FuncTable.Contains(func.Text))
            {
                lc.SetBack();
                var fn = FuncExecute(lc);
                res.Right = fn;
            }
            else
            {
                throw new ParseException("Function expected", func);
            }

            return(res);
        }