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); } } }
public override void EnterVariableDeclaration(LittleBigCParser.VariableDeclarationContext context) { var listener = new TypeCheckListener(_semantic, _currentScope); ParseTreeWalker.Default.Walk(listener, context); _errors.AddRange(listener.Errors); }