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); } } } }
//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); }