private void EatBlanks(EOFCharEnumerator fen) { while (char.IsWhiteSpace(fen.Current) && fen.MoveNext()) { ; } }
public DynaFunction(string fdef) { Variables = new List <VarDef> (); var fen = new EOFCharEnumerator(fdef); FunctionName = UntilSeparator(fen, "(", "function"); EatBlanks(fen); if (fen.PeekNext() == ')') // NO ARGUMENTS FUNCTION { fen.MoveNext(); } else { while (fen.Current != ')') { var tmpVarName = UntilSeparator(fen, ":", "variable name"); if (!ExConst.ValidVarName(tmpVarName)) { throw new ExpressionException("Invalid name for variable " + tmpVarName); } var tmpType = UntilSeparator(fen, ",)", "variable type"); if (Enum.TryParse(tmpType.ToUpperInvariant(), out DFDataType tmpDFDataType)) { Variables.Add(new VarDef(tmpVarName, tmpDFDataType)); } else { throw new ExpressionException("Invalid data type for variable " + tmpVarName + ": " + tmpType); } } } EatUntil(fen, ':'); var tmprettype = UntilSeparator(fen, "=", "return type"); if (!Enum.TryParse(tmprettype.ToUpperInvariant(), out DFDataType rettype)) { throw new ExpressionException("Invalid return type: " + tmprettype); } ReturnType = rettype; fen.MoveNext(); if (fen.Current != '>') { throw new ExpressionException("Unexpected character: " + fen.Current); } var exp = new StringBuilder(); while (fen.MoveNext()) { exp.Append(fen.Current); } StringExpression = exp.ToString().Trim(); if (string.IsNullOrEmpty(StringExpression)) { throw new ExpressionException("Empty expression"); } new Expression().Parse(StringExpression); }
private void EatUntil(EOFCharEnumerator fen, char sep) { while (fen.MoveNext() && fen.Current != sep) { if (!char.IsWhiteSpace(fen.Current)) { throw new ExpressionException("Unexpected char: " + fen.Current); } } }
private string UntilSeparator(EOFCharEnumerator f, string sep, string what) { StringBuilder name = new StringBuilder(); while (f.MoveNext() && sep.IndexOf(f.Current) < 0) { name.Append(f.Current); } string ret = name.ToString().Trim(); if (string.IsNullOrEmpty(ret)) { throw new ExpressionException("Invalid syntax: empty " + what + " name"); } foreach (char c in ret) { if (char.IsWhiteSpace(c)) { throw new ExpressionException("Invalid function syntax: unexpected whitespace in " + what + " name"); } } return(ret); }