Пример #1
0
        private static void Command(ListController <TokenModel> lc)
        {
            if (lc.TryGetNext(out var first))
            {
                if (Keywords.Types.Contains(first.Text))
                {
                    var    varType = first.Text;
                    string varName = Variable(lc);
                    VarTable.Add(varName, varType);
                }
                else if (VarTable.Contains(first.Text))
                {
                    if (!lc.TryGetNext(out var eq))
                    {
                        throw new ParseException("= expected", lc.GetPrevious(), true);
                    }

                    if (eq.Text != "=")
                    {
                        throw new ParseException("= expected", lc.GetPrevious(), true);
                    }
                    AssingNode asNode = new AssingNode();
                    asNode.Left = new VarNode()
                    {
                        Variable = VarTable.Get(first.Text),
                    };


                    if (!lc.TryGetNext(out var next))
                    {
                        throw new ParseException("Function or expression expected", lc.GetPrevious(), true);
                    }

                    if (FuncTable.Contains(next.Text))
                    {
                        lc.SetBack();
                        asNode.Right = Func(lc);
                    }
                    else if (VarTable.Contains(next.Text) || next.Text.All(c => Constants.Numbers.Contains(c)))
                    {
                        lc.SetBack();
                        //todo arithmetic
                        throw new NotImplementedException("Arithmetic don't included, for now");
                    }
                    else
                    {
                        throw new ParseException("Function or expression expected", lc.GetPrevious(), true);
                    }
                }
            }
        }
Пример #2
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);
        }