コード例 #1
0
ファイル: Utils.cs プロジェクト: Ogochi/LatteCompiler
        public static Expr ExprFromExprContext(LatteParser.ExprContext context)
        {
            if (context == null)
            {
                return(null);
            }

            return(context switch
            {
                LatteParser.EAddOpContext eAddOpContext => new AddOp(eAddOpContext),
                LatteParser.EAndContext eAndContext => new And(eAndContext),
                LatteParser.EFalseContext eFalseContext => new Bool(eFalseContext),
                LatteParser.EFunCallContext eFunCallContext => new FunCall(eFunCallContext),
                LatteParser.EIdContext eIdContext => new ID(eIdContext),
                LatteParser.EIntContext eIntContext => new Int(eIntContext),
                LatteParser.EMethodCallContext eMethodCallContext => new MethodCall(eMethodCallContext),
                LatteParser.EMulOpContext eMulOpContext => new MulOp(eMulOpContext),
                LatteParser.ENewObjectContext eNewObjectContext => new NewObject(eNewObjectContext),
                LatteParser.ENullContext _ => new Null(),
                LatteParser.ENullCastContext _ => new Null(),
                LatteParser.EObjectFieldContext eObjectFieldContext => new ObjectField(eObjectFieldContext),
                LatteParser.EOrContext eOrContext => new Or(eOrContext),
                LatteParser.EParenContext eParenContext => ExprFromExprContext(eParenContext.expr()),
                LatteParser.ERelOpContext eRelOpContext => new RelOp(eRelOpContext),
                LatteParser.EStrContext eStrContext => new Str(eStrContext),
                LatteParser.ETrueContext eTrueContext => new Bool(eTrueContext),
                LatteParser.EUnOpContext eUnOpContext => new UnOp(eUnOpContext),
                _ => throw new ArgumentOutOfRangeException(nameof(context))
            });
コード例 #2
0
        public override LatteParser.TypeContext VisitEMethodCall(LatteParser.EMethodCallContext context)
        {
            var exprType = Visit(context.expr()[0]);
            var classDef = _environment.NameToClassDef[exprType.GetText()];
            var methodId = context.ID().GetText();

            if (!ClassHasMethod(classDef, methodId, out var method))
            {
                Utils.StateUtils.InterruptWithMessage(
                    context.start.Line,
                    ErrorMessages.MethodNotDefined(classDef.Id, methodId));
            }

            ValidateFunctionCall(method, methodId, context.expr().ToList().Skip(1).ToArray(), context.start.Line);
            return(method.Type);
        }
コード例 #3
0
 public MethodCall(LatteParser.EMethodCallContext context)
 {
     Id     = context.ID().GetText();
     IdExpr = Utils.ExprFromExprContext(context.expr()[0]);
     context.expr().ToList().Skip(1).ToList().ForEach(expr => Exprs.Add(Utils.ExprFromExprContext(expr)));
 }