private bool check(char ch) { if (_reader.Peek() == ch) { _reader.Read(); return(true); } return(false); }
/// <summary> /// Parse stream and return the expression tree /// </summary> /// <param name="r">Stream</param> /// <returns>Parsed expression or null if no expression is found on stream</returns> public IOperation Parse(ParsingReader r) { List <IOperation> data = new List <IOperation>(); while (!r.IsEOF) { TokenQueue tokenQueue = new TokenQueue(this, r); var ex = parseSingleStatement(tokenQueue, -1); if (ex == null) { break; } if (data.Count > 0) { data.Add(new Operations.OperationPop()); } data.Add(ex); r.SkipWhiteSpaceAndComments(); if (r.Peek() != ';') { break; } do { r.Read(); r.SkipWhiteSpaceAndComments(); } while (r.Peek() == ';'); } if (data.Count == 0) { return(null); } if (data.Count == 1) { return(data[0]); } return(new Operations.OperationExpression(data.ToArray())); }
/// Parse multi-expression, like ${a|b|=2+3} public IOperation ParseMulti(ParsingReader reader) { Operations.OperationVariableAccess va = new Operations.OperationVariableAccess(); StringBuilder sb = new StringBuilder(); bool orMet = true; int n; while ((n = reader.Peek()) != -1) { var q = (char)n; if (q == '}' || q == ')' || q == ']') { break; } switch (q) { case '|': reader.Read(); va.AddName(sb.ToString()); sb.Length = 0; orMet = true; break; case '\'': case '\"': case '`': orMet = false; if (sb.Length != 0) { reader.ThrowParsingException("Quote must be a first character"); } va.AddValue(reader.ReadQuote()); reader.SkipWhiteSpaceAndComments(); if (reader.Peek() != '}' && reader.Peek() != '|') { reader.ThrowParsingException("Unexpected character '" + (char)reader.Peek() + "'"); } sb.Length = 0; break; case '=': orMet = false; reader.Read(); var v = Parse(reader); if (v != null) { va.AddExpression(v); } else { va.AddValue(null); } break; default: orMet = false; sb.Append(q); reader.Read(); break; } } if (sb.Length > 0 || orMet) { va.AddName(sb.ToString()); } return(va); }