Ejemplo n.º 1
0
        public override void EnterAssignmentExpression(LittleBigCParser.AssignmentExpressionContext context)
        {
            if (context.postfixExpression() != null)
            {
                var ident = context.postfixExpression().primaryExpression().Identifier();
                var variableName = ident.GetText();
                VariableDefinition variableDef;

                var error = new StringBuilder();

                variableDef = _currentScope.GetVariableDefinition(variableName);

                if (variableDef == null)
                {
                    variableDef = _semantic.GlobalScope.GetVariableDefinition(variableName);
                }

                if (variableDef == null)
                {
                    var parameterDef = _currentScope.GetParameterDefinition(variableName);

                    if (parameterDef == null)
                    {
                        error.Append(String.Format("[{0}:{1}] Semantic error: ", ident.Symbol.Line, ident.Symbol.StartIndex));
                        error.Append(String.Format("Variable {0} undefined.", variableName));

                        Errors.Add(error.ToString());
                    }
                    else
                    {
                        error.Append(String.Format("[{0}:{1}] Semantic error: ", ident.Symbol.Line, ident.Symbol.StartIndex));
                        error.Append(String.Format("Value can't be assigned to parameter {0}.", variableName));

                        Errors.Add(error.ToString());
                    }
                }
                else
                {
                    var listener = new TypeCheckListener(_semantic, _currentScope);

                    ParseTreeWalker.Default.Walk(listener, context);

                    _errors.AddRange(listener.Errors);
                }
            }
        }
Ejemplo n.º 2
0
        public override void EnterVariableDeclaration(LittleBigCParser.VariableDeclarationContext context)
        {
            var listener = new TypeCheckListener(_semantic, _currentScope);

            ParseTreeWalker.Default.Walk(listener, context);

            _errors.AddRange(listener.Errors);
        }