static Expression ParseRelational(Token[] toks, ref int p) { var end = toks.Length; var e = ParseAdditive (toks, ref p); if (p < end && (toks[p].Type == TokenType.LessThan || toks[p].Type == TokenType.LessThanOrEqual || toks[p].Type == TokenType.GreaterThan || toks[p].Type == TokenType.GreaterThanOrEqual)) { var op = toks[p].Type; p++; var o = ParseAdditive (toks, ref p); e = new BinOpExpression (op, e, o); } return e; }
static Expression ParseMultiplicative(Token[] toks, ref int p) { var end = toks.Length; var e = ParseUnary (toks, ref p); while (p < end && (toks[p].Type == TokenType.Multiply || toks[p].Type == TokenType.Divide)) { var op = toks[p].Type; p++; var o = ParseUnary (toks, ref p); e = new BinOpExpression (op, e, o); } return e; }
static Expression ParseConditionalOr(Token[] toks, ref int p) { var end = toks.Length; var e = ParseConditionalAnd (toks, ref p); while (p < end && toks[p].Type == TokenType.LogicalOr) { p++; var o = ParseConditionalAnd (toks, ref p); e = new BinOpExpression (TokenType.LogicalOr, e, o); } return e; }
static Expression ParseEquality(Token[] toks, ref int p) { var end = toks.Length; var e = ParseRelational (toks, ref p); if (p < end && (toks[p].Type == TokenType.Equal || toks[p].Type == TokenType.NotEqual)) { var op = toks[p].Type; p++; var o = ParseRelational (toks, ref p); e = new BinOpExpression (op, e, o); } return e; }
static Expression ParseAdditive(Token[] toks, ref int p) { var end = toks.Length; var e = ParseMultiplicative (toks, ref p); while (p < end && (toks[p].Type == TokenType.Add || toks[p].Type == TokenType.Subtract)) { var op = toks[p].Type; p++; var o = ParseMultiplicative (toks, ref p); e = new BinOpExpression (op, e, o); } return e; }