public Expr Analyze(ExprBuilderObj builder, IType expectedType) { if (ExpectedType == expectedType) { return(builder.Build(this)); } var expr = builder.Build(WithExpectedType(expectedType)); if (expectedType != null && !expectedType.AssignableFrom(expr.Type)) { Fail("Unexpected type: " + expr.Type + ", expected: " + expectedType, builder); } return(expr); }
ExprBuilderObj ParseInfix(ExprBuilderObj left, int weight) { var firstToken = reader.Current; if (reader.Current == null) { return(left); } foreach (var analyzer in rules.InfixAnalyzers) { if (weight < analyzer.Weight) { var result = analyzer.Analyze(this, left); if (result != null) { return(ParseInfix(new ExprBuilderObj(result, firstToken), weight)); } } } return(left); }
public void Fail(string msg, ExprBuilderObj expr) => throw new CompilationException($"{msg} at ({expr.FirstToken.Row},{expr.FirstToken.Column}): {expr.FirstToken.Content}");
public Expr Analyze(ExprBuilderObj builder) => Analyze(builder, null);