private static List <string> ParseFuncArgs(CalcEnvironment env) { List <string> args = new List <string>(); int brc = 0; string arg = ""; char c; while (env.Length != 0) { env.NextChar(); c = env.Char; if (c == ')') { --brc; if (brc == -1) { env.NextChar(); break; } } else if (c == '(') { ++brc; } else if (c == ',') { if (arg != "") { args.Add(arg); arg = ""; } else { throw new ParseException(env.i, "Empty argument"); } } if (c != ',') { arg += c; } } if (brc != -1) { throw new ParseException(env.i, env.Char, "Missing function closing bracket"); } if (arg != "") { args.Add(arg); } else if (args.Count > 0) { throw new ParseException(env.i, "Empty argument"); } return(args); }
private static void ParseConstOrFunc(CalcEnvironment env, int sign) { bool isFunc = false; List <string> args = null; string str = ""; char c; do { c = env.Char; if (char.IsLetter(c) || c == '_') { str += c; } else if (c == '(') { isFunc = true; args = ParseFuncArgs(env); break; } else { break; } env.NextChar(); } while (env.Length != 0); if (isFunc) { env.nodes.AddLast(new FuncNode(str, args.ToArray(), sign)); } else { env.nodes.AddLast(new ConstNode(str, sign)); } }
private static void ParseOpenBrackets(CalcEnvironment env, ref bool firstValue) { char c; wasOpenBrc = false; sign = 1; do { c = env.Char; if (c == '(') { wasOpenBrc = true; ++env.brc; } else if (c == '-') { if (wasOpenBrc || firstValue) { sign *= -1; wasOpenBrc = false; firstValue = false; } else { throw new ParseException(env.i, "Bad minus"); } } else { break; } env.NextChar(); } while (env.Length != 0); }
private static void ParseOperation(CalcEnvironment env) { LinkedListNode <Node> op; if ("^%*/+-".Contains(env.Char)) { op = env.nodes.AddLast(new OperationNode(env.Char, env.brc)); env.AddOpInQueue(op); } else { throw new ParseException(env.i, env.Char, "Operation expected"); } env.NextChar(); }
private static void ParseCloseBrackets(CalcEnvironment env) { char c; while (env.Length != 0) { c = env.Char; if (c == ')') { --env.brc; env.NextChar(); } else { break; } } }
private static void ParseNumber(CalcEnvironment env, int sign) { var wasDigit = false; var wasDot = false; string str = ""; double numb = 0.0; char c; do { c = env.Char; if (c == '.') { if (wasDigit && !wasDot) { str += '.'; wasDot = true; } else { throw new ParseException(env.i, "Bad dot"); } } else if (char.IsDigit(c)) { str += c; wasDigit = true; } else { break; } env.NextChar(); } while (env.Length != 0); if (!double.TryParse(str, numberStyles, provider, out numb)) { throw new ParseException(env.i, $"Bad number '{str}'"); } env.nodes.AddLast(new NumberNode(numb * sign)); }