コード例 #1
0
        private void CheckClassDef(LatteParser.ClassDefContext classDef)
        {
            var fieldMethod = new HashSet <string>();

            classDef.fieldOrMethodDef().ToList().ForEach(fm =>
            {
                switch (fm)
                {
                case LatteParser.ClassFieldDefContext field:
                    field.fieldDef().ID().ToList().ForEach(f =>
                    {
                        if (fieldMethod.Contains(f.GetText()))
                        {
                            _errorState.AddErrorMessage(
                                new ErrorMessage(fm.start.Line,
                                                 ErrorMessages.FieldOrMethodAlreadyDefined(f.GetText())));
                        }
                        else
                        {
                            fieldMethod.Add(field.GetText());
                        }
                    });
                    break;

                case LatteParser.ClassMethodDefContext method:
                    var methodId = method.methodDef().ID().GetText();
                    if (fieldMethod.Contains(methodId))
                    {
                        _errorState.AddErrorMessage(
                            new ErrorMessage(fm.start.Line,
                                             ErrorMessages.FieldOrMethodAlreadyDefined(methodId)));
                    }
                    else
                    {
                        fieldMethod.Add(method.methodDef().ID().GetText());
                    }
                    break;
                }
            });
        }
コード例 #2
0
        public override void EnterClassDef(LatteParser.ClassDefContext context)
        {
            _environment.DetachVarEnv();
            _environment.DetachFuncEnv();
            _environment.CurrentClassName = context.ID()[0].GetText();

            foreach (var fm in context.fieldOrMethodDef())
            {
                switch (fm)
                {
                case LatteParser.ClassFieldDefContext fields:
                    fields.fieldDef().ID().ToList().ForEach(field =>
                                                            _environment.NameToVarDef[field.GetText()] = new VarDef(fields.fieldDef().type(), field.GetText()));
                    break;

                case LatteParser.ClassMethodDefContext method:
                    _environment.NameToFunctionDef[method.methodDef().ID().GetText()] =
                        new FunctionDef(method.methodDef());
                    break;
                }
            }
        }
コード例 #3
0
        public override void EnterProgram(LatteParser.ProgramContext context)
        {
            _environment.AddPredefinedFunctions();

            context.topDef().ToList().ForEach(topDef =>
            {
                var id = topDef switch
                {
                    LatteParser.FunctionDefContext fDef => fDef.ID().GetText(),
                    LatteParser.ClassDefContext cDef => cDef.ID()[0].GetText()
                };

                if (_environment.NameToFunctionDef.ContainsKey(id) || _environment.NameToClassDef.ContainsKey(id))
                {
                    _errorState.AddErrorMessage(new ErrorMessage(
                                                    topDef.start.Line,
                                                    ErrorMessages.FuncOrClassAlreadyDefined(id)));
                }

                if (topDef is LatteParser.ClassDefContext classDef)
                {
                    CheckClassDef(classDef);
                }

                FrontendEnvironment.Instance.AddTopDef(topDef);
            });

            _environment.NameToClassDef.Values.ToList().ForEach(classDef =>
            {
                if (classDef.ParentId != null && !_environment.NameToClassDef.ContainsKey(classDef.ParentId))
                {
                    _errorState.AddErrorMessage(
                        new ErrorMessage(ErrorMessages.ParentNorDefinedException(classDef.Id, classDef.ParentId)));
                }
            });
        }
コード例 #4
0
 public override void ExitClassDef(LatteParser.ClassDefContext context)
 {
     _environment.RestorePreviousVarEnv();
     _environment.RestorePreviousFuncEnv();
     _environment.CurrentClassName = null;
 }