private Expression matchDesignator(DesignatorType designatorType) {
		dispatchEvent(ParserEvent.BEGAN_PARSING_NON_TERMINAL_SYMBOL, "Designator");

		SyntacticValidator.getInstance().matchNextToken(ProductionRule.REQUIRED, Token.Type.IDENTIFIER);
		SemanticValidator.getInstance().validateDeclarationIsNotAType(SemanticValidator.getInstance().validateDeclarationWasPreviouslyDeclared(TokenIterator.getInstance().getCurrent()));
		Declaration declaration = ScopeManager.getInstance().getCurrentScope().find(TokenIterator.getInstance().getCurrent().getValue().toString());
		SemanticValidator.getInstance().validateDesignatorIdentifier(declaration, designatorType);

		Expression expression = new InvalidExpression();

		if (declaration instanceof Variable) {
			Variable variable = (Variable) declaration;
			if (declaration instanceof Parameter) {
				Parameter parameter = (Parameter) declaration;
				return new parser.semanticAnalysis.abstractSyntaxTree.expressions.locations.Variable(parameter, parameter.getType());
			}
			Location location = matchSelector(variable);
			if (location == null) {
				if (designatorType == DesignatorType.READ) {
					SemanticValidator.getInstance().validateDeclarationIsAVariableWhoseTypeIsInteger(variable);
				}
				expression = new parser.semanticAnalysis.abstractSyntaxTree.expressions.locations.Variable(variable, variable.getType());
			} else {
				if (designatorType == DesignatorType.READ) {
					SemanticValidator.getInstance().validateDeclarationIsAVariableWhoseTypeIsInteger(location);
				}
				expression = location;
			}
		} else if (declaration instanceof Constant && designatorType == DesignatorType.FACTOR) {
			return new Number(new Constant(((Constant) declaration).getValue()));
		} else {
			matchSelector(new InvalidVariable());// TODO ELSE (DISABLED)
		}

		dispatchEvent(ParserEvent.FINISHED_PARSING_NON_TERMINAL_SYMBOL, "Designator");
		return expression;
	}