Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
 public void Fail(string msg, ExprBuilderObj expr)
 => throw new CompilationException($"{msg} at ({expr.FirstToken.Row},{expr.FirstToken.Column}): {expr.FirstToken.Content}");
Beispiel #4
0
 public Expr Analyze(ExprBuilderObj builder) => Analyze(builder, null);